这是内存基础知识系列的第20篇,你可以在 基础软件开发 ,找到前19篇。
一个Line 64字节。上一篇的测试中,我读了3个Line,在BG层观察流量的结果,这3个Line是如下分布的:
一个Chip包含 4 个BG(BankGroup),每个BG又包含4个Bank。
流量测试程序发起的3个Line的读请求,如图2所示,第1个Line来自于BG 1; 第二个Line来自于BG 0; 第三个Line又回到BG 1。
在BG层,流量以64字节为单位,也就是以Line为单位了,在两个BG间来回切换。
内容控制器(MC)以Line(64字节)为单位,轮流使用BG,可以更好的分散压力、提升吞吐、缩短延迟。
让多个BG一起工作,一个BG正在行选通时,另一个可以CAS,等等。
(注:行选通、CAS这些名词在内存系列前10篇中有详细介绍)
但是,一个Chip中有4个BG,图2中也有表现这一点。为什么只使用了其中的两个呢?
为什么不在4个BG中来回切换呢?4个BG轮流用,压力不是更分散吗?
原因很简单,如果你仔细阅读了本系列前面所有文章,自然就知道,内存条在现有主频、制程工艺限制下,搞了很多花招提升性能、吞吐。这其中最重要的有两个:
row buffer来自于Memory Array,前面有过详细解读,这里不再重复。简单总结下,Memory Array列大小1024bit,单个row buffer也是1024bit。一个RANK所有Bank中row buffer合起来,就是8KB。
每次内存读写,都要把8KB读到Row Buffer中,再从row buffer读出(或写入)目标列的数据。(然后row buffer中的数据会再写回对应的行)
如果只从单一一个BG、Bank连续的读,可以最大程度使用Row Buffer,省去了“行选通”过程,只需要CAS,从row buffer中读出目标列数据即可。
但只使用一个BG/Bank,又无法利用“多BG”分散压力。
我想表达的是,多BG和Row Buffer,是相反的两个特性。前者要求分散,后者要求聚集、连续。
主频的提升,是普适的。当主频提升有限,或不再提升时。依赖各种特性的提升,很多是相冲突的。内存是这样,CPU也一样。
内存控制器在这里做了个折中,Chip中不是有4个BG吗,我只使用2个。
在8KB内,以Line为单位,在两个BG中轮流切换。既要分散,也不要太分散。
页大小不是8KB吗,因为流量被分散到了两个BG中,因此我只使用4KB。
如果使用4个BG,只使用row buffer的四分之一,row buffer的利用不是特别充分。Row Buffer利用充分了,多BG又没用上。
所以,就在二者间做个折中。4个BG只用2个,8KB row buffer只使用一半。
这就是内存控制器选择的策略。MC其实认为我们并不会经常性的、连续的读写。
但是,我如果真的想连续的读写内存呢?所有Bank已经把总计8KB加载到Row Buffer中了,读完前4KB后,后4KB弃之不用,因为后4KB对应的物理地址,可能和前4KB离的很远。
在了解了这些硬个特性后,只要合理的安排数据,可以完整的读(写)完Row Buffer,在当今无法突破的内存墙下,还是可以有点提升的。
或者把数据分散到4个BG中,最大化的利用多个BG提升吞吐,也是有提升的。
MC在做了个折中,我们可以根据我们的情况,在聚或散上,做到极致,更充分发挥硬件潜能。
本篇先到这儿,后续我们逐步揭晓,如何在现有硬件条件下,最大化利用硬件潜能。
最后附上内存系列前18篇,包括NUMA系列(NUMA的基础知识马上就要用到了);
内存基础知识(十五)-- 使用perf分析内存流量瓶颈
内存基础知识(十六)-- Rank/Chip/BG/Bank,软硬结合彻底搞懂内存底层结构
内存基础知识(十七)-- 什么是内存地址
内存基础知识(十八)-- 虚拟地址/物理地址/内存地址, 有何不同
另外,我之前还写过一个 NUMA 系列,NUMA相关的基础知识,马上也要用到了:
NUMA的逆行人生:一文讲清什么是NUMA
NUMA的逆行人生:一文讲清什么是NUMA(第二弹)
NUMA的逆行人生:一文讲清什么是NUMA(第三弹)
NUMA的逆行人生:一文讲清什么是NUMA(第四弹)
NUMA的逆行人生:一文讲清什么是NUMA(第五弹)
NUMA的逆行人生:一文讲清什么是NUMA(大结局)
还有这个系列,讲CPU执行阶段流水线的,虽然和内存没有直接关系,但个人感觉相当不错,值得阅读:
跟着苍老师学体系结构:深入突破基础软件开发(一)
深入突破基础软件开发(二)
深入突破基础软件开发(三)
深入突破基础软件开发(大结局)