现代 x86 CPU 使用什么缓存一致性解决方案?

2024-03-29

我对缓存一致性系统在现代多核 CPU 中的功能有些困惑。我已经看到基于侦听的协议(例如基于 MESIF/MOESI 侦听的协议)已在 Intel 和 AMD 处理器中使用,另一方面,基于目录的协议对于多核来说似乎更加高效,因为它们不广播而是将消息发送到具体节点。

AMD 或 Intel 处理器中的现代缓存一致性解决方案是什么?它是基于侦听的协议(例如 MOESI 和 MESIF),还是只是基于目录的协议,或者是两者的组合(基于侦听的协议,用于同一节点内的元素之间的通信) ,以及基于目录的节点到节点通信)?


MESI 是根据监听共享总线来定义的,但现代 CPU 实际上并不是这样工作的。每个缓存行的 MESI 状态可以通过消息和窥探过滤器(基本上是一个目录)进行跟踪/更新,以避免广播这些消息,而这正是 Intel (MESIF) 和 AMD (MOESI) 实际所做的。

例如Intel CPU 中的共享包容性 L3 缓存(在 Skylake 服务器之前 https://www.guru3d.com/news-story/intel-steps-away-from-ringbus-skylake-x-sp-comminicate-through-mesh.html) 让 L3 标签充当窥探过滤器;除了跟踪 MESI 状态外,它们还记录哪个核心(如果有)拥有线路的私有副本。intel core i7 处理器使用哪种缓存映射技术? https://stackoverflow.com/questions/49092541/which-cache-mapping-technique-is-used-in-intel-core-i7-processor

例如,具有环形总线的 Sandybridge 系列 CPU(现代客户端芯片、直至 Broadwell 的服务器芯片)。核心 #0 读取一行。该线路在核心 #1 上处于修改状态。

  • 核心 #0 上的 L1d 和 L2 缓存中的读取未命中,导致在环形总线上向包含该行的 L3 切片发送请求(通过某些物理地址位上的哈希函数进行索引)

  • L3 的那部分获取消息,检查其标签。如果此时发现 tag = Shared,则响应可以通过双向环形总线返回数据。

  • 否则,L3 标记告诉它核心 #1 拥有一行的独占所有权:Exclusive,可能已提升为 Modified = dirty。

  • 该 L3 切片中的 L3 缓存逻辑将生成一条消息,要求 1 号核心写回该行。

  • 消息到达核心 #1 的环形总线站,并获取其 L2 或 L1d 写回该行。

    IDK 如果一条环形总线消息可以直接由 Core #0 以及 L3 缓存的相关切片读取,或者如果该消息可能必须一直到达 L3 切片并且then从那里到核心#0。 (最坏情况的距离 = 基本上是围绕环的所有距离,而不是双向环的一半。)

这是超级手波;做not在具体细节上请相信我的话,但发送共享请求、RFO 或写回等消息的一般概念是正确的思维模型。BeeOnRope 有一个答案 https://stackoverflow.com/questions/61129773/how-do-the-store-buffer-and-line-fill-buffer-interact-with-each-other/61143498#61143498它具有类似的细分步骤,涵盖微指令和存储缓冲区以及 MESI / RFO。


在类似的情况下,如果核心 #1 只获得了独占所有权但从未写入该行,则它可以在不修改该行的情况下默默地删除该行。 (缓存中未命中的加载默认加载到独占状态,因此单独的存储不必为同一行执行 RFO)。在这种情况下,我假设核心没有线路,毕竟必须发送一条消息来表明这一点。或者,它可能会直接向也在环形总线上的内存控制器之一发送消息,而不是往返返回 L3 切片以强制其执行此操作。

显然,每个核心都可以并行发生这样的事情。 (每个核心可以等待多个未完成的请求:单个核心内的内存级并行性。在 Intel 上,L2 超级队列在某些微架构上有 16 个条目,而有 10 或 12 个 L1 LFB。)

四插槽及更高版本的系统在插槽之间具有监听过滤器;具有 Broadwell 及更早版本的 E5-xxxx CPU 的双路 Intel 系统只是通过 QPI 链路互相窥探垃圾邮件。 (除非您在双插槽系统中使用支持四插槽的 CPU (E7-xxxx))。多插槽很难,因为缺少本地 L3 并不一定意味着需要使用 DRAM; / 其他套接字可能已修改线路。

还相关:

  • https://www.realworldtech.com/sandy-bridge/ https://www.realworldtech.com/sandy-bridge/Kanter 的 SnB 文章涵盖了一些有关英特尔环形总线设计 IIRC 的内容,尽管它主要是关于每个内核的内部结构。共享包容性 L3 在 Nehalem 中是新的(当英特尔开始使用“酷睿 i7”品牌名称时),https://www.realworldtech.com/nehalem/ https://www.realworldtech.com/nehalem/
  • 为什么 Skylake 在单线程内存吞吐量方面比 Broadwell-E 好很多? https://stackoverflow.com/questions/39260020/why-is-skylake-so-much-better-than-broadwell-e-for-single-threaded-memory-throug- 对于具有更多内核的 Intel CPU,环形总线上的更多跳数会损害 L3 和 DRAM 延迟,因此带宽 = 最大并发/延迟。
  • MOESI 缓存一致性协议相对于 MESI 有何优势? https://stackoverflow.com/questions/49983405/what-is-the-benefit-of-the-moesi-cache-coherency-protocol-over-mesi更多链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现代 x86 CPU 使用什么缓存一致性解决方案? 的相关文章

  • 与编程语言/API 相关的常用“语义”的简单定义?

    今天我突然想到 虽然我在提到语言元素和命名约定时已经采用并且不经常使用 语义 一词 但我对正式定义没有任何感觉 我试图在编程领域找到一个正式的定义 http en wikipedia org wiki Formal semantics of
  • 如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构?

    如何使用 Java 确定 Windows 是 32 位还是 64 位体系结构 我不太相信读取 os arch 系统变量 如果用户在 64 位系统上运行 64 位 JVM 则它可以工作 如果用户在 64 位系统上运行 32 位 JVM 则它不
  • FASM 是否使用 Intel 语法?

    我尝试在 FASM 中编译以下代码 mov DWORD PTR ebp 4 1234567 它给了我一个 无效表达式 错误 但是以下代码有效 mov DWORD ebp 4 1234567 那么 FASM 是否使用 Intel 语法 我假设
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • 链接描述文件未按预期跳过字节

    因此 我有这个汇编文件 我使用 GNU as 进行汇编 并使用链接器脚本与 GNU ld 进行链接 链接描述文件 boot ld INPUT boot o OUTPUT boot out ENTRY boot start SECTIONS
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 是否可以有效地计算 lambda 演算项?

    我最近用 lambda 演算编写了很多程序 我希望能够实时运行其中一些程序 然而 尽管趋势函数范式基于 lambda 演算和 B 约简规则 但我找不到一个不是玩具 不以效率为目的的评估器 函数式语言应该很快 但我所知道的那些语言实际上并不提
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 根据索引查找金字塔的行?

    给定一个像这样的金字塔 0 1 2 3 4 5 6 7 8 9 并给出金字塔的索引i where i代表i金字塔的第一个数字 有没有办法找到金字塔的行的索引i第一个元素属于 例如 如果i 6 7 8 9 它位于第 3 行 从第 0 行开始
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 现代正则表达式引擎可以解析什么样的形式语言?

    人们有时会说 你不能用正则表达式解析 X 因为 X 不是正则语言 然而 根据我的理解 现代正则表达式引擎可以匹配的不仅仅是正则语言乔姆斯基的感觉 http en wikipedia org wiki Chomsky hierarchy 我的
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 当我打开在 Xcode 4 中创建的 Google 地图项目时,Xcode 5 会警告我的架构设置

    我刚刚更新到新发布的 Xcode 5 我正在开发一个使用 Google 地图 iOS SDK 的 iOS 应用程序 当我在 Xcode 4 中开发时 我改变了我的Architectures在我的项目设置中进行设置 按照 Google 的步骤
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4

随机推荐

  • 有了websockets,AJAX还有用武之地吗?

    我目前正在使用 Node js 构建一个实时应用程序 我使用 socket io 来支持实时交互 但已加载 jQuery 因此我可以使用 AJAX 我最初使用 socket io 进行服务器和客户端之间的所有通信 我开始认为 AJAX 可能
  • 如何更改 Azure AD 上的用户主体名称

    我正在尝试使用在 Microsoft 文档中找到的 PowerShell 命令 Set MsolUserPrincipalName 更改 Azure AD 用户的用户主体名称here https learn microsoft com en
  • 如何编写将行号输出为列的查询?

    如何编写将行号输出为列的查询 这是 iSeries 上的 DB2 SQL 例如 如果我有 表披头士乐队 John Paul George Ringo 我想写一个声明 如果可能的话 不写过程或视图 这给了我 1 John 2 Paul 3 G
  • 如何从代码隐藏在新窗口或选项卡中打开页面

    所以我有一个 Web 应用程序 我可以从下拉列表中选择一个值 当选择此值时 我想在新窗口中加载另一个页面 我试过这个 ScriptManager RegisterStartupScript Page typeof Page OpenWind
  • 当我访问数组的元素时,硬件级别会发生什么?

    int arr 69 1 12 10 20 113 当我这样做时会发生什么 int x a 3 我一直有这样的印象a 3 意思是这样的 从内存地址开始arr 向前走 3 个内存地址 获取该内存地址表示的整数 但后来我对哈希表的工作原理感到困
  • 从视图模型将焦点设置在 WPF 中的 TextBox 上

    我有一个TextBox and a Button在我看来 现在 我正在检查按钮单击时的条件 如果条件结果为假 则向用户显示消息 然后我必须将光标设置到TextBox控制 if companyref null var cs new Lippe
  • 如何使用 Spring Boot 加载外部配置?

    我目前正在学习如何使用 Spring Boot 到目前为止我从未使用过像Spring这样的框架 而是直接使用文件 FileInputStream等 情况如下 我有一些动态配置值 例如 OAuth 令牌 我想在我的应用程序中使用它们 但我不知
  • Android 中如何使用 MVP 模式控制 ListView

    我目前正在使用 MVP 模式开发 Android 应用程序 当我尝试开发 Activity 时 我应该使用 ListView 所以我对 ListView 使用适配器 但我听说 Adapter 与 MVP 模式上的 Presenter 类似
  • 我们可以用jquery调用智能手机原生的分享功能吗?

    我们可以使用手机 android Iphone 本机共享功能来共享应用程序中的不同内容 是否也可以在所有智能手机中使用 JavaScript 通过浏览器调用此共享功能 这样 在浏览器中的某些事件中 我们可以加载共享小部件 Thanks 是的
  • 使用 shell 删除最旧的文件

    我有一个文件夹 var backup 其中 cronjob 保存数据库 文件系统的备份 它包含一个latest gz zip和许多旧的转储 它们的名称是timestamp gz zip 该文件夹变得越来越大 我想创建一个执行以下操作的 ba
  • Imagecreatefromjpeg 调整大小后返回黑色图像

    我有一个脚本来调整上传图像的大小 但是当我使用它时 它只返回一个黑色方块 所有的错误信息都指向这个函数 function resizeImage image width height scale newImageWidth ceil wid
  • 在 C++ 中检索 std::map 的随机关键元素

    如何在 C 中获取 std map 的随机密钥 使用迭代器 我不想维护额外的数据结构 std map迭代器是双向的 这意味着选择一个随机密钥将是O n 在不使用其他数据结构的情况下 基本上你唯一的选择就是使用std advance随机增量b
  • 无法在 OS X 上安装 netCDF4 python 包

    我正在尝试在 OS X 上安装 netCDF4pip install netCDF4我收到以下错误 usr local bin pip run on Wed Aug 7 23 02 37 2013 Downloading unpacking
  • .Net Core 3 和 EF Core 3 包含问题 (JsonException)

    我正在尝试使用 NET Core 3 和 EF Core 开发应用程序 我遇到了一个错误 但找不到解决方案 我无法在 Net Core 3 上做一个可以用 PHP eloquent 简单创建的结构 Model public NDEntity
  • 输入 if AND else 语句?

    所以我得到了这段代码 更新了解决方案 Override public View getView int position View convertView ViewGroup parent final Direction d directi
  • 公式提供属性默认值的最佳方式是什么?

    Chef 有一个非常详尽 也许太多 的食谱方案来提供属性的默认值 我认为 Puppet 对类参数做了类似的事情 默认值通常进入params pp 有了盐 我就看到了 在字典 支柱查找中指定默认值 the grains filter by将默
  • Hive 安装问题:Hive Metastore 数据库未初始化

    我尝试在树莓派 2 上安装 Hive 我通过解压缩压缩的 Hive 包安装 Hive 并在我创建的 hduser 用户组下手动配置 HADOOP HOME 和 HIVE HOME 运行 hive 时 出现以下错误消息 蜂巢 错误 Statu
  • 如何将文本环绕在右下角的 div 周围?

    每次我尝试用 CSS 做一些看似简单的事情时 它都不起作用 我有一个包含 460x160 图像的内容 div 我想要做的就是将图像放置在右下角 并将文本环绕在其周围 div img src text text text text text
  • 检查Tensorflow是否在GPU上运行

    I have read many questions and guides on how to understand if Tensorflow is running on GPU but I am still quite confused
  • 现代 x86 CPU 使用什么缓存一致性解决方案?

    我对缓存一致性系统在现代多核 CPU 中的功能有些困惑 我已经看到基于侦听的协议 例如基于 MESIF MOESI 侦听的协议 已在 Intel 和 AMD 处理器中使用 另一方面 基于目录的协议对于多核来说似乎更加高效 因为它们不广播而是