CUDA内存库冲突
CUDA memory bank conflict
我想确保我正确理解了共享内存中的库冲突。
我有 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 个元素,那么每个线程将访问唯一的库。我说得对吗?
是的,您将遇到 32 路银行冲突。出于内存冲突的目的,将共享内存可视化为二维数组可能会有所帮助,其宽度为 32 个元素(例如,32 int
或 float
个数量)。此二维数组中的每一列都是一个“银行”。
在上面叠加你的存储模式。当您这样做时,您会看到您声明的访问模式将导致 warp 中的所有线程都将请求列 0 中的项目。
是的,这里常用的“技巧”是每“行”填充 1 个元素(在您的情况下,这可能是每个“部分”一个元素)。这应该可以消除您声明的访问模式的银行冲突。
我想确保我正确理解了共享内存中的库冲突。 我有 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 个元素,那么每个线程将访问唯一的库。我说得对吗?
是的,您将遇到 32 路银行冲突。出于内存冲突的目的,将共享内存可视化为二维数组可能会有所帮助,其宽度为 32 个元素(例如,32 int
或 float
个数量)。此二维数组中的每一列都是一个“银行”。
在上面叠加你的存储模式。当您这样做时,您会看到您声明的访问模式将导致 warp 中的所有线程都将请求列 0 中的项目。
是的,这里常用的“技巧”是每“行”填充 1 个元素(在您的情况下,这可能是每个“部分”一个元素)。这应该可以消除您声明的访问模式的银行冲突。