CUDA:仅使用一个内核和一个threadfence移动卷纹理的内容

时间:2012-07-11 14:46:05

标签: cuda

我想沿矢量vecShift移动体积纹理的内容。我想到了这样一个内核:

__global__ void
moveVolume(int* vecShift)
{
  // Determine position of current voxel as ptDest

  // Determine position of voxel we copy the content from as ptSrc

  // Read value at ptSrc and store it to voxelColor

  // __threadfence()

  // Write voxelColor to voxel at position ptDest
}

threadfence将确保所有体素都已读取其“伙伴”的内容,并且在每个体素完成读取操作之前不会写入ptDest,是吗?

如果这是真的,为什么我(有时)会得到模糊的文物?或者我对threadfence的功能有错误的看法?

1 个答案:

答案 0 :(得分:2)

正如talonmies在评论中解释的那样,在这里使用__threadfence()既不必要也不充分。 __threadfence()不提供全局屏障同步,它只是确保在调用__threadfence() 的线程继续之前,该线程在屏障之前的所有写入对于内核启动中的所有其他活动线程都是可见的。

你真正想要的是对你的体积数据进行双重缓冲(即写入与你读取的数据不同的数组)。您不能覆盖数组的其他部分,除非您可以保证它们仅由同一线程块中的其他线程读取。否则你就有竞争条件而你的程序不正确。

注意:即使在顺序(CPU)实现中,您也需要为这种类型的计算加倍缓冲数据!

您正在实施的内容非常类似于平流内核,就像在流体动力学模拟中使用的那样,我确信您在网络上有多个例子(并行或顺序)。

标记