4. DRAM页策略基础:从组织结构到延迟影响

各位同学,今天我们来聊聊DRAM的页策略。说实话,这个知识点在CMN监听过滤器的优化中特别关键。我当年第一次接触这个时,觉得不就是内存读写嘛,有什么好研究的?直到我在一个高性能计算项目中,发现系统性能怎么都上不去,最后定位到是DRAM页策略和监听过滤器没配合好——嗯,从那以后我再也不敢小看这个基础了。

4.1 DRAM的组织结构:Bank、Row、Column

先说说DRAM内部长什么样。你想想看,DRAM就像一个巨大的表格,但这个表格不是一维的,而是三维的。

  • Bank:DRAM芯片内部独立的存储阵列。一个DDR4芯片通常有8个或16个Bank。每个Bank可以独立操作,这是并行性的基础。
  • Row:每个Bank里的行。行是DRAM访问的基本单位,一次激活操作会把整行数据读到Sense Amplifier(感测放大器)中。
  • Column:行里的列。列决定了你具体要读哪个数据。

我习惯用一个比喻来理解:Bank就像一栋楼的楼层,Row是每层楼的走廊,Column是走廊上的房间号。你要访问某个房间,得先到对应楼层(Bank),然后走到对应走廊(Row),最后找到房间号(Column)。

关键点:DRAM的最小访问粒度是Row,不是Column。一次ACT(激活)命令会把整行数据搬出来,然后你才能通过CAS(列选通)命令读取其中的某几列。

这里我画了一张图,帮你直观理解DRAM的结构:

DRAM组织结构示意图 Bank 0 Row 0 Row 1 Row 2 ... Row N Col 0 Col 1 Col 2 ... Col M Bank 1 Row 0 Row 1 ... Row N Sense Amplifier(行缓冲区) Row(行) Sense Amplifier

4.2 页命中与页冲突

好,理解了结构,我们来看两个核心概念:页命中(Page Hit)和页冲突(Page Conflict)。

页命中:你要访问的数据正好在当前Bank的Sense Amplifier里(也就是当前打开的Row)。这种情况下,你只需要发一个CAS命令就能拿到数据,延迟很低。

页冲突:你要访问的数据不在当前打开的Row里。这时候你得先发一个PRE(预充电)命令关闭当前Row,再发ACT命令打开目标Row,最后才能发CAS读数据。多了两步操作,延迟自然就上去了。

我的经验:在CMN系统中,监听过滤器如果能感知到DRAM的页状态,就可以提前做预取或调度,减少页冲突的概率。我曾经在一个项目中,通过让监听过滤器优先命中已打开的行,把系统延迟降低了约15%。

这里有个表格,对比页命中、页冲突和页未命中(空Bank)的延迟差异:

场景 操作序列 相对延迟 典型延迟(DDR4-3200)
页命中 CAS → 数据 1x ~13.75ns
页未命中(空Bank) ACT → CAS → 数据 2x ~27.5ns
页冲突 PRE → ACT → CAS → 数据 3x ~41.25ns

注意:页冲突的代价比你想象的大得多。我曾经见过一个案例,因为页冲突率从10%飙升到40%,整个系统的内存带宽直接腰斩。所以,页策略不是小事。

4.3 页策略:Open Page vs Close Page

DRAM控制器有两种基本的页策略:Open Page和Close Page。说白了,就是「用完行之后,要不要关掉它」的问题。

Open Page策略

访问完一个Row后,不关闭它,保持Sense Amplifier里的数据。如果下一个请求还是访问同一行,那就是页命中,爽歪歪。

  • 优点:空间局部性好时,页命中率高,延迟低。
  • 缺点:如果访问模式是随机的,页冲突率会很高,反而更慢。

Close Page策略

每次访问完Row后,立即执行PRE命令关闭它。下一个请求来的时候,不管访问哪一行,都得重新ACT。

  • 优点:避免了页冲突的惩罚,适合随机访问模式。
  • 缺点:即使有空间局部性,也无法利用页命中,白白浪费了机会。

我的建议:没有绝对的好坏。Open Page适合流式访问、顺序访问的场景;Close Page适合随机访问、多线程竞争的场景。关键是要根据你的工作负载来选。

4.4 页策略对延迟的影响

页策略直接影响DRAM的访问延迟。我们来看一个具体的计算例子。

假设DDR4-3200的时序参数:

  • tRCD(行地址到列地址延迟):13.75ns
  • tCL(列选通延迟):13.75ns
  • tRP(行预充电延迟):13.75ns

那么:

  • 页命中延迟 = tCL = 13.75ns
  • 页未命中延迟 = tRCD + tCL = 27.5ns
  • 页冲突延迟 = tRP + tRCD + tCL = 41.25ns

你看,页冲突比页命中多了整整27.5ns。在CPU主频3GHz下,这相当于80多个时钟周期。你想想看,如果监听过滤器频繁触发页冲突,那延迟会多可怕。

避坑指南:我曾经在一个项目中,发现监听过滤器的预取请求总是和CPU的请求冲突,导致页冲突率飙升。后来我调整了预取策略,让预取请求尽量在CPU空闲时发出,页命中率从60%提升到了85%。

最后总结一下:DRAM的页策略不是孤立存在的。在CMN系统中,监听过滤器的行为会直接影响DRAM的页命中率。理解Bank、Row、Column的结构,掌握页命中与页冲突的代价,选择合适的页策略,这些都是我们后续优化联动的基础。

嗯,这一章就到这里。记住,页策略的选择没有银弹,关键是要理解你的工作负载特征。


公众号:蓝海资料掘金营,微信deep3321