并行合并排序适用于笔记本电脑,但不适用于 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.
文档和代码都在那里。
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.
文档和代码都在那里。