内存模型
DRAM参考
示例:硬件基础配置
-
CPU & 内存控制器 (MC):
- 64位数据总线。
- 集成DDR4内存控制器(MC)。
- 三级缓存,缓存行大小为 64 字节。
-
DRAM 模块:
- 1个Rank,由8个 DRAM芯片组成。
- 每个芯片规格:
- 位宽: x8 (对外接口
DQ[7:0]
)。 - Bank数量: 8个。
- 每个Bank结构: 由64个Mat(子阵列) 构成。
- 每个Mat结构: 32768行 x 128列。
- 行缓冲器大小:
64 Mats * 128 bits = 8192 bits
。
- 位宽: x8 (对外接口
- 操作模式: 突发长度 BL = 8。
读取int流程
前提:CPU执行 int value = my_array[0];
,发生缓存未命中(Cache Miss)。
-
地址生成与转换:
- CPU计算出
my_array[0]
的虚拟地址(VA)。 - 通过查询页表(TLB/MMU),将VA转换为物理地址(PA)
0x12345678
。
- CPU计算出
-
MC解码与命令下发:
- MC将PA解码为DRAM坐标:
Rank 1, Bank 2, Row 0x456, Column 0x78
。 - MC向 Rank 1 发送 ACTIVE 命令:
Bank 2, Row 0x456
。
- MC将PA解码为DRAM坐标:
-
DRAM行激活 (高延迟操作):
- Rank 1内所有8个芯片同步行动,操作各自的 Bank 2。
- 每个芯片的64个Mat并行工作,将第
0x456
行的数据读取到各自的感应放大器中。 - 此时:每个芯片的Bank 2行缓存中拥有
64 * 128 = 8192
位数据。 - 耗时: tRCD 延迟。
-
列读取与突发传输:
- MC发送 READ 命令:
Bank 2, Column 0x78, BL=8
。 - 每个传输周期(共8个周期):
- 列地址递增: 当前周期列地址 =
0x78 + N
(N从0到7)。 - Mat并行抓取: 所有64个Mat根据当前列地址,并行地从自己的行缓冲中抓取1位数据。
- IO路由与发送: 每个芯片的IO Gating电路从64个Mat送来的64位数据中,根据硬连线规则为8个DQ引脚各选1位,送出8位。
- Rank并行传输: 8个芯片同时进行上述操作,在一个周期内于64位数据总线上共同形成 64位(8字节) 数据。
- 列地址递增: 当前周期列地址 =
- MC发送 READ 命令:
-
数据交付与缓存填充:
- MC 收到完整的
8周期 * 64位/周期 = 512位(64字节)
缓存行数据。 - MC 根据初始列地址
0x78
,从64字节中提取出所需的4字节int
,送入CPU寄存器。 - MC 将整个64字节数据写入CPU缓存,利用空间局部性原理优化后续访问。
- MC 收到完整的
核心要点:此过程展现了极致的并行化(多芯片、多Bank、多Mat)与流水线操作(行激活与列传输重叠),以分摊高昂的行激活延迟,实现高带宽。
地址对齐的本质
- 现象:要求变量地址是其类型大小的整数倍(如
int
对齐到4字节)。 - 根本目的:确保内存访问不跨越DRAM行边界,从而避免MC将一次访问拆分为多次操作。
- 责任划分:
- 编译器:通过“自然对齐”规则分配变量地址,从源头上降低跨行概率。
- 内存控制器 (MC):是处理此问题的最后防线。当遇到可能跨行的未对齐访问时,MC负责将其拆分为多次行激活/读取操作,并在内部拼接数据。此过程带来巨大性能惩罚。
- DRAM芯片:完全不在乎对齐。它只机械地执行行列命令,输出指定地址的数据。对齐是MC为了优化性能而提出的概念,对DRAM透明。
- 结论:地址对齐是软硬件协同的一种策略,旨在规避硬件(DRAM行结构)带来的性能陷阱,其本质是性能优化手段。
内存交织
- 是什么:一种由内存控制器实现的、将连续的物理地址空间映射到不同的物理Bank(甚至Rank或Channel) 上的策略。
- 如何工作:
- 例如,地址
Addr0
映射到Bank 0
,Addr1
映射到Bank 1
,Addr2
映射到Bank 2
,...,Addr7
映射到Bank 7
,Addr8
映射回Bank 0
。
- 例如,地址
- 为何需要:
- 避免Bank冲突:连续访问不会集中于同一Bank,从而允许对多个Bank进行并行流水线操作。
- 隐藏延迟:当
Bank 0
在进行当前访问的数据传输时,MC可以同时向Bank 1
发送预充电和行激活命令,完美隐藏tRP
和tRCD
延迟。
- 效果:对于顺序访问(如遍历数组),内存交织能大幅提升有效带宽,使内存系统性能接近峰值。它是实现Bank级并行(Bank-Level Parallelism) 的关键。