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的结构:
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