并行合并排序适用于笔记本电脑,但不适用于 GPU 和 Xeon phi

Parallel Merge sort working on laptop but not on GPU and Xeon phi

void pmergesort(int a[], int l, int r)
{
   if (l < r)
      {
         int m = l+(r-l)/2;
         #pragma omp parallel
           {
              #pragma omp single
                {
                   #pragma omp task
                   pmergesort(a, l, m);
                }
          #pragma omp task
          pmergesort(a, m+1, r);
          #pragma omp taskwait 
          pmerge(a,l,m,r);
         }
     }
}

我的教授告诉我只在第一次递归调用之前使用#pragma omp single 以使程序更快。它在我的笔记本电脑上运行得非常快,但在 GPU 和 Xeon phi 上无法正确排序,因为这些机器具有更多并行线程。

请让我知道我该怎么做才能让它更快并在所有机器上正常工作。

并行排序是非常基础的算法。几乎每个并行计算平台都有排序 API/sample 代码。

这是其中的一些。

推力排序 GPU/CPU http://docs.nvidia.com/cuda/thrust/#sorting

GPU 上的 CUB 排序 https://nvlabs.github.io/cub/

现代 GPU 在 GPU 上排序 https://nvlabs.github.io/moderngpu/

TBB/openmp/cilk 加排序 CPU https://software.intel.com/en-us/articles/a-parallel-stable-sort-using-c11-for-tbb-cilk-plus-and-openmp

Xeon Phi 上的 OpenCL 排序 https://software.intel.com/en-us/articles/bitonic-sorting.

文档和代码都在那里。