当前位置: 首页 > news >正文

bank conflict 举例说明

可以,我们就用一个最小、能手算清楚的例子,把为什么32会冲突、33不会冲突,直接算出来。


一、先定规则

假设:

  • shared memory 有32 个 bank
  • bank 编号规则是

[
bank = index \bmod 32
]

这里index指的是把二维数组线性展开后的位置。

row-major 展开公式:

[
index = row \cdot width + col
]

其中width是每一行长度。


二、先看tile[32][32]

数组:

__shared__floattile[32][32];

所以每行长度:

[
width = 32
]


现在看一种访问方式

假设一个 warp 内 4 个线程先看,访问:

tile[tx][0]

也就是:

  • 线程0访问tile[0][0]
  • 线程1访问tile[1][0]
  • 线程2访问tile[2][0]
  • 线程3访问tile[3][0]

这是转置里常见的“按列取”。


1. 算 index

公式:

[
index = row \cdot 32 + col
]

这里col = 0

所以:

  • tile[0][0]:

[
index = 0 \cdot 32 + 0 = 0
]

  • tile[1][0]:

[
index = 1 \cdot 32 + 0 = 32
]

  • tile[2][0]:

[
index = 2 \cdot 32 + 0 = 64
]

  • tile[3][0]:

[
index = 3 \cdot 32 + 0 = 96
]


2. 算 bank

[
bank = index \bmod 32
]

所以:

  • 线程0:

[
0 \bmod 32 = 0
]

  • 线程1:

[
32 \bmod 32 = 0
]

  • 线程2:

[
64 \bmod 32 = 0
]

  • 线程3:

[
96 \bmod 32 = 0
]


3. 结果

4 个线程全都去bank 0

线程0 -> bank 0 线程1 -> bank 0 线程2 -> bank 0 线程3 -> bank 0

这就是 bank conflict。

如果是 32 个线程,就会变成:

  • 线程0 去 bank 0
  • 线程1 也去 bank 0
  • 线程31 还去 bank 0

于是必须排队。


三、再看tile[32][33]

数组:

__shared__floattile[32][33];

所以每行长度变成:

[
width = 33
]

还是看同样访问:

tile[tx][0]

1. 算 index

公式变成:

[
index = row \cdot 33 + col
]

这里col = 0

所以:

  • tile[0][0]:

[
index = 0 \cdot 33 + 0 = 0
]

  • tile[1][0]:

[
index = 1 \cdot 33 + 0 = 33
]

  • tile[2][0]:

[
index = 2 \cdot 33 + 0 = 66
]

  • tile[3][0]:

[
index = 3 \cdot 33 + 0 = 99
]


2. 算 bank

[
bank = index \bmod 32
]

所以:

  • 线程0:

[
0 \bmod 32 = 0
]

  • 线程1:

[
33 \bmod 32 = 1
]

  • 线程2:

[
66 \bmod 32 = 2
]

  • 线程3:

[
99 \bmod 32 = 3
]


3. 结果

线程0 -> bank 0 线程1 -> bank 1 线程2 -> bank 2 线程3 -> bank 3

4 个线程去了 4 个不同 bank。

如果扩展到 32 个线程:

  • 线程0 去 bank 0
  • 线程1 去 bank 1
  • 线程31 去 bank 31

就完全并行了。


四、为什么 33 这么神奇

因为:

[
33 = 32 + 1
]

所以每换一行,起点不再是:

0, 32, 64, 96 ...

而变成:

0, 33, 66, 99 ...

也就是每一行都比前一行错开 1 个 bank


五、再举一个带固定列的例子

比如访问:

tile[tx][5]

对于tile[32][32]

[
index = tx \cdot 32 + 5
]

取 4 个线程:

  • 线程0:5
  • 线程1:37
  • 线程2:69
  • 线程3:101

算 bank:

  • 5 mod 32 = 5
  • 37 mod 32 = 5
  • 69 mod 32 = 5
  • 101 mod 32 = 5

还是全撞到bank 5


对于tile[32][33]

[
index = tx \cdot 33 + 5
]

取 4 个线程:

  • 线程0:5
  • 线程1:38
  • 线程2:71
  • 线程3:104

算 bank:

  • 5 mod 32 = 5
  • 38 mod 32 = 6
  • 71 mod 32 = 7
  • 104 mod 32 = 8

分散开了。


六、你可以总结成一句话

32x32来说,按列访问时,相邻行地址差正好是 32,模 32 后全相同,所以撞 bank。
32x33来说,按列访问时,相邻行地址差是 33,模 32 后每次加 1,所以分散到不同 bank。


七、最短记忆版

  • 32:整齐对齐,容易撞
  • 33:错开一格,不容易撞
http://www.jsqmd.com/news/676554/

相关文章:

  • 不只是hosts问题:Git clone失败背后的网络原理与安全风险(附Wireshark抓包分析)
  • YOLOv5新手避坑指南:从‘口罩检测’案例看自定义数据集的那些‘雷’
  • [特殊字符] JSTL 核心标签库 入门详解
  • 电动三轮车CVT传动系统改装实践与性能优化
  • 为什么AI已经很强,你还是不敢把活交给它?丨阿隆向前冲
  • ChatGPT/Kimi K2.6/API 调用故障排查指南:智能体失灵的全流程修复手册
  • 别再让Vue的key报错折磨你了!盘点5个真实项目中踩过的坑(附Vue 3最佳实践)
  • VCS仿真中用好断言debug选项,让你的验证效率翻倍(附避坑指南)
  • 从“攻防演练”到“日常开发”:给开发者的WAF绕过原理与安全编码避坑指南
  • 2025届最火的五大降重复率方案推荐
  • 如何永久保存你的微信聊天记录:WeChatMsg完整指南
  • 2026年智能温室大棚加工厂怎么选,汇宇钢管给出专业答案 - 品牌企业推荐师(官方)
  • PGA封装为何仍是高性能计算的首选?拆解服务器CPU的封装进化史
  • NUMA架构与Linux内存策略优化实践
  • 跨平台BitLocker解密实战:高效解锁Windows加密磁盘的一站式解决方案
  • 从Bertrand Russell的《How to Grow Old》看技术人的职业河流模型:如何规划你的技能与影响力
  • TeXStudio高效写作指南:5个隐藏技巧让你的LaTeX编辑速度翻倍
  • Windows 11经典游戏联机终极解决方案:IPXWrapper深度配置指南
  • 2026最新广东深圳资质认定/项目申报/高企认定/专精特新申报/企业政策咨询推荐 - 十大品牌榜
  • 深聊温室大棚生产厂选购要点,汇宇钢管优势显著 - 品牌企业推荐师(官方)
  • 极域电子教室破解完全指南:如何用JiYuTrainer实现自主学习
  • 别再手动一个个启动容器了!用Docker Compose编排一个Web+MySQL+Redis的完整项目(附yml文件详解)
  • 告别Xshell!用SecureCRT+SecureFX整合版搞定Linux远程连接与文件传输(附乱码解决方案)
  • 【学习方法和哲学思想】:外语的本质:事物的别名
  • OpenMythos 核心架构深度解析:22岁天才如何“扒光” Anthropic 的顶级机密?
  • 数字架构智能化测试平台(1)--总纲
  • 分割等和子集-leetcode
  • 体验优先:十分钟使用 Python+LangChain 玩转阿里通义千问
  • H1: BlenderKit插件跨平台兼容性问题的全面诊断与解决方案
  • 想当无人机培训讲师去哪里学,阜阳靠谱的学校有哪些 - 工业设备