内核指令内的openACC代码有时会出错

时间:2013-07-08 14:53:31

标签: gpu gpgpu openacc

我正在研究这个简单的代码片段 顺便说一句,我用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];
  }
}

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

1 个答案:

答案 0 :(得分:3)

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

#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 loop 指令确保循环的迭代分布在加速器线程中。