1

我正在处理这个简单的代码片段顺便说一句,我用 0 初始化了 c 数组的所有元素。

#pragma acc kernels copyin(a[0:n],b[0:n]), copyout(c[0:n])
{
  c[0]=11;
  for(i=0; i<n; i++) {
    if(c[i]==11) c[i]=123;
    c[i] = a[i] + b[i];
  }
}

当我查看生成的小码时,我看到在主机代码段(CPU)上分配了 c[0]。这意味着迭代适用于旧的 c 值(初始化值为 0)。因此迭代从未进入 c[i]=123 赋值。我的意思是代码返回了错误的结果:(你遇到过类似的事情吗?

4

1 回答 1

3

根据OpenACC v1.0 参考acc 内核指令围绕要在加速器上执行的循环,通常作为内核操作序列。这意味着循环外的代码不一定要在加速器中并行运行。在您的情况下,最好使用acc 并行指令:

#pragma acc parallel copyin(a[0:n],b[0:n]), copyout(c[0:n])
{
  c[0]=11;
  #pragma acc loop 
  for(i=0; i<n; i++) {
    if(c[i]==11) c[i]=123;
    c[i] = a[i] + b[i];
  }
}

acc 循环指令确保循环的迭代分布在加速器线程中。

于 2013-07-09T08:21:03.647 回答