比如一个2400的内存条被两个cpu读取,两个cpu的读取速度之和是2400还是每一个cpu的读取速度都是2400


谢邀。首先澄清一下,我相信题主说的CPU是指物理CPU,即CPU package。基于此,两个CPU访问并不会冲突,因为每根内存条只有一个内存控制器MC来管理它,而那个MC它只有一个主人,也就是CPU。所谓2400的带宽只被这个MC管理,这个MC也只会被本CPU控制,不接受别的CPU管理。

我们来看一个例子:

我们分两种情况:

1.左边的CPU某个core想要访问左边某个内存条,十分简单,向ring bus(已淘汰)上的Home Agent(HA)发个命令,该HA1代理向MC1发出请求,来访问内存。整个流程近似的可以看成我用绿色标注的1的过程。

2.如果左边的那个core想要访问右边我用红框标注的目标内存条呢?实际上该内核会通过QPI访问右边的L3 cache(蓝色的3线段),如果L3中刚好有这块内容,直接就会返回结果。如果没有,该Cache会向右边ring bus上的HA2发命令,让它请求MC2访问该内存,也就是蓝色线段4。整个过程可以简单的看作绿色标注2

整个过程内存只被一个MC控制,不存在相互制约的问题。

其他内存相关文章:

老狼:伺服器最大内存是多少?制约因素有些什么呢??

zhuanlan.zhihu.com图标老狼:神秘消失的内存去哪了??

zhuanlan.zhihu.com图标老狼:内存系列一:快速读懂内存条标签?

zhuanlan.zhihu.com图标老狼:内存系列二:深入理解硬体原理?

zhuanlan.zhihu.com图标老狼:内存系列三:内存初始化浅析?

zhuanlan.zhihu.com图标老狼:Win10任务管理器中的amp;amp;amp;#34;专用GPU内存amp;amp;amp;#34;是怎么回事?「共享GPU内存」又是什么??

zhuanlan.zhihu.com图标老狼:为什么现在的电脑都这么吃内存??

zhuanlan.zhihu.com图标老狼:内存条应该怎么插?为什么要从远端插起?不遵循为啥还可以work?有啥副作用??

zhuanlan.zhihu.com图标老狼:16个内存小问题,一次全部回答!?

zhuanlan.zhihu.com图标老狼:内存的容错设计是怎样的?内存容量比你看到的更大!?

zhuanlan.zhihu.com图标

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号

按题主的语境的回答: DDR汇流排频率2400是恒定不变的,故每个CPU的访问速度都是2400, 但多个CPU之间会互相制约带宽.

其实题干本身有诸多描述模糊之处, 比如题干词"速度", 按我理解意指"平均延迟", 但题主本意可能指"性能". 然而"性能"评判指标除了"延迟", 还有"带宽"和"场景种类"等指标. 再比如题干词"CPU", 按我理解意指"一个核心(Core)", 但也可理解为"CPU Socket". 结合这些细节,结论并不是固定的。

为了描述清楚, 回答前还需要复述一遍硬体结构, 见下图(版权: https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_1/6/ ). 右侧CPU若要与左侧内存条(DIMM)通讯, 必需经过中间北桥(NB), 而内存条等效工作频率2400, 实指DIMM与NB之间的通讯频率, 即: 内存汇流排是按照2.4GHz的频率, 64bit的带宽传输数据的.

可见CPU不会直接访问内存(DIMM), 无论CPU有多少个核心(Core), 它们都需要把访问内存的需求发送给北桥(NB), 并由NB同一安排访问内存, 访问频率是固定的DDR主频. 注意当下处理器多为SoC, 其CPU, NB, SB(部分)在同一个晶元上, 销售上统称CPU. 但晶元内部上述的过程仍然客观存在.

一个CPU核心与多个核心访问一个内存条有什么不同?

一般来说,CPU-北桥之间的带宽是大于北桥-内存之间的带宽的,一个核心产生的内存事务足以填满一根2400内存的带宽(约19.2GB/s)。多个核心同时满载产生内存事务的极限带宽是远大于一根内存带宽的。这种场景下,过多的内存事务将堵塞在CPU-NB介面,及NB内部队列中,等待相对慢速的设备——DIMM读写数据。因此,整体平均访问延迟会增加,每个参与访问的核心所分到的带宽也较少。宏观上每个核心都会「变慢」。

除了访问内存的「延迟增加」,「带宽减少」,多核访问时还有隐式的「冲突增加」。这是由于一根内存(DIMM)的OpenPages是有数量上限的。一个DDR4 2Ranks的内存条一般可以同时开启16个OpenPages,目的是降低地址在同一个Page范围的内存访问延迟。单核访问时,访问地址超出这16个Pages的概率比较低。多核时,来自不同核心的地址访问容易超过16Pages范围,这些冲突使得DIMM要不断Close-Open Pages,此时DDR汇流排带宽是小於单核访问的,即所有核心一起变慢。下面是用Stream在I7-6700K上的测试数据:

从表格中能看到, 如果只插一个内存(1Dimm), 并行Core数量越多总带宽越低(17.3降至17.0). 如果多插一个Dimm构成双通道, 结论就完全不同了, 由于题干限制了"一个内存条", 这里不展开多内存通道的内容.

需要注意,此时DDR汇流排的等效工作主频仍然是2400,这是物理工作频率,不会变化。带宽下降是指汇流排上的有效数据信号变少。

来自多个Socket的CPU核心访问一个内存条的过程

参考上图,一块主板包含多个Sockets,意味著有多个NB,每个NB独立控制若干DIMM。图片上部的8个内存插槽属于上侧的SoC,下侧同理。所以位于下侧Socket的CPU若需要访问上侧内存条之前,先要经过地址路由判定,再通过Socket间汇流排。以Intel Server采用的QPI汇流排举例。

QPI互联可以参考下图(版权https://www.servethehome.com/intel-xeon-scalable-processor-family-platform-level-overview/)橙色部分(图中实为QPI升级版汇流排UPI,但基本原理相同), 一个完整的跨QPI访问路径 @老狼 的回答描述的很清晰,这里额外分析下性能。

比如Intel SKL核心的Xeon处理器的QPI互联,主频4.8GHz,单向带宽19.2GB/s,数值上等同于一个DDR4-2400内存带宽。但是QPI汇流排负载更重,除了内存访问外,还要负责所有SnoopQuery,Cache一致性判定,一次内存访问实质上会重复通过QPI几次。对汇流排的复用使得QPI实际带宽是远小于19.2GB/s的,同时也有更大的访问延迟。

假设上图左侧2Socket情况,同一时刻,两个Socket各自有一个核心要访问同一个内存条,其中需要通过QPI汇流排的核心的延迟会更大,带宽更低,表现为速度慢。这里基本谈不上DDR对多核心的制约,因为制约主要来自QPI对远程内存访问的影响。

程序行为的影响

多核访问带来的竞争影响是与程序行为非常相关。还是以同一个Socket上的2个核心运行相同程序,访问同一个内存条举例:

  • 如果是类似Stream的顺序数据访问,2个核心将平分DDR带宽,并引起少量Page冲突。这是最普遍的情况。
  • 如果是指针链表类型的访问,对内存延迟敏感,带宽不敏感,运行多个实例也不影响速度,也不会有Page冲突。
  • 如果是随机访问类型,取决于每次随机访问块的大小,块越大越接近第一种,越小越接近第二种。

最后再回复下题干: 在一个内存条的前提下, 运行大量顺序数据访问, 多个核心相互制约的情况是存在的. 这个制约的效果不大, 用户一般也感受不到. 但如果前提变化, 比如运行了随机访问, 或者使用了2Socket的2CPU, 这个制约也就不在了.


很多答案并没有说到重点。汇流排或者跨晶元的汇流排能解决相同地址冲突问题,但提问者实际上是想问会不会制约同一个内存条的读取的速度或者说总带宽。

答案是当然会制约。汇流排设计的时候,需要做交织和地址哈希,最大程度的减少同一时间的内存访问送到同一内存控制器(包括系统级缓存,如果有多片的话)。他们也许不是一个地址,但是可能会送到同一内存条。要了解如何做交织和哈希,可以看这:

https://zhuanlan.zhihu.com/p/32366520


目前比较常见的多路cpu的话,两个cpu无法读同一条内存

cpu只能读取插到自己旁边的内存

读取属于另一个cpu的内存的话只能访问另一块cpu,不能直接读取。

非x86的架构就不太清楚了。


打个比方,你和女票去旅行,每人背一个包,自己的衣服放自己包里,还有一些共用的小东西只有一份,随机放在某个包里。例如纸巾放你女票的包里,创可贴感冒药放你包里。

现在你们吃完饭要用纸巾,操作就是你女票从她包里拿出来两张,自己用一张,递一张给你。不需要你再去拿一次那么麻烦的。


推荐阅读:
相关文章