多体存储与交叉访问:怎么一个周期拿到多个数
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」进阶层(intermediate)数字逻辑第五十九篇。单口 SRAM每周期只服务一个地址,但超标量/向量/GPU 一周期要读多个操作数。这一篇讲在不付出真多口 SRAM 巨大代价的前提下,用多体(banking)+ 交叉访问提高访存吞吐,以及躲不开的 bank conflict。
本文要回答的问题
- 把一块 RAM 拆成多个 bank,凭什么能一周期服务多个访问?
- 地址怎么映射到 bank:高位选体和低位选体(交叉编址)各有什么后果?
- 什么是 bank conflict,发生时硬件怎么处理(错峰/停顿/复制)?
- XOR/非线性地址映射为什么能减少跨步访问的冲突?
- 多体、真双口 SRAM、多端口寄存器堆、Cache 多 bank 怎么选?
一、拆体:用多个单口阵列模拟多口
把深度 D、宽 W 的存储拆成 B 个体,每体深度 D/B、宽 W(或宽方向拆列)。若一周期的 B 个访问地址恰好落在不同体,每个体独立工作,可并行或按流水方式全部完成——等效出 B 倍吞吐,却不必造一个端口数平方增长的多口存储(真多口面积近似按端口数平方涨)。每体仍是成熟的单口/简单双口 SRAM 宏,由各自的片选译码使能。
二、地址怎么切:高位选体 vs 低位选体
地址分「体号 + 体内地址」两段,切法决定访问模式的冲突率:
- 高位选体(顺序/块编址):高地址位选体,连续地址落在同一个体、凑满一体才进下一体。对顺序取指/整块(行)操作友好(一次激活一整行),但对「连续地址一周期多取」极不友好——相邻地址全撞同一体。DDR 的 row/bank 结构偏这类;
- 低位选体(交叉/交错编址):低 log₂B 位选体,地址 A 落在
bank = A mod B,连续地址自然轮转到不同体。向量顺序加载、超标量连续取指、宽 SIMD 一周期取 B 个连续操作数时几乎无冲突;代价是跨步(stride)访问若步长是 B 的倍数,又会全部撞同一体。
连续地址(低位选体, B=4):
addr : 0 1 2 3 | 4 5 6 7 | 8 ...
bank : 0 1 2 3 | 0 1 2 3 | 0 ... ← 相邻访问天然不同体,可并行
步长=4 时: addr 0,4,8 全在 bank0 ← 100% 冲突三、冲突时怎么办
同一周期两个以上访问落到同体,该体单口无法同时服务,即 bank conflict。处理策略:
- 错峰/多拍:把冲突访问排到相邻周期(序列化),吞吐下降但结果正确;向量机里按冲突程度插入气泡;
- 每体简单双口:体本身用 1 写 1 读的简单双口 SRAM,吸收「一读一写」型冲突(如同拍取指+写回);
- 复制/分片:对读多写少的数据(如常量、指令)复制到多体、或用宽体一次读出相邻多个再 MUX 选取;
- 调度/重排:编译器/访存调度器把会冲突的访问换序,尽量让同拍地址散布到不同体。
每体还需要一个小仲裁器决定本拍谁用该体,写优先/读优先或轮转,和 round-robin 是同一套公平性问题。
四、XOR 交织:和跨步冲突对着干
线性取模映射对步长是 B 倍数的访问灾难性冲突。**XOR 地址映射(非线性/异或交织)**让体号 = 地址若干位的异或组合而不是简单低位,打乱跨步规律,使多种常见步长(2 的幂、FFT 蝶形访问、矩阵行列)都能较均匀地散到各体,显著降低冲突率。代价是地址映射多几级异或、且对某些其他模式可能略差,需按目标工作负载选(GPU 共享存储、向量 SRAM、FFT 缓冲常用)。矩阵存储则用 tile/block 数据布局配合多体,让行、列两种遍历都不扎堆。
五、和真多口、Cache bank 的关系
| 结构 | 并行度 | 代价 | 适用 |
|---|---|---|---|
| 真多口 SRAM/寄存器堆 | 任意地址每拍多访问 | 面积近端口数平方、定制单元 | 小容量寄存器堆、旁路网络 |
| 多体单/双口 SRAM | 仅当地址分散时并行 | 冲突时降速 | 大容量向量/数据 SRAM、GPU 共享存储 |
| Cache 多 bank/多端口 tag | 多体 + 组相联 | hit 时并行 | L1 一周期多 load/store |
| 复制(多副本) | 读完全并行、写要广播 | 面积×副本数、一致性开销 | 指令/常量、读多写少 |
核心权衡一句话:真多口保证「任意地址都并行」但面积爆炸;多体保证「分散地址并行、冲突则等」,用便宜的单口阵列换来平均高吞吐。GPU 的宽 SIMD load/store、向量机、超标量取指、多发射 load/store 队列都建立在多体 + 冲突调度之上,是「用并行的存储结构喂饱并行的运算单元」的关键一环。
与现有篇目的衔接
总结
一句话总结:多体存储把一块深 SRAM 拆成 B 个可独立工作的体,当同一周期的多个访问地址落在不同体时即可并行/流水完成,用成熟单口阵列模拟多端口、避免真多口面积随端口数平方增长;地址如何映射到体是关键——高位选体(块编址)利于整行激活但相邻地址全撞同体,低位选体(交叉编址)让连续地址轮转不同体,最适合向量顺序访存和宽取指,但步长为 B 倍数时又 100% 冲突;冲突时靠错峰多拍、简单双口吸收一读一写、读多写少数据复制、编译器访存重排来处理,每体配仲裁器定本拍使用者;XOR 非线性交织让体号由地址位异或得到,可打散 FFT、矩阵等跨步访问、降低冲突率,但要按负载选择;总体上真多口保证任意地址并行却最贵,多体保证分散地址并行、冲突则等待,以低成本的平均高吞吐喂饱 GPU、向量机和超标量流水线的并行运算单元。