2

我对银行冲突有点困惑,避免使用内存填充和合并内存访问。到目前为止我读过的内容:从全局内存中合并内存访问是最佳的。如果无法实现,则可以使用共享内存对当前块所需的数据进行重新排序,从而使合并访问成为可能。但是,当使用共享内存时,必须注意银行冲突。避免存储库冲突的一种策略是将存储在共享内存中的数组填充 1。考虑此博客文章中的示例,其中 16x16 矩阵的每一行都填充 1,使其成为共享内存中的 16x17 矩阵。

现在我明白了使用内存填充可能会避免银行冲突,但这是否也意味着内存不再对齐?例如,如果我将全局内存移动 1 从而使其未对齐,则一个扭曲将需要访问两个内存通道而不是一个,因为最后一个数字与所有其他数字不在同一通道中。因此,据我了解,合并的内存访问和内存填充是相互矛盾的概念,不是吗?一些澄清非常感谢!

4

1 回答 1

1

评论太长了,所以我把它放在这里。虽然仍然不是一个完整的答案。

当我发现Mark Harris 的这篇文章时,它演示了使用共享内存来促进合并的内存访问。这个问题的重要结论似乎是:

此示例中使用共享内存的原因是为了促进旧 CUDA 设备(Compute Capability 1.1 或更早版本)上的全局内存合并。读取和写入都实现了最佳全局内存合并,因为始终通过线性对齐索引 t 访问全局内存。反向索引tr只用于访问共享内存,它没有全局内存的顺序访问限制以获得最佳性能。共享内存的唯一性能问题是银行冲突,我们将在后面讨论。

我最初的理解是,如果无法合并访问全局内存,则将其读取为未合并的,然后在共享内存中重新排序,以实现从共享内存的进一步合并访问。但相反,数据是以连续方式从全局内存中读取的,然后可以以非合并方式从共享内存中读取所需的实际数据。哈里斯还指出,从共享内存中未合并的访问不是问题,但不幸的是,该帖子没有解释原因。

于 2022-01-20T11:18:41.683 回答