]> vgcfreebox.myrthtech.pt Git - ue-pp-sortingalgorith.git/blobdiff - parallel-sorting.c
grooming repo
[ue-pp-sortingalgorith.git] / parallel-sorting.c
index 1b6aff4050b373d1d187c1d35fda8d0583914762..98200b4d51a2def0b69672a90f3040e56a4d7092 100644 (file)
@@ -2,8 +2,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include <omp.h>
+#include <time.h>
 
-// Global variables (simulating shared memory access for simplicity)
+
+// Global variables (simulating shared memory access)
 int* data = NULL;
 size_t data_size = 0;
 
@@ -16,7 +18,7 @@ void merge(int low, int mid, int high) {
     int n1 = mid - low + 1;
     int n2 = high - mid;
 
-    // --- Manual Memory Allocation for Temporary Arrays ---
+    // Manual Memory Allocation for Temporary Arrays
     // We must allocate space for L and R.
     int* L = (int*)malloc(n1 * sizeof(int));
     int* R = (int*)malloc(n2 * sizeof(int));
@@ -57,7 +59,7 @@ void merge(int low, int mid, int high) {
         data[k++] = R[j++];
     }
 
-    // --- Crucial Step: Manual Memory Cleanup ---
+    // Manual Memory Cleanup
     free(L);
     free(R);
 }
@@ -69,8 +71,7 @@ void parallel_merge_sort(int low, int high) {
     if (low < high) {
         int mid = low + (high - low) / 2;
 
-        // Use OpenMP sections to parallelize the recursive calls
-        // The OpenMP runtime handles the threads assignment and synchronization.
+        // Use OpenMP sections to parallelize the recursive calls, runtime handles the threads assignment and synchronization.
         #pragma omp parallel sections
         {
             #pragma omp section
@@ -156,7 +157,7 @@ int write_file(const char* filename) {
 
 
 int main(int argc, char *argv[]) {
-    // --- 1. Handle Command Line Arguments ---
+    // Handle Command Line Arguments
     int thread_count = -1;
     char *input_file = NULL;
     char *output_file = NULL;
@@ -179,12 +180,12 @@ int main(int argc, char *argv[]) {
         return EXIT_FAILURE;
     }
 
-    // --- 2. Setup OpenMP Threads ---
+    // Setup OpenMP Threads ---
     omp_set_num_threads(thread_count);
     printf("--- Starting Sort Process ---\n");
     printf("Threads allocated by OpenMP: %d\n", omp_get_max_threads());
 
-    // --- 3. Read Data ---
+    //  Read Data
     if (!read_file(input_file)) {
         fprintf(stderr, "Failed to read data.\n");
         // Clean up data memory before exit
@@ -193,22 +194,32 @@ int main(int argc, char *argv[]) {
     }
     printf("Successfully read %zu elements from %s\n", data_size, input_file);
 
-    // --- 4. Sort Data ---
+    // ------------------------------- WALL CLOCK TIME ------------------------------------
+    struct timespec start_sort_time;
+    clock_gettime(CLOCK_MONOTONIC, &start_sort_time);
     if (data_size > 0) {
         // Execute the parallel sort
         parallel_merge_sort(0, data_size - 1);
         printf("Sorting completed successfully.\n");
     }
+    struct timespec end_sort_time;
+    clock_gettime(CLOCK_MONOTONIC, &end_sort_time);
+    
+    // determine actual wall clock time
+    double elapsed_time = (end_sort_time.tv_sec - start_sort_time.tv_sec);
+    elapsed_time += (end_sort_time.tv_nsec - start_sort_time.tv_nsec) / 1e9;
+    // ------------------------------- END WALL CLOCK TIME ---------------------------------
 
-    // --- 5. Write Results ---
+    
     if (!write_file(output_file)) {
         fprintf(stderr, "Failed to write output data.\n");
         free(data);
         return EXIT_FAILURE;
     }
     printf("Sorted data written successfully to %s\n", output_file);
+    printf("Total Elapsed Wall-Clock Time: %lf seconds\n", elapsed_time);
 
-    // --- 6. Cleanup ---
+    // Cleanup
     free(data);
     return EXIT_SUCCESS;
 }