CUDA中的线程同步

Threads syncronization in CUDA

本文关键字:同步 线程 CUDA      更新时间:2023-10-16

我有一个3D块的3D网格,在每个块中,我需要按顺序计算块的"z"层。换句话说,我想首先执行所有(x,y,0)线程,然后执行所有(x,y,1),等等。我需要一层一层地执行我的线程(按z轴计数层)。我知道函数__syncthreads(),但我不知道如何以我想要的方式同步线程。

乌利希期刊指南:

 __global__ void Kernel(//some params)
 {

      //some code 
      __syncthreads();
 }

它同步块中的所有线程。但是我需要执行所有z= 0的线程,然后是所有z=1的线程,等等

您可以使用一个简单的循环,并指定您希望在每次迭代中完成工作的线程。比如:

for (int z = 0; z < zmax; z++) {
    if (threadIdx.z == z) { 
        //do whatever with x and y
    }
    __syncthreads();
}

在每次迭代中,具有特定z-index的线程执行指令,而其他线程空闲;在每次迭代结束时,所有线程同步。

__syncthreads()阻塞块内的线程。如果您坚持使用__syncthreads(),则必须确保块大小与a(x*y)相同,这是不可能的,即使这样,块的顺序也不能保证。实现目标的另一种方法是每层启动一个内核,并在内核之间同步(即块内核并发)。当然,这真的取决于你的内核是做什么的,以及像这样分解它是否可行。