From: VGoncalo Date: Fri, 13 Mar 2026 01:14:00 +0000 (+0000) Subject: little help from gemini :) X-Git-Url: https://vgcfreebox.myrthtech.pt/gitweb/ue-pp-squarematrixparallelisation.git/commitdiff_plain/b52cdfd688d05c7b04d99c3e802cb4d261b41351?ds=inline;hp=da7e4dbdc340ca49d79eed18f1309a0ec27642ef little help from gemini :) --- diff --git a/ParallelMatrixSearch.c b/ParallelMatrixSearch.c index 538af24..f56fa2e 100644 --- a/ParallelMatrixSearch.c +++ b/ParallelMatrixSearch.c @@ -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, ¶llel_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,¶llel_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,¶llel_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,¶llel_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);