在设备上分配daata时减少

时间:2017-09-23 19:49:51

标签: openacc

我有一个简单的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是浮动的。我在randomizeBodies()中调用main()并且不理解为什么输出写“K = 0”。这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

从这看起来,你似乎正在管理&#34; K&#34;通过非结构化数据区域,但在打印之前无法将其复制回主机。尝试添加&#34; #pragma acc update self(K)&#34; print语句之前的指令。或者,您可以删除&#34; #pragma acc输入数据(K)&#34;语句,在这种情况下,编译器将在并行循环结束后隐式复制K。