【问题标题】:openACC codes inside of the kernels directive sometimes works wrongkernels 指令中的 openACC 代码有时会出错
【发布时间】:2013-07-05 23:15:07
【问题描述】:

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

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

【问题讨论】:

    标签: gpu gpgpu openacc


    【解决方案1】:

    根据OpenACC v1.0 referenceacc kernels 指令围绕要在加速器上执行的循环,通常作为一系列内核操作。 这意味着循环外的代码不一定要在加速器中并行运行。 在您的情况下,最好使用 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 指令确保循环的迭代分布在加速器线程中。

    【讨论】:

    • 感谢 Ruyk 的回答。但是那个案子有点奇怪,不是吗?那么我们什么时候可以说内核指令只并行化迭代?
    • 好吧,更准确地说,我们可以说 Kernels 指令从包含在该区域中的带注释的循环嵌套中创建了许多内核。但是,此行为可能会根据编译器可能执行的实现或其他优化而改变...
    猜你喜欢
    • 2015-11-04
    • 2017-05-30
    • 2015-03-20
    • 1970-01-01
    • 2013-01-28
    • 2021-12-20
    • 2019-11-24
    • 2018-02-03
    • 2022-01-20
    相关资源
    最近更新 更多