在设备上分配数据时减少

reduction when allocating daata on the device

我有一个简单的nbody实现代码。简而言之,我删除了 randomizeBodies().

中的额外代码
typedef struct
{ 
  float x; 
  float y; 
  float z;
  float w;
} Point4;
n=16384;
Point4  positions   [n];
Point4  velocities  [n];
Point4  acceleration[n];
float   E_pot       [n];
#pragma acc declare device_resident(positions,velocities,
acceleration,E_pot,n)
void randomizeBodies()
{
  float K=0;
  #pragma acc data copy(K)
  #pragma acc parallel loop reduction(+:K)
  for(int i=0;i<n; ++i)
  {
    ...
    Point4 velocity=...;
    K+=1;
    K+=velocity.y*velocity.y;
    K+=velocity.z*velocity.z;
    velocities[i].x = velocity.x ;
    velocities[i].y = velocity.y ;
    velocities[i].z = velocity.z ;
  }
  printf("K=%f",K); 
}

这里veleocity.xvelocity.yvelocity.z都是float。我在 main() 中调用 randomizeBodies(),不明白为什么输出会写 "K=0"。这段代码有什么问题吗?

由此看来,您似乎正在通过非结构化数据区域管理 "K",但尚未在打印前将其复制回主机。尝试在 print 语句之前添加“#pragma acc update self(K)”指令。或者,您可以删除“#pragma acc enter data(K)”语句,在这种情况下,编译器将在并行循环结束后隐式复制回 K。