我正在尝试通过使用 openMP 使我的快速排序并行工作。实施 openMP 后,我试图让快速排序更快地工作失败了,我的快速排序数组的排序速度几乎慢了两倍。我的带有 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 之前,我在 main 中花时间,并且在 main 中的 printf 之前停止计时器。线程数量定义为 10(我在我的电脑上尝试过 4,2 和 1)。我在对 0 - 100 之间的 1 000 000 个随机整数的列表进行排序后的结果:
时间(没有 openMP)在 6.48004 - 5.32001 之间
openMP 时间在 11.8309 和 10.6239 之间(有 2-4 个线程) 这怎么可能呢?