CUDA 中的线程同步

Threads syncronization in CUDA

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

更新:

 __global__ void Kernel(//some params)
 {


      //some code 
      __syncthreads();
 }

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

__syncthreads() 阻塞块中的线程。如果你坚持使用__syncthreads(),你将不得不确保块大小与a(x*y) 相同,这不一定是可能的,而且即便如此,也不能保证块的顺序。实现目标的另一种方法是每层启动一个内核,并在内核之间同步(即块内核并发)。当然,这实际上取决于您的确切内核的作用以及是否可以将其分解。

您可以使用一个简单的循环,并在每次迭代中指定要执行工作的线程。类似于:

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

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