我有以下一些代码来对我的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”再排序,这是有道理的。需要按顺序执行两个外部循环才能使算法正常工作。
如果您对如何提高表现有任何其他建议,我将不胜感激。