MSI:为什么当其他CPU要覆盖该行时我们需要写回该行?

2023-12-26

在 Hennessy/Patterson 所著的《计算机架构》一书中,第 5 版,第 360 页,他们描述了 MSI 协议,并写道:

如果线路处于“独占”(已修改)状态,则在从总线接收到“写入未命中”时,当前 CPU 1) 将该线路写回总线,然后 2) 进入“无效”状态。

如果该行无论如何都会被另一个 CPU 的连续写入覆盖,为什么我们需要回写该行?

这是否与每个 CPU 都应该看到相同的写入有关? (但我不明白为什么看不到其他CPU的这个特定写入是一个问题)

Here is the protocol from their book (question in green, in purple it is clear: we need to write-back in order to supply the line to requesting CPU): enter image description here


在 MSI 协议中,将修改后的数据写回内存并不是严格必要的。状态图似乎还假设系统具有低成本内存访问(即使在另一个缓存中的共享状态中找到数据,数据也由内存提供)和连接到内存接口的共享总线。

然而,修改后的数据不能像共享状态那样简单地被删除,因为请求处理器可能仅修改高速缓存块的一部分(例如,仅一个字节)。块中未被请求处理器修改的任何部分必须仍然在存储器中或在请求处理器处可用(另一个处理器已经使其副本无效)。通过共享总线和低成本存储器访问,添加存储器写回与仅将数据传送到其他处理器的成本差异很小。

此外,即使在具有字大小缓存块的字寻址系统上,保持旧数据可用也允许推测性地发送写入未命中请求(如乱序执行或预取写入),而不会出现正确性问题。

(对修改状态[或作为修改超集有效]状态的每字节跟踪将允许避免某些数据通信,但代价是额外的状态位和更复杂的通信系统。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSI:为什么当其他CPU要覆盖该行时我们需要写回该行? 的相关文章

  • intel core i7 处理器使用哪种缓存映射技术?

    我了解了不同的缓存映射技术 例如直接映射和完全关联或集关联映射 以及这些技术之间的权衡 维基百科 https en wikipedia org wiki Cache placement policies 但我很好奇现在Intel core
  • .csproj 的平台特定 ItemGroup 适用于程序集引用,但不适用于内容包含?

    由于我们有三个显式 x86 和 x64 版本的程序集 因此我编辑了相应的 csproj 文件以使用 例如 如下所示的块
  • 虚拟化页表的工作原理

    阅读有关虚拟化页表概念的内容 其中部分页表放入虚拟内存中 维基百科 https en wikipedia org wiki Page table Virtualized page table以及 Patterson 和 Hennessy 页
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • 在Linux中测量C程序缓存命中/未命中和CPU时间的最简单工具?

    我正在用 C 编写一个小程序 我想测量它的性能 我想看看它在处理器中运行了多少时间以及它进行了多少次缓存命中 未命中 有关上下文切换和内存使用情况的信息也很好 该程序的执行时间不到一秒钟 我喜欢 proc pid stat 的信息 但我不知
  • Skylake 中干净缓存行的写回?

    我观察到 Skylake SP 在真实硬件上对干净的缓存行进行写回 Leeor 对这篇文章的回答对于 Intel Core i3 i7 数据从缓存集中逐出后的去向 https stackoverflow com questions 1941
  • 长延迟指令

    I would like a long latency single uop x861 instruction in order to create long dependency chains as part of testing mic
  • 可以直接使用程序集访问缓存吗?

    就效率而言 缓存是一个核心问题 我知道缓存通常会自动发生 但是 我想自己控制缓存的使用 因为我认为我可以比一些不知道确切程序的启发式方法做得更好 因此 我需要汇编指令来直接移入或移出高速缓存单元 like movL1 address con
  • 查看x86架构中的cpu缓存内容

    如何查看或转储基于 x86 的架构的 cpu 缓存内容 每次进行缓存刷新时 我如何才能看到刷新了什么 在哪里 你不能 真的 CPU 缓存被设计为对于 CPU 上运行的代码是透明的 它具有加快代码执行速度的效果 但 CPU 管理有关缓存的所有
  • 为什么无法一步读取未对齐的单词?

    鉴于 CPU 的字大小允许它寻址内存中的每个字节 鉴于通过PAE http en wikipedia org wiki Physical address extensionCPU 甚至可以使用比字大小更多的位来进行寻址 CPU 无法一步读取
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将
  • 现代缓存中的方式预测

    我们知道 就缓存命中时间而言 直接映射缓存优于集合关联缓存 因为不涉及特定标签的搜索 另一方面 组关联缓存通常比直接映射缓存具有更好的命中率 我读到 现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点 他们预测给定集合中最有可能发
  • 链表、数组和硬件内存缓存

    虽然之前有人问过关于链表与数组的问题 但答案大多归结为我们大多数人在某些时候可能已经学到的东西 列表擅长插入和删除 数组擅长随机访问 现在 像 Bjarne Stroustrup 这样受人尊敬的人已经argued https www you
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 软件预取手动指令合理的场景

    我读过有关 x86 和 x86 64 Intel 的内容gcc提供特殊的预取指令 include
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 为什么在展开的 ADD 循环内重新初始化寄存器会使其运行速度更快,即使循环内有更多指令?

    我有以下代码 include
  • 超标量和 VLIW

    我想问一些关于ILP的问题 超标量处理器是标量处理器和矢量处理器的混合体 那么我可以说矢量处理器的架构遵循超标量吗 同时处理多个指令不会使体系结构超标量 因为流水线 多处理器或多核体系结构也可以实现这一点 这意味着什么 我读过 超标量 CP
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化

随机推荐

  • Phonegap Android 无法上网

    我正在 Phonegap 中编写我的第一个应用程序 并且我一直在 Android 设备上对其进行测试 我相信我已授予适当的许可
  • C++ 构造函数/析构函数继承

    编辑 答案摘要 下面B是A的子类 这是一个术语问题 ctors 和 dtors 是not继承 从某种意义上说 B 的 ctor dtor 将not借用A的接口 一个类至少有一个构造函数 并且只有一个析构函数 Constructors B 不
  • OpenCV (c++) 多通道元素访问

    我正在尝试使用 新 OpenCV 2 0 c 版本 但其他一切都像简单的 C 版本一样 我在更改图像中的值时遇到一些问题 该图像是 CV 8UC3 for int i 0 i
  • 带 keycloak 的 Flask-OIDC - oidc_callback 默认回调不起作用

    我正在尝试在一个简单的 Flask 应用程序中使用 Flask oidc 以便通过 keycloak 添加身份验证 但是 一旦我使用有效凭据登录 它就会返回到不存在的 oidc callback Flask 日志显示了很多带有 302 结果
  • 多重继承的接口是否冗余?

    这不是关于抽象类和接口之间差异的另一个问题 因此请在投票关闭它之前三思而后行 我知道接口对于那些不支持多重继承的 OOP 语言 例如 C 和 Java 至关重要 但那些呢with多重继承 在具有多重继承的语言中 接口的概念 作为特定的语言功
  • 通过模板参数给定其长度,在编译时生成相同类型的 std::tuple

    在 C 中 如何实现带有指示元组长度的 int 模板参数的函数并生成具有该长度的 std tuple E g func lt 2 gt returns std tuple
  • 闪亮应用程序的 renderDataTable 中的列宽度,无需拉伸

    我想要一个数据表 及其所有排名 搜索和页面功能 它不会完全延伸到整个页面 并导致每列中有大量空白 理想情况下 列宽类似于 wrap 样式renderTable 我知道我可以修复相对列宽 但是 我的表将根据所选输入动态更新不同数量的列 我希望
  • 使用 FMOD 将输出保存到磁盘

    我正在使用 FMOD 播放一些声音 我想将生成的混音保存到磁盘 我一直在尝试 system gt recordStart 0 sound true 路径 但这保存了设备的麦克风输入 以某种方式 我想将扬声器输出重定向到磁盘 谢谢 Marc
  • XML 架构 - “此上下文中不支持元素”

    我的代码中的最后内容有问题 它说 http www w3 org 2001 XMLSchema http www w3 org 2001 XMLSchema 在这种情况下不支持 我该如何解决这个问题 问题截图
  • d3:Multi-Foci Force关键代码组件理解

    多焦点力的真正魔力就在这里完成 function tick e var k 1 e alpha Push nodes toward their designated focus nodes forEach function o i o y
  • 使用 Java JSch 确定来自 SFTP 服务器的最新文件

    有没有办法使用 Java JSch 确定 Unix SFTP 服务器上最新文件的名称 我想将最新文件从服务器复制到本地计算机 我已经有一个工作代码了 但我无法识别最新的文件 该文件夹包含许多以下格式的文件 Some Report dd MM
  • ios7 CameraPickerController 相机中的图像被冻结

    我有一个简单的相机视图控制器代码 UIImagePickerController picker new UIImagePickerController picker PrefersStatusBarHidden picker SourceT
  • 如何使用 JSF 显示/隐藏组件?

    如何使用 JSF 显示 隐藏组件 我目前正在尝试在 javascript 的帮助下做同样的事情 但没有成功 我无法使用任何第三方库 谢谢 阿比 你实际上可以做到这一点withoutJavaScript 仅使用 JSFrendered属性 通
  • 两个单精度浮点向量的点积在 CUDA 内核中与在主机上产生不同的结果

    在调试一些 CUDA 代码时 我使用以下方法与等效的 CPU 代码进行比较printf陈述 并注意到在某些情况下我的结果有所不同 它们在任何一个平台上都不一定是错误的 因为它们在浮点舍入误差之内 但我仍然有兴趣知道是什么导致了这种差异 我能
  • 如何禁用 Kendo UI 调度程序中的事件?我只是将其设为只读

    如何禁用kendo UI调度程序中的事件 我从官网示例中研究了示例 发现事件中的所有单元格都有双击事件来创建和删除以及其他事件 但现在我只是用它来显示结果 那么如何阻止所有的创建 删除 编辑事件呢 Use the editable配置选项
  • 获取连接的条带账户的账户ID

    当我运行测试以连接用户通过我的应用程序接受付款时 我将需要帐户 ID 来向他们的帐户收费 Stripe Token create array customer gt CUSTOMER ID card gt CARD ID array str
  • Rails & Devise:如何验证特定用户?

    我第一次将 Devise 与 Rails 结合使用 但遇到了一件事 我使用了提供的authenticate user 我的用户控制器中的方法来限制对页面的访问 如下所示 before filter authenticate user onl
  • 使用完全 REST Web 服务将数据写入数据库

    如何创建 REST Web 服务来将一行写入数据库表中 使用以下场景 该表称为Customer 这 要插入到行中的数据将 是姓名 地址 电话 号码 电子邮件 我认为用 Java 或 C 来描述整个事情是不可能的 我也不会想到这一点 但在我准
  • 游戏 Screeps - IDE 集成

    我正在玩 蠕虫 http screeps com http screeps com 模拟室模式 我一直在测试一些脚本 我不想只将它们保存到本地浏览器 我想使用 IDE 来开发代码并将其推送到我的 github 帐户 有可能做到吗 到目前为止
  • MSI:为什么当其他CPU要覆盖该行时我们需要写回该行?

    在 Hennessy Patterson 所著的 计算机架构 一书中 第 5 版 第 360 页 他们描述了 MSI 协议 并写道 如果线路处于 独占 已修改 状态 则在从总线接收到 写入未命中 时 当前 CPU 1 将该线路写回总线 然后