如何在gpu上启动顺序代码

时间:2017-11-15 15:36:55

标签: openacc

我有一个CPU代码:

 `if(number_of_pushed_particles<N&&number_of_alive_particles<K)
 {
   push_particle();
   number_of_pushed_particles++;
 }`

这里number_of_pushed_pa​​rticles,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上启动此顺序代码?

1 个答案:

答案 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;
}

}