我有一个简单的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.x
,velocity.y
,velocity.z
是浮动的。我在randomizeBodies()
中调用main()
并且不理解为什么输出写“K = 0”。这段代码有什么问题吗?
答案 0 :(得分:0)
从这看起来,你似乎正在管理&#34; K&#34;通过非结构化数据区域,但在打印之前无法将其复制回主机。尝试添加&#34; #pragma acc update self(K)&#34; print语句之前的指令。或者,您可以删除&#34; #pragma acc输入数据(K)&#34;语句,在这种情况下,编译器将在并行循环结束后隐式复制K。