CUDA 内存库冲突

彼得·K。

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

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

扭曲中的每个线程只能访问它自己的部分。

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

  • 螺纹 1 进入第 1 部分中的位置 0(128)

  • 螺纹 31 进入第 31 部分中的位置 0(3968)

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

罗伯特·克罗维拉

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章