对于 Intel Core i3/i7,数据从缓存集中逐出后的去向

2023-11-26

Intel 中包含 L1/L2 缓存,并且 L1/L2 缓存是 8 路关联性,意味着一组中存在 8 个不同的缓存线。缓存行作为一个整体进行操作,这意味着如果我想从缓存行中删除几个字节,则整个缓存行将被删除,而不仅仅是我要删除的那些字节。我对吗 ?

现在,我的问题是每当一组缓存行被从缓存中删除/逐出,无论是通过其他进程还是通过使用 clflush(手动逐出缓存行/块),系统是否将该缓存行的逐出数据存储在某处(在任何缓冲区、寄存器中) ETC),这样下次就可以从该位置加载数据,与从主内存或更高级别的缓存加载数据相比,可以减少延迟,OR it 总是简单地无效缓存中的数据,下次加载更高级别的数据。

任何建议或文章的任何链接都将受到高度赞赏。提前致谢。


L1/L2 不一定是包容性的,只有最后一级缓存是包容性的,在 i7 上是 L3。 你说得对,缓存行是基本的缓存元素,你必须抛出整个缓存行才能填充新的缓存行(或者当使该行无效时)。您可以在这里阅读更多相关内容 -http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html

当删除一行时,所采取的操作取决于其 MESI 状态(MESI 及其衍生协议是缓存一致性维护的协议)。如果该行被修改(“M”),则数据必须“写回”到下一级缓存(如果未命中,它可能会在那里分配,或者“直写”到下一级 - 取决于缓存维护的策略)。请注意,当您到达最后一级缓存时,您将必须命中,因为它是包容性的。当从最后一级缓存中逐出一行时,必须将其写入内存。无论哪种方式,未能写回修改后的行都会导致一致性丧失,这很可能导致错误的执行。

如果该行未被修改(无效、独占或共享),则 CPU 可能会默默地丢弃该行,而无需回写,从而节省带宽。顺便说一句,在更复杂的缓存协议(如 MESIF 或 MOESI)中还有其他几种状态。

您可以通过谷歌搜索“缓存一致性协议”找到很多解释。如果你喜欢更扎实的来源,你可以参考任何CPU架构或缓存设计教科书,我个人推荐Hennessy&Patterson的《计算机架构,一种定量方法》,有一整章关于缓存性能,但这有点偏离主题。

小更新:从 Skylake 开始,某些 CPU(服务器部分)不再具有包容性 L3,而是具有非包容性(以支持增加的 L2)。这意味着当 L2 老化时,干净的行也可能被写回,因为 L3 通常不保存它们的副本。

更多细节:https://www.anandtech.com/show/11550/the-intel-skylakex-review-core-i9-7900x-i7-7820x-and-i7-7800x-tested/4

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

对于 Intel Core i3/i7,数据从缓存集中逐出后的去向 的相关文章

随机推荐

  • 使用 UIScreenEdgePanGestureRecognizer 而不移动 MKMapView

    我有一个包含 MKMapView 的 UIViewController 事实上 它包含一个包含 MKMapView 的全屏容器 但它不应该有任何影响 我实现了一个 UIScreenEdgePanGestureRecognizer 以显示抽屉
  • Quantmod add_TA 和 Chart_Series 出现问题 - 调用下一个 add_TA 后线条和文本消失

    我正在使用新的chart Series and add TA非常多 它对我来说非常有效 我发现它非常有用 我正在尝试在图表上添加一些内容 水平线和一些文本 这里开始出现问题 正确绘制水平线和文本后 如果我调用后续命令 它们就会消失add T
  • Cassandra控制SSTable大小

    有没有办法控制 SSTable 的最大大小 例如 100 MB 这样当 CF 实际上有超过 100MB 的数据时 Cassandra 就会创建下一个 SSTable 不幸的是 答案并不那么简单 SSTable 的大小将受到压缩策略的影响 并
  • C语言中的限定符是什么?

    我正在这个网址阅读一些文字 https cs senecac on ca btp100 pages content varia p html 在 限定符 部分中 他们说 我们可以限定 int 类型以确保它包含最少位数 Short 至少包含
  • 在 ANSI C 中正确声明 main() 函数 [重复]

    这个问题在这里已经有答案了 C标准说 程序启动时调用的函数 被命名为主 实施情况 没有为此声明原型 功能 它应定义为 返回类型为 int 并且没有 参数 int main void 或带有两个参数 参考 这里作为 argc 和 argv 尽
  • 如何在 Isabelle/jEdit 中启用“跟踪”

    I m a vim风扇 但仅emacs有这个 Isabelle HOL 环境 jEdit很棒 但我不能使用 using simp trace true like in emacs 如何启用 跟踪 jEdit 你确实可以使用simp trac
  • 将函数应用于多维数组:R 与 MATLAB

    这个问题可以被认为与this one 这帮助我提高了 R 在计算大数组平均值时的性能 不幸的是 在这种情况下 我尝试应用更复杂的东西 例如分位数计算 我有一个包含超过 4000 万个元素的 4 维数组 我想计算特定维度上的第 66 个百分位
  • 更改 GridView 的行为以使其水平滚动而不是垂直滚动

    我想做一个UI像一个元素GridView 我希望它具有完整的功能 但希望它可以水平滚动而不是垂直滚动 通过水平滚动 我的意思是它应该以这种方式构建 而不是放在一个HorizontalScrollView 我的会是Custom GridVie
  • 在 NodeJS 中下载大文件的最佳方法是什么?

    下面的服务器代码对于 5GB 文件运行良好wget http localhost 11146 base bigFile zip但不使用客户端代码 服务器端代码 var http require http var fs require fs
  • Ninject 与 MembershipProvider |角色提供者

    我使用 ninject 作为我的 IoC 并编写了一个角色提供程序 如下所示 public class BasicRoleProvider RoleProvider private IAuthenticationService authen
  • 为什么 git rebase 会触发合并冲突?

    我已经克隆了一个远程存储库 创建了一个新分支b并开始工作并做出承诺 我也推了b分支 但我是唯一一个在这方面工作的人 一段时间后 我想在远程主分支上重新设置本地分支的基础 只是为了与系统可能发生的更改同步 请注意 我确信我是唯一处理这些特定文
  • Python 3 和 tkinter 通过单击按钮打开新窗口

    当用户单击 Tkinter 和 Python 3 中的按钮时 如何打开新窗口 您可以通过创建 Tkinter 类的新实例来打开新窗口Toplevel 例如 import Tkinter as tk class View tk Frame c
  • 将 geoJson 数据转换为 SQL Server 空间数据类型 (GIS)

    我已经从 openstreetmaps 下载了 geoJson 格式的行政边界 城市 地区 国家等 我正在尝试使用空间数据将与多边形相关的 json 数据存储在我的 MS sql 服务器中 由于我从未解析过如此复杂的 json 文件 因此我
  • 在 JPA DTO 投影查询中加载子集合 DTO

    我在 Wildfly 10 1 0 Final 上使用 Java EE 7 与 Java 8 和 Hibernate 5 0 X 并且需要使用投影将 JPQL 查询结果加载到 DTO 中 但我找不到任何有关如何执行此操作的文档同时加载子集合
  • 重用 ICryptoTransform 对象

    我有一个用于加密文本数据的类 我正在尝试尽可能重用 ICryptoTransform 对象 但是 当我第二次尝试使用同一对象时 我得到了部分错误解密的数据 我认为第一个块是错误的 但其余的似乎没问题 用较长的文本进行了测试 我将课程精简为以
  • 检测DIV是否有滚动条[重复]

    这个问题在这里已经有答案了 可能的重复 使用 jQuery 检测 DIV 中是否存在滚动条 有如下标记 div class content Lorem div div class content Lorem Iorem Lorem Iore
  • 如何在 Storyboard 中使用 UIScrollView

    我有一个滚动视图 其内容高度为 1000 像素 并且希望能够将其布局以便于故事板上的设计 我知道它可以通过编程来完成 但我真的希望能够直观地看到它 每次我将滚动视图放在视图控制器上时 它都不会滚动 是否有可能让它像我想要的那样工作 或者我必
  • 将显示平均值和四分位数范围的功能区添加到 ggplot2

    我使用以下示例数据和代码 Example x1 lt as Date 2013 12 31 adddate1 lt 1 60 dts lt x1 adddate1 df lt data frame a runif 100 b runif 1
  • 无法在 Mac 应用程序中添加自定义字体 (OSX 10.9+ Xcode5+)

    我已经浏览过这些帖子 在 mac 包中嵌入字体 Cocoa 应用程序中的自定义字体 我尝试了完全相同的方法 重新检查多次 但我无法将自定义字体添加到我的 Mac 应用程序中 所有详细信息均显示在附图中 Plist is updated Tr
  • 对于 Intel Core i3/i7,数据从缓存集中逐出后的去向

    Intel 中包含 L1 L2 缓存 并且 L1 L2 缓存是 8 路关联性 意味着一组中存在 8 个不同的缓存线 缓存行作为一个整体进行操作 这意味着如果我想从缓存行中删除几个字节 则整个缓存行将被删除 而不仅仅是我要删除的那些字节 我对