CUDA共享内存bank conflict判定及padding优化方案咨询
共享内存Bank Conflict问题解答
首先明确通用前提:CUDA设备默认共享内存划分为32个bank,单bank单周期仅可响应一次访问,默认bank宽度为4字节(与int类型长度完全匹配),因此以int为单位访问共享内存时,对应bank编号可简化为 (int类型索引) % 32 计算。
原访问模式冲突判定
- 原场景每段长度为128个int,warp内线程k(k取值范围0~31)访问的int索引为
k * 128 - 代入bank编号计算公式:
(k * 128) % 32,由于128是32的整数倍,所有线程的计算结果均为0,即全部访问都落到同一个bank 0上 - 结论:会产生32路bank conflict
Padding优化效果判定
- 每段添加1个int padding后,单段长度变为129个int,线程k访问的int索引更新为
k * 129 - 代入bank编号计算公式:
(k * 129) % 32 = (k * (32 * 4 + 1)) % 32 = k % 32 - 结论:该结论正确,32个线程刚好分别对应bank 0~bank31,每个bank仅接收一次访问,不存在bank conflict
注:以上结论基于默认4字节bank宽度的配置,若设备手动配置为8字节bank宽度,计算逻辑会对应调整。
内容的提问来源于stack exchange,提问作者Piotr K.
相关产品推荐
相关产品推荐

