并行递归Bitonic排序比串行(OpenMP)慢

时间:2017-10-30 22:57:31

标签: c parallel-processing openmp

我的OpenMP(C)并行代码比串行的bitonic排序代码慢,虽然我已经完成了所有可能的组合,但我无法找到问题。

以下是代码的一部分:

void recBitonicSortOpenMP( int lo, int cnt, int dir ) {
   if (  cnt >  1 ) {
         int k = cnt / 2;
         #pragma omp parallel sections 
         {

         #pragma omp section 
         recBitonicSortOpenMP( lo,     k, ASCENDING );

         #pragma omp section    
         recBitonicSortOpenMP( lo + k, k, DESCENDING );

         }
         bitonicMergeOpenMP( lo, cnt, dir );

   }

}

这是Bitonic Sort的实现。

2 个答案:

答案 0 :(得分:2)

对于像这样的递归问题,请使用OpenMP任务,而不是嵌套并行和部分。 http://cs.umw.edu/~finlayson/class/fall16/cpsc425/notes/24-sorting.html为您提供了一个很好的例子......

答案 1 :(得分:0)

您应该尝试并行化算法的命令式版本。我认为递归版本是一个固有的连续问题。

有许多pragma可用于并行化" For"周期。

http://www.openmp.org/specifications/

算法的两个版本:

https://www.cs.duke.edu/courses/fall08/cps196.1/Pthreads/bitonic.c