【问题标题】:how to launch a sequential code on gpu如何在 gpu 上启动顺序代码
【发布时间】:2018-04-28 21:59:17
【问题描述】:

我有一个 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;
 }

`Particle是一个浮点结构体。数组Particleparticle[0:GL],整型变量LIFE和MAX_ELEMENT在设备上静态分配。这就是为什么我不想在调用 push_particle() 函数之前/之后使用#pragma acc update host/device 并浪费时间复制数据。如何在 GPU 上启动此顺序代码?

【问题讨论】:

    标签: openacc


    【解决方案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;
    }
    

    }

    【讨论】:

    • 感谢您的回答。为什么省略“num_workers(1)”子句?
    • 如何在设备上分配变量?当我尝试写入 main() LIFE=0;
    • (LIFE 在设备上分配)。编译器说:ACEELERATOR RESTRICTION: unsupported statement type: opcode=ACCPLOOP.
    • 当我尝试听从你的建议并写下:
    • #pragma acc parallel num_gangs(1) vector_length(1) present(particles) { LIFE=0;
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多