0

我在 OpenACC 中做了一个非常简单的向量加法内核。而且我想知道这是否是我正在使用的编译器的问题(accULL with 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 的结果没有从设备复制过来。

这是一个编译器/运行时错误还是我错过了一些关于我的编码的东西?

4

1 回答 1

0

是的,我也认为是你的编译器的一个bug,因为你的代码看起来不错,你可以试试PGI编译器,我现在正在使用它,它现在属于NVIDIA。此外,您可以将代码“copy(result)”更改为“copyout(result)”以减少内存 I/O 时间,因为 result 的初始值对设备无用。

于 2017-08-28T07:57:15.450 回答