0

我想沿着向量 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 的功能有错误的看法?

4

1 回答 1

2

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

您真正想要的是双缓冲您的卷数据(即写入与您读取不同的数组)。您不能覆盖数组的其他部分,除非您可以保证它们只能被同一线程块中的其他线程读取。否则你有一个竞争条件,你的程序是不正确的。

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

您正在实施的与平流内核非常相似,将用于流体动力学模拟,我敢肯定在网络上有多个您想要的示例(并行或顺序)。

标记

于 2012-07-11T23:47:32.340 回答