我有一个CPU代码:
`if(number_of_pushed_particles<N&&number_of_alive_particles<K)
{
push_particle();
number_of_pushed_particles++;
}`
这里number_of_pushed_particles,number_of_alive_particles,K和N是int,K和N是const。函数push_particle()是:
`push_particle()
{
particles[LIFE].id=++MAX_ELEMENT;
particles[LIFE].rx=0.0;
particles[LIFE].ry=0.0;
particles[LIFE].rz=0.0;
...
++LIFE;
}
`粒子是浮点数的结构。数组粒子粒子[0:GL],整数变量LIFE和MAX_ELEMENT在设备上静态分配。这就是为什么我不想在调用push_particle()函数之前/之后使用#pragma acc更新主机/设备并且浪费时间来复制数据。如何在GPU上启动此顺序代码?
答案 0 :(得分:1)
刚刚批准的OpenACC 2.6标准包含一个“串行”区域,但在将此支持添加到各种编译器实现之前,它将会有所不同。
当前方法是使用“并行”区域并设置“num_gangs(1)”和“vector_length(1)”。
类似的东西:
push_particle()
{
#pragma acc parallel num_gangs(1) vector_length(1) present(particles)
{
particles[LIFE].id=++MAX_ELEMENT;
particles[LIFE].rx=0.0;
particles[LIFE].ry=0.0;
particles[LIFE].rz=0.0;
...
++LIFE;
}
}