C言語においてpthreadを用いてクイックソートの高速化を勉強中なのですが、疑問点があるのでどうかご教授お願いします。
高速化するためにいろいろとスレッドを作る場所や、*func_thread()で行う処理などを考えました。初めは再帰関数が呼び出されているところでスレッドを作れば高速化できると考えていました。しかし、結局以下のように最初のquick_sort_pthread()の呼び出しのところでスレッドを作ったら高速化できました。どうして下のようなコードで逐次処理に比べ高速化したのかがわかりません。別のスレッドでただquick_sort_pthread()を動かしているだけに見えます。なぜ高速化したのか、これが最善の高速化なのかが分からなくてもやもやしてます。絶対にこれより良いpthreadを用いた高速化ができると思うのですが。
どうかご教授お願いします。
#include <stdio.h> #include<stdlib.h> #include <unistd.h> #include <omp.h> #include<time.h> #include<sys/time.h> #include<pthread.h> int partition(int[],int,int); void *func_thread(void *p); void quick_sort_pthread(int[],int,int); int *array = NULL; const int data_num = 100000; int left; int right; int pivot; void *func_thread(void *p){ if (left < right) { pivot = partition(array, left, right); quick_sort_pthread(array, left, pivot-1); quick_sort_pthread(array, pivot+1, right); } } void quick_sort_pthread(int array[], int left, int right) { int pivot; if (left < right) { pivot = partition(array, left, right); quick_sort_pthread(array, left, pivot-1); quick_sort_pthread(array, pivot+1, right); } } int partition (int array[], int left, int right) { int i, j, pivot; i = left; j = right + 1; pivot = left; do { do { i++; } while (array[i] < array[pivot]); do { j--; } while (array[pivot] < array[j]); if (i < j) { swap(&array[i], &array[j]); } } while (i < j); swap(&array[pivot], &array[j]); return j; } void Shuffle(int *array, int n) { int i,j,t; srand(1); for (i = 0; i < n; i++) { j = rand() % n; t = array[i]; array[i] = array[j]; array[j] = t; } } int main (void) { int i; struct timeval time_start, time_end,start,end; pthread_t pthread1; pthread_t pthread2; int thread_id1=1; int thread_id2=2; array= (int *)malloc(sizeof(int)*data_num); for(i=0; i<data_num; i++){ array[i]=i; } Shuffle(array, data_num);//配列をシャッフル gettimeofday(&time_start, NULL); pthread_create( &pthread1, NULL, &func_thread, &thread_id1); pthread_create( &pthread2, NULL, &func_thread, &thread_id2); quick_sort_pthread(array,0,data_num); pthread_join(pthread1, NULL); pthread_join(pthread2, NULL); gettimeofday(&time_end, NULL); printf("Serialtime = %.3lf ms\n", ((time_end.tv_sec - time_start.tv_sec) + (time_end.tv_usec - time_start.tv_usec)*1.0E-6)*1000); return 0; }
回答2件
あなたの回答
tips
プレビュー