合并与银行冲突(Cuda)

Posted

技术标签:

【中文标题】合并与银行冲突(Cuda)【英文标题】:Coalescence vs Bank conflicts (Cuda) 【发布时间】:2011-03-31 22:35:15 【问题描述】:

使用 cuda 编程时,合并和银行冲突有什么区别? 是否只有在全局内存中发生合并,而在共享内存中发生银行冲突? 如果我有 >1.2 支持的 GPU,我应该担心合并吗?它自己处理合并吗?

【问题讨论】:

【参考方案1】:

是的,合并读取/写入适用于全局读取,而银行冲突适​​用于共享内存读取/写入。

不同的计算能力设备在这里有不同的行为,但 1.2 GPU 仍然需要小心以确保您合并读取和写入 - 只是有一些优化可以让您更轻松

您应该阅读CUDA Best Practices 指南。这涉及到这两个问题的很多细节。

【讨论】:

【参考方案2】:

是:合并访问仅与全局内存相关,银行冲突仅与共享内存相关。

还请查看高级 CUDA C 培训课程,第一部分详细介绍了 >1.2 GPU 中的硬件如何为您提供帮助以及您仍需要考虑哪些优化。它也解释了共享内存库冲突。以this recording 为例。

SDK 中的 scanreduction 示例还很好地解释了共享内存库的冲突,以及对内核的逐步改进。

【讨论】:

【参考方案3】:

>1.2 GPU 将尽其所能进行合并,因为它能够将相同大小的内存访问分组到相同的 256 字节内存原子中,并将它们作为 1 次内存写入写出。 GPU 将负责重新排序访问并将它们与正确的内存边界对齐。 (在早期的 GPU 中,warp 中的内存事务必须与内存原子对齐,并且必须按照正确的顺序。)

但是,为了获得最佳性能,您仍然需要确保这些合并机会可用。如果一个 warp 中的所有线程都对完全不同的内存原子进行内存事务,则合并器无能为力,因此仍然需要注意内核的内存局部性行为。

【讨论】:

以上是关于合并与银行冲突(Cuda)的主要内容,如果未能解决你的问题,请参考以下文章

如何确保与 CUDA 中的 3D 共享数据访问没有银行冲突

CUDA:不同经线之间的银行冲突?

银行冲突CUDA共享内存?

故意导致 CUDA 设备上共享内存的银行冲突

从同一位置读取时 CUDA 中的银行冲突

将数据从全局加载到共享内存时如何避免银行冲突