我正在尝试使用OpenMP来并行化快速排序(对于具有不同整数的数组)。我已经有一个工作实现(我测试了多个线程的输出,它似乎工作)。问题是我没有看到任何加速,即使是大型阵列导致我相信我的实现不正确。由于实际实现是正确的,但并行性似乎没有产生所需的加速,我将只显示代码的并行化:
void parallel_randomized_quicksort(vector<int>& A, int start, int end){
if ((end-start) is too small){
run a serial sorting algorithm
}else{
pick a random pivot x and partition A around that pivot.
k = index of x in A
#pragma omp parallel
{
#pragma omp single nowait
{
parallel_randomized_quicksort(A,start,k-1);
}
#pragma omp single nowait
{
parallel_randomized_quicksort(A,k+1,end);
}
}
}
}
如果这是正确的,应该有一些加速,因为左和右分区可以并行递归,这是我的代码的目标。为什么我没注意到加速?
编辑: 执行时间使用以下方法衡量:
double start_time = omp_get_wtime();
parallel_randomized_quicksort(A,0,A.size()-1);
double time = omp_get_wtime() - start_time;
数组是不同的整数。阵列的大小从100到1,000,000不等。较小阵列的时间以毫秒为单位,较大阵列的时间则为几秒。通常,如果数组小于32,我将使用简单的串行算法,如插入排序。