首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >openacc和缓存平铺

openacc和缓存平铺
EN

Stack Overflow用户
提问于 2016-10-14 14:36:30
回答 1查看 120关注 0票数 0

-示例代码

代码语言:javascript
复制
for (body1 = 0; body1 < NBODIES; body1 ++) {
   for (body2=0; body2 < NBODIES; body2++) {
     OUT[body1] += compute(body1, body2);
   }
}

-阻塞代码

代码语言:javascript
复制
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不能充分利用图形处理器中的共享内存。但我认为主要原因是tilling/blocking阻止了并行化。因为平铺带来了数据依赖。如果OpenACC不提供或不鼓励代码平铺?如果有解决方案或示例,那么tilling技术将改进OpenACC代码。

EN

回答 1

Stack Overflow用户

发布于 2016-10-18 04:54:37

OpenACC可以执行自动和显式平铺(通过tile子句),但是,我不认为这是您的问题。我看到的问题是,由于依赖于"OUTbody1“,body2循环是不可并行化的。OpenACC可以并行执行标量缩减,因此您可以尝试以下操作:

代码语言:javascript
复制
  #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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40036483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档