openMP を使用して、クイックソートを並列に動作させようとしています。openMP の実装後、クイックソートの動作を高速化しようとして失敗し、クイックソートのソート配列がほぼ 2 倍遅くなりました。openMP 実装を使用した私のコード:
void quickSort( int a[], int l, int r) {
int j;
if( l < r ) {
#pragma omp parallel
{
j = partition( a, l, r);
#pragma omp sections
{
#pragma omp section
{
quickSort( a, l, j-1);
}
#pragma omp section
{
quickSort( a, j+1, r);
}
}
}
}
}
全体の並べ替えはメソッド パーティションで行われ、それがどのように機能するか興味がある場合は、ここにコードが表示されます。
int partition( int a[], int l, int r) {
int pivot, i, j, t;
pivot = a[l];
i = l; j = r+1;
while(1) {
do ++i; while( a[i] <= pivot && i <= r );
do --j; while( a[j] > pivot );
if( i >= j ) break;
t = a[i]; a[i] = a[j]; a[j] = t;
}
t = a[l]; a[l] = a[j]; a[j] = t;
return j;
}
QuickSortを呼び出す前にメインで時間を取り、メインでprintfの前にタイマーを停止します。スレッド数は 10 に定義されています (PC で 4、2、および 1 で試しました)。0 から 100 までの 1 000 000 個のランダムな整数でリストをソートした後の結果:
時間 (openMP なし) は 6.48004 ~ 5.32001 の間です
openMP の時間は 11.8309 から 10.6239 の間です (2-4 スレッドの場合)。