首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解x86/x86-64 CPU L1/L2/L3缓存和RAM中的内存更新传播

理解x86/x86-64 CPU L1/L2/L3缓存和RAM中的内存更新传播
EN

Software Engineering用户
提问于 2015-01-01 02:12:36
回答 1查看 3.2K关注 0票数 9

我试图从一般意义上理解L1/L2 (现在是L3缓存)是如何更新的,以及更新是如何在多核x86/x86-64 CPU中传播的。

假设一个4核CPU和2对L1/L2缓存,其中两个核对共享一个共同的L1/L2对,并且这两个L1/L2对之间有一个互连。缓存线的宽度为64位。所以我们有:

  1. 核心-0/核心-1关于(L1/L2)-0
  2. 核心-2/核心-3关于(L1/L2)-1
  3. (L1/L2)-0连接到(L1/L2)-1

假设有一个线程T0运行在Core-0上,它正在写入一个名为X的64位整数变量,而Core-3上还有另一个线程T1不断地读取变量X的值--请暂时忽略逻辑竞争条件。

问题:假设X被缓存在Core-0's L1中.当T0将一个新值写入X时,下面的事件序列是否正确?

  1. X的值从寄存器推送到L1-0。
  2. X的值从L1-0推送到L2-0。
  3. X的值从L2-0推到L2-1。
  4. X的值从L2-1推到L1-1。
  5. X的值从L1-0推送到RAM。

注意:步骤2和步骤4可能同时发生。

EN

回答 1

Software Engineering用户

发布于 2015-01-01 18:12:43

首先,如果你关心的是最近的(最近的5-10年,自从Nahalem?)英特尔的x86架构,那么你在你描述的缓存有点偏离。

每个核心都有自己的128 K L1缓存分割(64K数据/ 64K代码)。除此之外,每个核心都有自己的L2缓存,基本上充当L1和L3缓存之间的缓冲区。每个套接字都有自己的L3缓存(我认为最多可达20 L3)。L1和L2缓存小、简单、快速。L3缓存要大得多,也要复杂得多(它被分成几个小段,它们都与内存控制器和QPI桥接到其他套接字一样位于一个环上)。(请忽略诸如load和存储缓冲区之类的东西,这样会使这变得更加复杂。)

另外,高速缓存行是64字节.

所以看起来是这样的(例如,一台双插槽机器,每个CPU有4个核心):

代码语言:javascript
复制
Core 0 (socket 0) -> L1-0 -> L2-0 -> L3-0 -> QPI link to socket 1
Core 1 (socket 0) -> L1-1 -> L2-1 -> ^
Core 2 (socket 0) -> L1-2 -> L2-2 -> |
Core 3 (socket 0) -> L1-3 -> L2-3 -> +

Core 4 (socket 1) -> L1-4 -> L2-4 -> L3-1 -> QPI link to socket 0
Core 5 (socket 1) -> L1-5 -> L2-5 -> ^
Core 6 (socket 1) -> L1-6 -> L2-6 -> |
Core 7 (socket 1) -> L1-7 -> L2-7 -> +

前Nahalem,L2缓存是共享的核心对。我已经有一段时间没有在这方面做太多的性能工作了,所以我不太确定其中的微妙之处。

L3缓存完全包含它下面的L1和L2缓存。缓存包含所有内存地址的“正确”值。

比主存更正确,因为在进入内存(写回缓存)之前,写可以在L3中停留一段时间。所有的缓存都是连贯的。也就是说,对于同一个内存位置,您永远不会有两个不同的值。这种一致性是由一个名为MESIF的MESI协议版本来维护的(对于英特尔来说,AMD有不同的缓存策略,使用MEOSI并以不同的方式安排它们的缓存)。

由于L1和L2对核心都是私有的,所以一致性只需要在L3级别进行管理(我认为,我一直无法得到明确的答案)。高速缓存互连有四个通道:数据、请求、确认和窥探(以跟上其他内存操作)。

现在,我们可以讨论你的问题了。

如果Core 0上的线程正在读取地址,则该地址将位于L1-0和L3-0中,处于独占、共享或前向状态(这三个都表明地址未经修改和缓存)。现在,Core-4想给它写信。请求/读取所有权将从其他L3缓存(L3-0)发送缓存行,并导致其他缓存将其副本标记为无效。现在它将在L1-4和L3-1 (标记为排他性)。

(这里是忽略存储缓冲区的地方,它简化了很多。)

核心-4将从寄存器写入L1-4缓存。导致将行转换到修改状态。这将被传播到L3-1缓存(因为它是完全包含的)。

现在,Core-0想再读一遍。L1-0缓存在该地址上无效,因此它发送一个read请求,该请求丢失L3-0缓存,并导致L3-1将缓存线发送回对面。L3-1现在声明地址是共享的,L3-0将行保持为前进(最近的请求者获得转发责任)。

像泥一样干净?可能会有一些编辑,以清理一些语言,我可能太含糊了。

票数 18
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/267786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档