我在OpenACC中做了一个非常简单的向量加法内核。我想知道这是否是我正在使用的编译器的问题(与OpenCL一起使用),因为我遇到问题似乎是从设备将数据复制回主机。所有结果都是正确但结果为[0]。例如。以下代码:
for (i=0; i<VEC_SIZE; i++) {
a[i] = i;
b[i] = VEC_SIZE-i;
result[i]=0;
}
#pragma acc kernels copyin(a,b) copy(result)
for (i=0; i<VEC_SIZE; i++) {
result[i] = a[i]+b[i];
}
// verify result
for (i=0; i<VEC_SIZE; i++) {
if ( (a[i] + b[i]) != result[i]) {
fprintf(stderr, "Incorrect results id %d val: %d \n", i, result[i]);
}
}
返回以下内容:
Incorrect results id 0 val: 0
这意味着所有结果,但索引0处的结果是正确的,似乎索引零的结果不会从设备复制。
这是编译器/运行时错误还是我错过了关于编码的内容?
答案 0 :(得分:0)
是的,我也认为这是你的编译器的一个错误,因为你的代码看起来正确,你可以尝试PGI编译器,我现在正在使用它,它现在属于NVIDIA。 此外,您可以将代码“copy(result)”更改为“copyout(result)”以减少内存I / O时间,因为结果的初始值对设备没用。