在设备上分配数据时减少
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.x
、velocity.y
、velocity.z
都是float。我在 main()
中调用 randomizeBodies()
,不明白为什么输出会写 "K=0"。这段代码有什么问题吗?
由此看来,您似乎正在通过非结构化数据区域管理 "K",但尚未在打印前将其复制回主机。尝试在 print 语句之前添加“#pragma acc update self(K)”指令。或者,您可以删除“#pragma acc enter data(K)”语句,在这种情况下,编译器将在并行循环结束后隐式复制回 K。
我有一个简单的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
都是float。我在 main()
中调用 randomizeBodies()
,不明白为什么输出会写 "K=0"。这段代码有什么问题吗?
由此看来,您似乎正在通过非结构化数据区域管理 "K",但尚未在打印前将其复制回主机。尝试在 print 语句之前添加“#pragma acc update self(K)”指令。或者,您可以删除“#pragma acc enter data(K)”语句,在这种情况下,编译器将在并行循环结束后隐式复制回 K。