openacc和缓存耕耘

时间:2016-10-14 06:36:30

标签: optimization blocking openacc

-----示例代码-----------

for (body1 = 0; body1 < NBODIES; body1 ++) {
   for (body2=0; body2 < NBODIES; body2++) {
     OUT[body1] += compute(body1, body2);
   }
}

-----阻止代码------

for (body2 = 0; body2 < NBODIES; body2 += BLOCK) {
   for (body1=0; body1 < NBODIES; body1 ++) {
      for (body22=0; body22 < BLOCK; body22 ++) {
         OUT[body1] += compute(body1, body2 + body22);
      }
   }
}

我插入OpenACC指令以将代码卸载到GPU。 但表现正在下降。 我搜索了一些论文,他们得出结论,原因是OpenACC无法利用GPU中的共享内存。但我认为主要原因是耕种/阻塞阻止了平行。因为耕种带来数据依赖性。 如果OpenACC不提供或不鼓励代码耕作? 如果存在填充技术改进OpenACC代码的问题或示例。

1 个答案:

答案 0 :(得分:1)

OpenACC可以进行自动和显式平铺(通过tile子句)但是,我不认为这是你的问题。我看到的问题是body2循环不可并行化,因为依赖于&#34; OUT [body1]&#34;。 OpenACC可以并行执行标量缩减,因此您可以尝试以下方法:

  #pragma acc parallel loop 
  for (body1 = 0; body1 < NBODIES; body1 ++) {
    sum = 0.0;
  #pragma acc loop reduction(+:sum)
    for (body2=0; body2 < NBODIES; body2++) {
      sum += compute(body1, body2);
    }
    OUT[body1] += sum;
  }

当然,我猜这里如果这没有帮助,请发布一个可以解释的问题的例子。如果您正在使用PGI,请发布编译器反馈消息(-Minfo = accel)。