跳转至

内存模型

DRAM参考

DRAM1 DRAM2 DRAM3

示例:硬件基础配置

  1. CPU & 内存控制器 (MC)

    • 64位数据总线。
    • 集成DDR4内存控制器(MC)。
    • 三级缓存,缓存行大小为 64 字节
  2. DRAM 模块

    • 1个Rank,由8个 DRAM芯片组成。
    • 每个芯片规格:
      • 位宽: x8 (对外接口 DQ[7:0])。
      • Bank数量: 8个
      • 每个Bank结构: 由64个Mat(子阵列) 构成。
      • 每个Mat结构: 32768行 x 128列
      • 行缓冲器大小64 Mats * 128 bits = 8192 bits
    • 操作模式: 突发长度 BL = 8

读取int流程

前提:CPU执行 int value = my_array[0];,发生缓存未命中(Cache Miss)。

  1. 地址生成与转换

    • CPU计算出my_array[0]虚拟地址(VA)
    • 通过查询页表(TLB/MMU),将VA转换为物理地址(PA) 0x12345678
  2. MC解码与命令下发

    • MC将PA解码为DRAM坐标:Rank 1, Bank 2, Row 0x456, Column 0x78
    • MC向 Rank 1 发送 ACTIVE 命令:Bank 2, Row 0x456
  3. DRAM行激活 (高延迟操作)

    • Rank 1内所有8个芯片同步行动,操作各自的 Bank 2
    • 每个芯片的64个Mat并行工作,将0x456的数据读取到各自的感应放大器中。
    • 此时:每个芯片的Bank 2行缓存中拥有 64 * 128 = 8192 位数据。
    • 耗时tRCD 延迟。
  4. 列读取与突发传输

    • 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字节) 数据。
  5. 数据交付与缓存填充

    • MC 收到完整的 8周期 * 64位/周期 = 512位(64字节) 缓存行数据。
    • MC 根据初始列地址 0x78,从64字节中提取出所需的4字节int,送入CPU寄存器。
    • MC整个64字节数据写入CPU缓存,利用空间局部性原理优化后续访问。

核心要点:此过程展现了极致的并行化(多芯片、多Bank、多Mat)与流水线操作(行激活与列传输重叠),以分摊高昂的行激活延迟,实现高带宽。


地址对齐的本质

  1. 现象:要求变量地址是其类型大小的整数倍(如int对齐到4字节)。
  2. 根本目的:确保内存访问不跨越DRAM行边界,从而避免MC将一次访问拆分为多次操作。
  3. 责任划分
    • 编译器:通过“自然对齐”规则分配变量地址,从源头上降低跨行概率。
    • 内存控制器 (MC):是处理此问题的最后防线。当遇到可能跨行的未对齐访问时,MC负责将其拆分为多次行激活/读取操作,并在内部拼接数据。此过程带来巨大性能惩罚。
    • DRAM芯片完全不在乎对齐。它只机械地执行行列命令,输出指定地址的数据。对齐是MC为了优化性能而提出的概念,对DRAM透明。
  4. 结论:地址对齐是软硬件协同的一种策略,旨在规避硬件(DRAM行结构)带来的性能陷阱,其本质是性能优化手段

内存交织

  1. 是什么:一种由内存控制器实现的、将连续的物理地址空间映射到不同的物理Bank(甚至Rank或Channel) 上的策略。
  2. 如何工作
    • 例如,地址 Addr0 映射到 Bank 0Addr1 映射到 Bank 1Addr2 映射到 Bank 2,...,Addr7 映射到 Bank 7Addr8 映射回 Bank 0
  3. 为何需要
    • 避免Bank冲突:连续访问不会集中于同一Bank,从而允许对多个Bank进行并行流水线操作。
    • 隐藏延迟:当Bank 0在进行当前访问的数据传输时,MC可以同时向Bank 1发送预充电和行激活命令,完美隐藏tRPtRCD延迟。
  4. 效果:对于顺序访问(如遍历数组),内存交织能大幅提升有效带宽,使内存系统性能接近峰值。它是实现Bank级并行(Bank-Level Parallelism) 的关键。