【问题标题】:Understanding #pragma acc kernels了解#pragma acc 内核
【发布时间】:2020-05-14 06:29:09
【问题描述】:

我正在尝试优化 nbody 算法,当我在循环中添加 #pragma acc 内核时,我不明白以下评论是什么

#pragma acc kernels
  for (i = 0; i < n; i++)
  {
    real fx, fy, fz;
    fx = fy = fz = 0;

    real iPosx = in[i].x;
    real iPosy = in[i].y;
    real iPosz = in[i].z;

    for (j = 0; j < n; j++)
    {   
      real rx, ry, rz;

      rx = in[j].x - iPosx;
      ry = in[j].y - iPosy;
      rz = in[j].z - iPosz;

      real distSqr = rx*rx+ry*ry+rz*rz;
      distSqr += SOFTENING_SQUARED;

      real s = in[j].w / POW(distSqr,1.5);

      real3 ff;
      ff.x = rx * s;
      ff.y = ry * s;
      ff.z = rz * s;

      fx += ff.x;
      fy += ff.y;
      fz += ff.z;
    }

    force[i].x = fx;
    force[i].y = fy;
    force[i].z = fz;
  }

什么意思是“生成隐式约简(+:fx)

"生成隐式约简(+:fy)

“生成隐式约简(+:fz)”?

谢谢

【问题讨论】:

    标签: c optimization openacc


    【解决方案1】:

    为了并行化内部“j”循环,三个变量 fx、fy 和 fz 必须在求和中。编译器已自动检测到这一点,因此为您隐式添加了减少。就像你明确声明它们一样,例如:

    #pragma acc loop reduction(+:fx,fy,fz)
     for (j = 0; j < n; j++)
    {   
      real rx, ry, rz;
    

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2018-05-07
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2020-12-18
      • 2020-02-27
      • 2015-12-08
      相关资源
      最近更新 更多