【问题标题】:Parallel Merge sort working on laptop but not on GPU and Xeon phi并行合并排序适用于笔记本电脑,但不适用于 GPU 和 Xeon phi
【发布时间】:2016-09-11 13:36:04
【问题描述】:
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 上无法正确排序,因为这些机器有更多的并行线程。

请告诉我如何才能让它更快并在所有机器上正常工作。

【问题讨论】:

  • 谁知道你的意思,因为代码未格式化并且大括号不平衡。
  • 在粘贴代码时发生了道歉,现在我已经更改了,如果您有任何想法,请看看并告诉我?

标签: c openmp gpu


【解决方案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

至强融核上的 OpenCL 排序 https://software.intel.com/en-us/articles/bitonic-sorting.

文档和代码都在那里。

【讨论】:

  • 感谢您的帮助,但是,实际上我已经检查了所有这些链接,我的教授希望在第一次递归调用之前 #pragma omp single 并且当我这样做时,它无法正常工作GPU 和 Xeon 处理器,所以他说要改进它,但我检查了几乎所有的链接,没有发现任何改进的地方。
  • @PragyaSharma 在 GPU 和 Xeon Phi 上运行的代码与 OpenMP 代码完全不同。只需一两行修改,您的代码就不可能在 GPU 上运行。基本上你必须为每个计算平台编写单独的代码。
  • 非常感谢 Eric 的指导,能否请您再帮我做点什么才能实现这样的功能,它可以在 GPU 和 Xeon phi 上运行?我应该分享我现在正在使用的程序吗???
  • @PragyaSharma 您可以从推力排序开始。它的网站上有示例代码。
  • 非常感谢 Eric,我检查了推力排序我会尝试在我的程序中添加这个库和函数,看起来它会解决我的问题...... :) :)
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多