前言:在学习DDR刚刚打开JEDEC,就看到Prefetch(预取)和Burst Length(突发长度),这些都是什么东西,被一堆术语搞得云里雾里:
- 预取是怎么做到的?
- 突发长度到底在控制什么?
- 它们和DDR速率提升有什么关系?
本文将用通俗的语言把这两个概念解释清楚
1 核心概念Prefetch&Burst Length(BL)
在上一篇文章中,我梳理了DDR内存中Channel、Rank、Bank Group和Bank的架构层次。今天,我们将深入探究驱动DDR性能飞跃的另外两个核心机制:预取(Prefetch)和突发长度(Burst Length)。理解它们,是看懂内存性能参数的关键。
1.1 简单理解 Prefetch & BL
可以把内存系统想象成一个大型物流仓库,而Prefetch & BL定义了其内部的高效工作流程。
Prefetch:是仓库分拣系统的工作模式。它指的是,当接到一个货物请求时,仓库工人(DRAM内核)不是只拿取一件,而是一次性从货架上取出多个连续地址的货物。
Burst Length:是快递包裹的标准化尺寸。它规定了快递员(内存I/O接口)一次送货,必须按几个货物为一组进行打包和运输。
2 Prefetch&BL对于DDR的演进的影响
Prefetch是DDR不同代之间性能提升的核心驱动力。它巧妙地解决了DRAM存储单元(慢)与处理器需求(快)之间的根本矛盾。
2.1 理解DDR速率和带宽
我们经常可以看到说这个LP5X产品速率是8533/9600这样,还有提到这个DDR的总带宽可以达到多少?这实际上是在说什么意思呢?
2.1.1 DDR的等效速率
DDR的等效数据速率(即我们在规格书上看到的max frequency如“8533”)这个代表的意义是单个数据引脚每秒完成多少次的传输,可以通过一个核心公式理解:
I/O 数据速率= 核心频率 × 预取长度 × 2(上下沿都传输数据所以*2)
我们会在一些规格书上看到如下的内容,其实它表示的不是总带宽而是指每个引脚的传输率其实约等于MT/s
9600 Mbps (tWCK=0.2083 ns)
所以从公式可以看出,在核心频率提升困难的情况下,增加预取长度成为了提升接口速率最有效的杠杆。从下图可以看到在DDR演进的过程中Prefetch的增加
PS:实际产品的核心频率也会逐步提升,但预取倍数的增长是早期性能跃升的主要来源
LPDDR5X通过将预取增至16,并辅以更高核心频率和先进信号技术,实现了8533 MT/s乃至10.7 Gbps的速率。
2.1.2 DDR的带宽
DDR的总带宽,是指整个芯片所有引脚加起来,每秒能传输的数据量。
DDR理论带宽= 速率 * 位宽
例如一个有两个channel,每个channel16bit的LPDDR5X产品,他的最高速率可以达到8533Mbps, 那么他的理论带宽可以达到8533Mbps*32/8/1000≈34.1GB/s
2.2 关于BL的简单说明
Burst Length 不改变 I/O 速率或理论峰值带宽,但它通过决定每次命令传输的数据量,影响总线的有效利用率和实际能达到的有效带宽。
所以 BL 对带宽的影响是“效率层面”的——它决定了数据总线有多少时间在传有效数据,多少时间在传可能被丢弃的数据。
连续大块访问(如拷贝大文件、加载游戏场景):用长 BL,效率高
随机小访问(如数据库查询、链表遍历):用短 BL,减少浪费
3 总结
结合上一讲的内容和prefetch和BL,下面总结一下,他们对于DDR有什么影响
4 疑问以及解答
Q1: prefetch是对bank单位来说的吗?
是的,Prefetch 是以单个 Bank 为单位来实现和描述的,但它最终的效益体现在整个芯片的数据输出上。为什么是以 Bank 为单位?原因在于 Prefetch 操作发生在单个 Bank 内部的行激活和列读取过程中。访问 DRAM 的一个 Bank 有三个关键步骤:
激活(ACTIVATE):将选中的一行数据从存储阵列读取到该 Bank 的行缓冲器中。
读取/写入(READ/WRITE):从行缓冲器中选取特定的列进行数据访问。
预充电(PRECHARGE):关闭该行,为下一次激活做准备。
Prefetch 就发生在第 2 步(读操作)中。当一个 Bank 收到一个 READ 命令时,它内部的行地址译码器不仅仅选通一个列(一个存储单元),而是一次性从行缓冲器中选通连续的多个列(例如 8 个或 16 个),并将这些列对应的数据并行地传输到该 Bank 的 I/O 缓冲区中。
因此,Prefetch 长度描述的就是:单个 Bank 在一次 READ 操作中,从其行缓冲器中并行读取的连续列的数量。 不同 Bank 的 Prefetch 操作是独立的,可以并行发生(尤其在多 Bank Group 架构下)。
Q2: Prefetch怎么实现一次性拿8个?
A:关键点在于,这8个数据来自同一行(Row)里的连续8列(Column)。
· Bank激活一行后,整行数据被复制到由无数个灵敏放大器构成的行缓冲器中。
· Prefetch=8意味着,列地址解码器会同时选中8个连续的灵敏放大器,通过一条非常宽的内部数据总线(比如64位宽),将8个数据并行地送到I/O缓冲区。
· 所以,Prefetch的并行,是“从一行中并行取多列”的空间并行,而不是同时激活多行。如果数据不在同一行或者同一bank,那么就是随机读取的情况其实就没有办法一次性prefetch。