CUDA 内存库冲突

Posted

技术标签:

【中文标题】CUDA 内存库冲突【英文标题】:CUDA memory bank conflict 【发布时间】:2021-11-07 13:12:30 【问题描述】:

我想确定我正确理解共享内存中的银行冲突。 我有 32 部分数据。 这些部分由 128 个整数组成。

|0, 1, 2, ..., 125, 126, 127| ... |3968, 3969, 3970, ..., 4093, 4094, 4095|

warp 中的每个线程只访问它自己的部分。

线程 0 访问第 0 部分中的位置 0(0)

线程 1 访问第 1 部分中的位置 0(128)

线程 31 访问第 31 部分中的位置 0(3968)

这是否意味着我这里有 32 个冲突? 如果是,那么如果我将部分拉伸到 129 个元素,那么每个线程将访问唯一的银行。我说的对吗?

【问题讨论】:

这能回答你的问题吗? What is a bank conflict? (Doing Cuda/OpenCL programming) 【参考方案1】:

是的,您将遇到 32 路银行冲突。出于存储库冲突的目的,将共享内存可视化为二维数组可能会有所帮助,其宽度为 32 个元素(例如,32 个intfloat 数量)。这个二维数组中的每一列都是一个“银行”。

在上面叠加您的存储模式。当您这样做时,您将看到您声明的访问模式将导致 warp 中的所有线程都将从第 0 列请求项目。

是的,这里通常的“技巧”是为每个“行”填充 1 个元素(在您的情况下,这可能是每个“部分”一个元素)。这应该可以消除您声明的访问模式的银行冲突。

【讨论】:

以上是关于CUDA 内存库冲突的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Cuda/OpenCL 的全局内存中没有银行冲突?

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

使用统一内存时 CUDA 中出现意外的读取访问冲突错误

合并与银行冲突(Cuda)

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

CUDA 共享内存效率为 50%?