Skip to content

多模块存储器

2026 大纲 三(四)2 多模块存储器

器件快不了,就让多个器件的等待时间重叠起来

单个存储体的存储周期由器件特性决定,很难缩短。既然一次访问的延迟压不下去,那就换个目标——提高单位时间能完成多少次访问。做法是用多个结构相同的存储模块(),每个体有自己独立的地址寄存器、数据寄存器和读写控制电路,因此可以各自独立地存取。

🔴 多模块存储器一点也没有缩短存储周期。 单个体该花多久还是花多久,提高的是吞吐率——让多个体的存储周期在时间轴上互相重叠。这与流水线 CPU 不缩短单条指令的延迟、只提高吞吐率,是完全同一个道理。

但"能并行"不等于"一定并行"。四个体各干各的,前提是连续的几次访问恰好落在不同的体上;要是连着几次都撞在同一个体上,多出来的三个体只能干看着。所以关键不在有几个体,而在地址是怎么划分到体上的——这就是下一节两种编址方式的分歧点,也是本篇几乎所有题目的入口。

先动手看一眼

加载可视化中...

拨的时候盯住时序图上那几条"忙"的色带:它们是错开而重叠的,每条自己的长度(存储周期)始终没变。

一、两种编址方式

连续编址(高位交叉)交叉编址(低位交叉)
地址划分高位是体号,低位是体内地址高位是体内地址,低位是体号
4 个体、每体 4 单元时地址 0~3 在体 0、4~7 在体 1、8~11 在体 2、12~15 在体 3地址 0 在体 0、1 在体 1、2 在体 2、3 在体 3、4 又回体 0……
体内地址连续不连续,第 i 体存 i, i+m, i+2m, (按"模 m"交叉)
连续访问时一直待在同一个体里,并行能力完全用不上,吞吐率与单体相同相邻地址分布在不同体上,访问可以重叠进行
价值地址空间的整齐划分(把不同区域分配给不同用途)提速的来源
图 7.13 交叉编址的多模块存储器

图 7.13 交叉编址的多模块存储器(袁春风《计算机组成与系统结构(第 3 版)》p218)

交叉编址下有一条最常用的判据:

🔴 体号 = 地址的低 log2m 位。 判断两个地址是否落在同一个体,只需比较这几位。体数 m 取 2 的幂,"对 m 取模"才能退化成"取低 log2m 位",用连线就能实现而不需要除法电路。

高位交叉不是"错误"的设计,它的目标本就不是并行。同样的道理也出现在主存与 CPU 的连接中——片选用高位地址正是为了让片内地址连续,见 主存和 CPU 之间的连接

二、流水线访问

先分清两个时间量:T单个体完成一次存取所需的时间(存储周期),τ总线传送一个字的时间(总线周期、一拍)。当每个体一次读写的位数正好等于总线的数据位宽时,采用轮流启动方式:每隔一个总线拍启动下一个体。时序(m=4T=4τ):

时刻0τ2τ3τ4τ5τ6τ7τ
体 0启动d0
体 1启动d1
体 2启动d2
体 3启动d3
图 7.14 4 体交叉轮流访问方式

图 7.14 4 体交叉轮流访问方式(袁春风《计算机组成与系统结构(第 3 版)》p218)

看这张时序表要抓住一件事:四个体各自仍然要花满一个存储周期 T器件本身一点没变快,变化的只是启动时刻错开了、这些 T 在时间轴上互相重叠。

🔴 各体的启动间隔是总线拍 τ,不是存储周期 T 这是理解流水的关键:体的工作是重叠的,总线的传送是串行的。对外的效果就是第一个字在 T 时刻出来,此后每隔 τ 出一个。

由此得到两条最常用的结论:

读 m 个连续字: t=T+(m1)τ,无冲突条件: Tmτ

第一条要看清是 T+(m1)τ 而不是 mT——只有第一个字要等满一个存储周期,后面的都是流水出来的。第二条的道理是:轮一圈需要 mτ,回到某个体时它上一次的操作必须已经完成。T=mτ 时恰好首尾衔接、流水不断,是临界条件(教材里"每隔 1/m 个存储周期启动一个体"说的正是这种情形);T>mτ 则回头时该体仍忙,流水线断流。

判访存冲突:光"同体"还不够

给一串访问地址问"哪一对可能冲突",要同时满足两个条件,缺一不可:

  1. 两个地址落在同一个体——比较地址的低 log2m 位;
  2. 两次访问在序列中的间隔小于 m——间隔 m 时该体已经轮完一圈、恢复空闲,接得上;间隔 <m 时前一次还在忙。

所以一串地址里同体的配对往往有好几对,真正冲突的只是那些挨得太近的。判题时先按 mod m 给每个地址标体号,再在同体的那些位置之间数间隔,间隔恰好等于 m 的那一对是"刚恢复就接上",不冲突。

一次访问要占几个存储周期

另一类问法是给一个具体地址和一个数据长度,问读它需要几个存储周期。做法分两步:先看一次并行访问能覆盖哪几个字节m 个体各出 b 位,一次覆盖的是一段对齐mb/8 字节),再看该数据跨了几个这样的段

举例:4 体交叉、每体 8 位、总线 32 位,则一次覆盖 4 字节且边界对齐到 4 的倍数。一个 8 字节的 double 若起始地址除以 4 余 2,它占的字节会横跨 [24,27][28,31][32,35] 三段,因此要 3 个存储周期;若起始地址本身是 4 的倍数,则只需 2 个。没对齐会多出一次访问,这与 位扩展的物理结构 是同一件事的两种问法。

三、带宽的三种计算口径

这是本节最容易混淆的地方——"最大带宽"与"读一组字的平均带宽"是不同的量,数值差别不小

求什么用哪个含义
最大 / 稳态 / 峰值带宽Bmax=mWT=m×WT流水线满载之后每隔 T/m 就有一个字输出,即单体带宽的 m 倍(W 为字宽)
连续读 m 个字的时间或其平均带宽t=T+(m1)τB¯=mWt第一个字的 T躲不掉的启动代价
已给出送地址时间的一次突发访问t=τ地址+T+mτ送首地址 + 第一个体准备好 + m 个字各占一拍

三者的差别全在"那一个启动的 T 算不算进去"。问"最大 / 峰值带宽"时不算(假定流水已满载),问"读这一组字的平均带宽"时要算,所以后者的加速倍数一定小于 m;读的字数越多,这个代价摊得越薄,m 时两者相等。

三种口径各代一组数:为什么加速比只有 2.29 而不是 4,突发访问为什么只等一个存储周期(想核对自己会不会把口径用串时展开)

(一)稳态最大带宽。 4 体交叉,T=50 ns,数据总线 32 位(W=4 B):

Bmax=4×4 B50 ns=320 MB/s

单体只有 4 B/50 ns=80 MB/s。

(二)读一组 m 个字的平均带宽。 4 体,T=200 ns,τ=50 ns,W=4 B,连续读 4 个字:

t=200+3×50=350 ns,B¯=16 B350 ns45.7 MB/s

单体读 4 个字需 4×200=800 ns,加速比 800/3502.29 倍——不到 m=4,因为启动那一个 T 被摊进了平均值。读的字数越多摊得越薄,越接近口径一的上限。

(三)含送地址时间的突发传送。 8 体交叉,送首地址 5 ns,存储周期 40 ns,总线一拍 5 ns,每字 4 B,读 32 B(8 个字):

t=5+40+8×5=85 ns

要点是:8 个体的准备工作是重叠的,只需等第一个体的 40 ns,而不是 8×40=320 ns。

(四)判断两个地址是否同体。 8 体交叉编址,0x1F400x1F48:8 体需看低 3 位,十六进制末位即为低 4 位。

0x1F40: 0=00002低 3 位=000体 00x1F48: 8=10002低 3 位=000体 0

两者同体;若这两次访问在序列中挨得比 8 拍近,就会冲突。

四、什么时候交叉编址帮不上忙

⚠️ 交叉编址只对连续访问有效。 随机访问时地址落在哪个体是随机的,可能连续撞在同一个体上,此时与单体无异;即使地址连续,多个访问源(如指令预取与数据访问同时进行)仍可能争用同一个体。

还有一个概念关系要理顺:位扩展并联的多片芯片算不算多体交叉?从物理连接看是同一件事的两种描述。若上层按字节编址而每片一次只出 1 字节,则字节地址的低 log2k 位就决定落在哪一片。差别只在观察粒度——位扩展关注"各片合起来凑成一个字",交叉编址关注"相邻地址落在不同片"。判断题里说某内存条"采用多模块交叉编址方式",说的正是这一层。

考点速记

  1. 多模块存储器是空间并行技术,提高吞吐率而非缩短单体存储周期连续编址(高位交叉)体号取高位、体内地址连续、无法并行,交叉编址(低位交叉)体号取低位、相邻地址在不同体、支持流水线访问。体号 = 地址的低 log2m
  2. 各体的启动间隔是总线拍 τ 而非存储周期 T;读 m 个连续字的时间 =T+(m1)τ无冲突条件 Tmτ,等号成立时流水恰好不断流。
  3. 最大带宽 =mW/T 是单体的 m 倍;读一组字的平均带宽含启动代价,倍数一定小于 m。交叉编址只对连续访问有效。

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 给一串访存地址,问哪一对可能发生冲突:先按 mod m 标出每个地址的体号,再在同体的位置之间数间隔。同体且间隔 <m 才冲突;间隔恰好等于 m 是"刚恢复就接上",不冲突。⚠️ 只看同体不看间隔会多选。
  • 给一个地址和数据长度,问读它需要几个存储周期:一次并行访问覆盖的是一段对齐mb/8 字节,数该数据跨了几段。起始地址不对齐会多出一次。
  • 给若干芯片交叉编址,问哪个地址与某地址在同一芯片:比较低 log2m 位,把十六进制末位展开成二进制去取。
  • 大题里算突发传送一次要多久τ地址+T+mτ。要点是各体的准备是重叠的,只等第一个体的 T
  • 大题里问四体低位交叉的最大带宽:"每 1/m 个存储周期启动一个体"即 T=mτ,最大带宽 =mW/T

易错:把读 m 个连续字的时间算成 mT。只有第一个字等满 T,其余每隔 τ 出一个。

易错:判冲突只比体号不看间隔。间隔 m 的同体访问不冲突。

易错:把"最大带宽"和"读一组字的平均带宽"混用。前者不含启动代价、是单体的 m 倍,后者含、必定小于 m 倍。

易错:以为多体交叉缩短了存储周期。它只让多个存储周期重叠,单体的 T 一点没变。

教材出处
  • 袁春风《计算机组成与系统结构(第 3 版)》§7.2.6 多模块存储器:连续编址与交叉编址的地址划分、轮流启动方式、图 7.13 与图 7.14(p217~218)

相关知识

主存和 CPU 之间的连接DRAM 芯片与内存条半导体随机存取存储器

真题练习