【发布时间】:2016-02-28 14:50:33
【问题描述】:
我有一个 3D 块的 3D 网格,在每个块中,我需要在块的“z”层上按顺序计算。换句话说,我想首先执行所有 (x,y,0) 线程,然后执行所有 (x,y,1) 等。我需要逐层执行我的线程(按 z 轴计算层数)。我知道函数 __syncthreads(),但我不知道如何按照我想要的方式同步线程。
更新:
__global__ void Kernel(//some params)
{
//some code
__syncthreads();
}
它同步块中的所有线程。但是我需要执行z = 0的所有线程,然后是z = 1的所有线程,等等。
【问题讨论】:
-
这个问题需要更多细节,但我怀疑答案是:将你的线程块定义为需要同步的线程组的大小。换句话说,将您的图层拆分为单独的块。
-
@harrism,我知道我可以这样做。但在这种情况下,我将不得不启动内核几次,这会对性能产生负面影响。
-
为什么需要多次启动内核?您可以有一个 2D 网格,其中 Y 维度表示块中的(前)Z 层。并在网格内使用 2D x/y 块。那么你只需要块内的__syncthreads(),blockIdx.y对应你之前在threadIdx.z中的...
-
@harrism,因为我的算法中确实有一个 3D 网格。
-
好的,感谢您的澄清。你应该把它放在问题中。