Parallel processing 如何:使用OpenMP进行双音排序

Parallel processing 如何:使用OpenMP进行双音排序,parallel-processing,openmp,Parallel Processing,Openmp,我是openmp的新手,我有一个学校作业。我认为问题出在bitonicMerge。我一直在尝试很多变化和可能性,我发现的“最佳解决方案”如下: `void sort() { #pragma omp parallel { #pragma omp single recBitonicSort(0, N, ASCENDING); } } void recBitonicSort(int lo, int cnt, int dir) { if (cnt>1) {

我是openmp的新手,我有一个学校作业。我认为问题出在bitonicMerge。我一直在尝试很多变化和可能性,我发现的“最佳解决方案”如下:

`void sort() {
  #pragma omp parallel
  {
    #pragma omp single
       recBitonicSort(0, N, ASCENDING);
  }
}

void recBitonicSort(int lo, int cnt, int dir) {
  if (cnt>1) {
    int k=cnt/2;
     #pragma omp task if(cnt>1024) // elements vary from 2^12 to 2^24
        recBitonicSort(lo, k, ASCENDING);
     #pragma omp task if(cnt>1024)
        recBitonicSort(lo+k, k, DESCENDING);
     #pragma omp taskwait
  bitonicMerge(lo, cnt, dir);
  }
}

void bitonicMerge(int lo, int cnt, int dir) {
  if (cnt>1) {
    int k=cnt/2;
  int i;
  #pragma omp parallel num_threads(p)
  {
  #pragma omp for schedule(static) nowait
      for (i=lo; i<lo+k; i++)
      {
        //printf("Num of threads: %d\n", omp_get_num_threads());
        compare(i, i+k, dir);
      }
  #pragma omp single
  {
    #pragma omp task if(cnt>1024)
      bitonicMerge(lo, k, dir);
    #pragma omp task if(cnt>1024)
      bitonicMerge(lo+k, k, dir);
    }
   }
  }
 }`    
`void sort(){
#pragma-omp并行
{
#布拉格omp单曲
重新排序(0,N,升序);
}
}
void recBitonicSort(int-lo、int-cnt、int-dir){
如果(cnt>1){
int k=cnt/2;
#pragma omp task if(cnt>1024)//元素在2^12到2^24之间变化
循环排序(lo、k、升序);
#pragma omp任务如果(cnt>1024)
循环排序(lo+k,k,递减);
#pragma omp taskwait
bitonicMerge(lo,cnt,dir);
}
}
void bitonicMerge(int-lo、int-cnt、int-dir){
如果(cnt>1){
int k=cnt/2;
int i;
#pragma omp并行数线程(p)
{
#计划(静态)nowait的pragma omp
用于(i=lo;i1024)
双向合并(lo、k、dir);
#pragma omp任务如果(cnt>1024)
比特合并(lo+k,k,dir);
}
}
}
}`    

代码可以工作,但需要花费时间(命令式bitonic需要0.5s,递归需要7-8s,元素=2^20,最大线程=8)。我知道printf只打印1个线程,可能是因为recBitonicSort为bitonicMerge分配了一个线程,但我找不到更好的解决方案。

你的问题是?我的bitonicMerge怎么了…?你的问题是?我的bitonicMerge怎么了。。。?