CUDA共享内存Bank冲突计算解析:GPU Gems前缀和图39-5疑问
理解GPU Gems 3中并行前缀和的共享内存Bank冲突映射
要理解图中thid 8-15的bank访问逻辑,我们结合代码上下文、共享内存bank的分配规则拆解如下:
1. 代码上下文与ai值的由来
你给出的代码片段来自并行前缀和的down-sweep(向下扫描)阶段,其中offset对应算法中的步长d。当d=1(即算法的最底层扫描)时,代入公式:
int ai = offset*(2*thid + 1) - 1;
计算得ai = 1*(2*thid +1) -1 = 2*thid,这与图中给出的ai值完全匹配:
- thid 0-7 → ai=0,2,4,...,14
- thid 8-15 → ai=16,18,20,...,30
2. 共享内存Bank的分配规则(Compute Capability 1.x)
在16个bank的共享内存配置中,CUDA会将连续的32位(4字节)字依次分配到bank 0到15,循环往复。对于共享内存数组的字索引(即ai,假设数组为int类型,每个元素占4字节),bank索引的计算公式为:
bank索引 = ai % 16
3. thid 8-15的Bank计算逻辑
按照上述公式计算:
- thid8的ai=16 → 16%16=0
- thid9的ai=18 →18%16=2
- thid10的ai=20 →20%16=4
- ...
- thid15的ai=30 →30%16=14
你提供的图中thid15的bank标注为15是笔误,这实际是bi的bank索引(bi=1*(2*15+2)-1=31,31%16=15)。
4. Bank冲突分析
此时同一warp内:
- bank 0被thid0和thid8访问
- bank 2被thid1和thid9访问
- ...
- bank14被thid7和thid15访问
每个偶数编号的bank都有2个线程同时访问,冲突度为2,这正是图39-5要展示的down-sweep阶段的bank冲突情况。
内容的提问来源于stack exchange,提问作者user8469759
相关产品推荐
相关产品推荐

