使用OpenMP并行化快速排序

时间:2018-05-14 00:11:30

标签: c++ openmp

我正在尝试使用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,我将使用简单的串行算法,如插入排序。

0 个答案:

没有答案