]> vgcfreebox.myrthtech.pt Git - ue-pp-squarematrixparallelisation.git/blobdiff - ParallelMatrixSearch.c
little help from gemini :)
[ue-pp-squarematrixparallelisation.git] / ParallelMatrixSearch.c
index 538af2481c9a069629d067ec0a02485210e5282d..f56fa2e0a0f9cb39d1bb1db09a98ee78b8b17bb5 100644 (file)
@@ -27,6 +27,54 @@ void* parallel_search_cols(void *arg){
   return NULL;
 }
 
+// Function to dynamically create threads and divide columns
+void run_parallel_search(int num_threads) {
+    // 1. Dynamically allocate arrays for threads and their arguments
+    pthread_t *threads = malloc(num_threads * sizeof(pthread_t));
+    thread_args *args = malloc(num_threads * sizeof(thread_args));
+
+    if (threads == NULL || args == NULL) {
+        perror("Failed to allocate memory for threads");
+        exit(1);
+    }
+
+    // 2. Calculate the base number of columns each thread will process
+    int chunk_size = m_cols / num_threads;
+
+    // 3. Create the threads in a loop
+    for (int i = 0; i < num_threads; i++) {
+        args[i].start = i * chunk_size;
+        
+        // If it is the last thread, let it process all remaining columns
+        if (i == num_threads - 1) {
+            args[i].end = m_cols;
+        } else {
+            args[i].end = (i + 1) * chunk_size;
+        }
+
+        // Pass the address of the specific struct for this thread
+        if (pthread_create(&threads[i], NULL, &parallel_search_cols, &args[i]) != 0) {
+            perror("Failed to create thread");
+            exit(1);
+        }
+    }
+
+    // 4. Wait for all threads to finish
+    for (int i = 0; i < num_threads; i++) {
+        pthread_join(threads[i], NULL);
+    }
+
+    // 5. Clean up the dynamically allocated arrays
+    free(threads);
+    // Note: Do not free(args) here IF your thread function (parallel_search_cols) 
+    // is already calling free(arg) internally! 
+    // Since your original thread function calls free(args), calling it here 
+    // would cause a "double free" crash. 
+    // However, since we allocated it as one big array, it is better to remove 
+    // free(args) from your thread function and do it here:
+    free(args); 
+}
+
 int main(void){
   printf("1st --> Allocate memory\n");
   clock_t t_t1; t_t1 = clock();
@@ -63,29 +111,8 @@ int main(void){
   
   printf("3rd --> Search matrix\n");
   clock_t t_t3; t_t3 = clock();
-  
-  pthread_t t1;
-  thread_args *args = malloc(sizeof(thread_args));
-  args->start = 0;
-  args->end = abs(m_cols/3);
-  pthread_create(&t1,NULL,&parallel_search_cols,args);
-  
-  pthread_t t2;
-  thread_args *args2 = malloc(sizeof(thread_args));
-  args2->start = abs(m_cols/3);
-  args2->end = m_cols-(m_cols/3);
-  pthread_create(&t2,NULL,&parallel_search_cols,args2);  
-  
-  pthread_t t3;
-  thread_args *args3 = malloc(sizeof(thread_args));
-  args3->start = m_cols-abs((m_cols/3));
-  args3->end = m_cols;
-  pthread_create(&t3,NULL,&parallel_search_cols,args3);
-
-  pthread_join(t1,NULL);
-  pthread_join(t2,NULL);
-  pthread_join(t3,NULL);
-
+  int threads_to_use = 4;
+  run_parallel_search(threads_to_use);
   t_t3 = clock() - t_t3;
   double t3_ttaken = ((double)t_t3)/CLOCKS_PER_SEC;
   printf(" %f sec\n",t3_ttaken);