OpenACC bitonic排序在GPU上比在CPU上慢得多

时间:2016-09-07 10:38:49

标签: sorting gcc parallel-processing openacc libgomp

我有以下一些代码来对我的GPU上的双值进行排序:

void bitonic_sort(double *data, int length) {
  #pragma acc data copy(data[0:length], length)
  {
    int i,j,k;
    for (k = 2; k <= length; k *= 2) {
      for (j=k >> 1; j > 0; j = j >> 1) {
        #pragma acc parallel loop gang worker vector independent
        for (i = 0; i < length; i++) {
          int ixj = i ^ j;
          if ((ixj) > i) {
            if ((i & k) == 0 && data[i] > data[ixj]) {
              _ValueType buffer = data[i];
              data[i] = data[ixj];
              data[ixj] = buffer;
            }
            if ((i & k) != 0 && data[i] < data[ixj]) {
              _ValueType buffer = data[i];
              data[i] = data[ixj];
              data[ixj] = buffer;
            }
          }
        }
      }
    }
  }
}

我的GPU比我的CPU慢一点。我正在使用GCC 6.1。我无法弄清楚,如何在我的GPU上运行整个代码。到目前为止,只有并行循环在cpu上执行,并且它在CPU和GPU之间为每个外循环切换。

我想在GPU上运行该功能的全部内容,但我无法弄清楚如何。我现在面临的一个主要问题是GCC实现目前不允许嵌套并行,所以我不能在另一个并行构造中使用并行构造。有没有办法解决这个问题?

我已经尝试将内核构造放在第一个循环的顶部,但是将它减慢了大约10倍。如果我在第一个循环上方使用并行构造,则结果不是“t”再排序,这是有道理的。需要按顺序执行两个外部循环才能使算法正常工作。

如果您对如何提高表现有任何其他建议,我将不胜感激。

0 个答案:

没有答案
相关问题