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上正确排序,因为这些机器有更多的并行线程。
请让我知道如何才能让它更快,并在所有机器上正常工作。
答案 0 :(得分:1)
并行排序是非常基本的算法。几乎每个并行计算平台都有排序API /示例代码。
以下是其中一些。
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
文档和代码都在那里。