CUDA中的线程同步

时间:2015-06-09 09:10:53

标签: c++ cuda

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

UPD:

 __global__ void Kernel(//some params)
 {


      //some code 
      __syncthreads();
 }

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

__syncthreads()阻止块内的线程。如果你坚持使用__syncthreads(),你必须确保块大小与(x * y)相同,这不一定是可能的,即使这样,块的顺序也不是。保证。获得目标的另一种方法是每层启动一个内核,并在内核之间进行同步(即阻塞内核并发)。当然,这实际上取决于你的确切内核做了什么,如果这样做是可行的。