多模块存储器
DRAM 的存取周期降不下来,但存取周期里有很大一段是”恢复时间”,这段时间存储体在忙、总线却是空的。多模块存储器的全部思路就是:再造几个存储体,让一个体在恢复时另一个体在传数据,把总线填满。
它提高的是带宽,不是延迟——任何一次单独的访问仍然要等一个完整的存取周期。这是 3.1.2 那张表的第三行,也是本节所有判断题的核心。
这一节还是全章术语最容易打架的地方:位扩展、单体多字、多体交叉三个词描述的是三件不同的事,而它们在同一道题里可以同时出现。
机制
单体多字存储器
一个存储体,把存储字长做成
- 带宽提高
倍,存取周期不变 - 前提是指令和数据在主存中连续存放
- 遇到转移指令或非连续的数据访问时,取出的
个字里有一部分白读了,效率下降 - 一次只能读出同一个字组内的字,无法同时读两个不相邻的字
多体并行存储器
每个体都是一个完整的存储器,有自己的读写控制电路、地址寄存器和数据寄存器,能独立工作。这句话是”多体”的定义,也是判断一个结构算不算多体的唯一标准。
按地址的哪一部分做体号,分成两种编址:
高位交叉编址(顺序方式):地址的高位是体号,低位是体内地址。
低位交叉编址(交叉方式):地址的低位是体号,高位是体内地址。
flowchart TB subgraph H["高位交叉(顺序方式)· 4 体"] H0["体 0<br/>地址 0~3"] --- H1["体 1<br/>地址 4~7"] --- H2["体 2<br/>地址 8~11"] --- H3["体 3<br/>地址 12~15"] end subgraph L["低位交叉(交叉方式)· 4 体"] L0["体 0<br/>0,4,8,12"] --- L1["体 1<br/>1,5,9,13"] --- L2["体 2<br/>2,6,10,14"] --- L3["体 3<br/>3,7,11,15"] end H -.->|"连续访问全落在一个体<br/>不能重叠"| X["扩容 / 多机共享"] L -.->|"连续访问轮流落体<br/>可流水"| Y["提高带宽"] classDef good fill:#d5f5e3,stroke:#27ae60 classDef plain fill:#fdebd0,stroke:#e67e22 class Y,L good class X,H plain
低位交叉的时序与两个公式
设存储周期为
体数的下界:要让流水线不出现空拍,必须在第 0 体忙完
取
连续读取
第一个字要等一个完整的存储周期
作为对照,顺序方式(高位交叉)读
边界
疑问点:位扩展和多模块交叉编址是不是同一件事
这个疑问来自一道具体的题,题干与选项如下:
某存储器总线的宽度是 64 位,用 8 个
位的 DRAM 芯片扩展构成 位的内存条,按字节编址,支持突发传送方式。 double变量的主存地址为 2026 0000H,int变量的主存地址为 2026 1006H,下列叙述中错误的是: A. 该内存条可不采用多模块交叉编址 B. DRAM 芯片的行缓冲采用的是 SRAM C. 读取变量只需要一个存取周期 D. 读取变量 需要两个存取周期 先把 B、C、D 各自验证一遍,这三条都是独立可判的硬结论:
B 正确。 行缓冲要在一次行激活后长时间保持整行数据并被反复列访问,电容做不到,行缓冲由 SRAM 型单元构成(见 3.2.1)。 C 正确。 内存条一次提供 64 位 = 8 B;
是 double(8 B),地址…0000H是 8 的倍数,恰好落在一个 8 B 访问单元内,一个存取周期读完。 D 正确。是 int(4 B),地址…1006H除以 8 余 6,占用字节偏移 6、7、8、9,跨了…1000H~1007H和…1008H~100FH两个访问单元,需要两个存取周期。这正是 2.3.4 边界对齐的直接应用。B、C、D 都对,所以答案只能是 A。这一点没有争议。
边界辨析:这道题的答案可以记,它的解析不能记
教辅给 A 的理由是:“内存条一次向计算机提供 8 B 的数据,每个 DRAM 芯片提供 1 B 的数据,因此一定采用多模块交叉编址。” 这个理由与王道正文自己对”多体并行存储器”的定义相冲突。 正文要求各体有独立的读写控制电路、地址寄存器和数据寄存器,能独立工作;而这 8 片芯片共用地址线、共用片选,每次必须同进同退,恰恰不具备独立性。按正文的定义,它们是位扩展构成的单体多字结构,不是多体。
但也不能说这个理由纯属胡说,它对了一半: 按字节编址时,第
片芯片持有的正是所有地址 的字节——字节地址在 8 片之间的分配形式,确实就是”低位交叉”。 真正的问题在于”多模块交叉编址”这个词组携带了两层含义,而这道题的解析取了其中一层:
层面 问的是 本题成立吗 编址形式 地址的低位是不是用来区分模块 成立(字节地址低 3 位选片) 访问方式(实质义) 各模块能不能独立、重叠地工作 不成立(8 片必须同步) 考场上一律用实质义:判断”是不是多模块交叉存储器”,看各模块有没有独立的读写控制电路、能不能重叠访问。这是王道正文、唐朔飞教材和统考真题的统一口径。 这道题记住答案 A 即可,它的推理不要带回 3.3.2——把”8 片并联凑数据线”当成交叉编址,会把位扩展的概念彻底污染。 “好不严谨”这个判断是对的,而且指向准确:不严谨的不是答案,是同一个术语在同一本书里被用作了两个意思。
三个词的分工,务必固定下来:
| 术语 | 回答的问题 | 在哪一节 |
|---|---|---|
| 位扩展 | 为什么要用 8 片——凑够数据线宽度 | 3.3.2 |
| 单体多字 | 一次访问读出多少个字——一个体、宽字长 | 本节 |
| 多体交叉 | 几个体能不能重叠工作——独立控制电路 | 本节 |
低位交叉不改变单次访问的存取周期。 判断题若说”多体交叉存储器缩短了存取周期”,错;说”提高了存储器的带宽/工作速度”,对。
体数超过
高位交叉不能提高连续访问的速度。 它的价值在扩容和多机共享,把它当成提速手段是最常见的错配。
计算模板:突发传送综合题
这类题把交叉存储器、总线时钟、Cache 缺失串在一起,步骤是固定的。 以下面这道为例:
32 位计算机,CPU 主频 800 MHz,Cache 命中时的 CPI 为 4,Cache 块大小 32 B;主存采用 8 体交叉,每体存储字长 32 位,存取周期 40 ns;存储器总线宽度 32 位,总线时钟频率 200 MHz,支持突发传送。每次读突发传送总线事务包括:传送首地址和命令、存储器准备数据、传送数据;每次突发传送 32 B,传送地址或 32 位数据均需一个总线时钟周期。
第一步:把两个时钟周期先算出来。
CPU 时钟周期
第二步:数需要几个总线事务。 Cache 块 32 B,每次突发传送 32 B → 1 个读突发传送事务。
第三步:拆一次事务的三段,全部折算成总线时钟周期。
| 段 | 用时 | 折算 |
|---|---|---|
| 传送首地址和命令 | 1 个总线周期 | 1 拍 |
| 存储器准备数据 | 一个存取周期 40 ns | |
| 传送 32 B 数据 | 8 拍 |
合计
第四步:把缺失代价加到 CPU 执行时间上。 设执行 100 条指令,平均每条访存 1.2 次,缺失率 5%。
边界辨析:第四步里"命中时的 CPI"已经包含了命中的访存时间
这是这类题唯一真正的陷阱。题目给的是”Cache 命中时的 CPI 为 4”,这个 4 已经把命中情况下的取指和访存全部算进去了,所以
是”假设全部命中”时的完整执行时间。 缺失惩罚是在此之上额外叠加的,不能再去乘一遍 CPI,也不能把命中时的访存时间再单独加一次。 另外两个高频错误: 缺失次数按访存次数算,不是按指令条数算——是 ,不是 。 缺失代价用的是一次完整总线事务的时间(85 ns),不是存取周期(40 ns)——因为 CPU 等的是整块 32 B 到位,而不是第一个字到位。
对照速查
| 结构 | 体数 | 独立控制电路 | 提高什么 | 连续访问能否重叠 |
|---|---|---|---|---|
| 单体多字 | 1 | — | 带宽 | — |
| 高位交叉 | 有 | 容量组织 | 否 | |
| 低位交叉 | 有 | 带宽 | 是 | |
| 位扩展 | 1( | 无(共用片选) | 字长 | 否 |
| 公式 | 用途 |
|---|---|
| 交叉体数的下界,取等号为最佳交叉 | |
| 低位交叉连续读 | |
| 顺序方式连续读 |
考点
- 多体的定义是”各体有独立的读写控制电路,能独立工作”
- 低位交叉提高带宽,高位交叉用于扩容和多机共享
;体数超过 不再提速- 低位交叉连续读
个字用时 ,首字延迟不变 - 交叉编址不缩短存取周期
- 位扩展 ≠ 多体交叉:位扩展的各片共用片选、必须同步
- 单体多字要求指令数据连续存放,遇转移则效率下降
- 突发传送事务 = 传地址 + 准备数据 + 传数据,三段分别折算成总线周期
- “命中时的 CPI”已含命中访存时间,缺失代价另加
链接
- 🏠 返回总览:计算机组成原理第 3 章:存储系统总览
- ⬅️ 上一节:3.2.3 主存储器的基本组成
- ➡️ 下一节:3.3.1 连接原理
- 🔗 3.3.2 主存容量的扩展(位扩展的正确位置)
- 🔗 2.3.4 数据的大小端和对齐存储(跨访问单元的判据)
- 🔗 第 6 章 总线(突发传送事务的完整定义)
- 📖 名词库:第 3 章名词库