- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不知道为什么L1缓存和L2缓存保存相同的数据。
例如,假设我们要第一次访问Memory [x]。首先将Memory [x]映射到L2高速缓存,然后将相同的数据映射到L1高速缓存,CPU寄存器可以从中检索数据。
但是我们已经复制了同时存储在L1和L2缓存中的数据,这不是问题还是至少浪费了存储空间?
最佳答案
我编辑了您的问题,询问为什么CPU浪费高速缓存空间来将相同的数据存储在多个高速缓存中,因为我认为这就是您要的。
并非所有的缓存都是这样。外部缓存的Cache Inclusion Policy可以是Inclusive, Exclusive 或Not-Inclusive / Not-Exclusive。
NINE是“正常”情况,不保留任何特殊属性,但由于您在问题中描述的原因,L2确实倾向于在L1中具有大多数行的副本。如果L2的关联性小于L1(like in Skylake-client),并且访问模式在L2中创建了很多冲突遗漏(不太可能),那么您可以获得的数据量仅在L1中。也许以其他方式,例如通过硬件预取,或由于代码获取而从L2逐出数据,因为实际的CPU使用分离的L1i / L1d缓存。
为了使外部高速缓存有用,您需要某种方式让数据输入它们,以便在行从较小的L1撤出后的某个时候可以命中L2。通过外部高速缓存获取诸如L1d之类的内部高速缓存可以免费为您提供服务,并具有一些优势。您可以将硬件预取逻辑放在高速缓存的外部或中间级别,而不必像L1那样具有高性能。 (例如Intel CPUs have most of their prefetch logic in the private per-core L2,还有L1d中的一些预取逻辑)。
另一个主要选项是使外部高速缓存成为受害者高速缓存,即,仅当它们从L1退出时才输入。因此,您可以循环遍历L1 + L2大小的数组,并且可能仍然会获得L2匹配。如果您希望L1与L2相比相对较大,则实现此功能的额外逻辑很有用,因此总大小比单独使用L2大一点。
使用专用的L2,如果L1d需要从该集合中撤出某些内容,则L1丢失/ L2命中可以在L1d和L2之间交换线路。
实际上,某些CPU确实使用了L1d(例如AMD K10 / Barcelona)专有的L2。这两个高速缓存都是私有的每核高速缓存,不是共享的,因此就像您正在谈论的单核CPU的简单L1 / L2情况一样。
多核CPU和共享缓存使事情变得更加复杂!
巴塞罗那的共享L3缓存也大部分不包含内部缓存,但并不严格。大卫·坎特(David Kanter)解释说:
首先,它主要是排他的,但并非完全如此。当一条线从L3高速缓存发送到L1D高速缓存时,如果该高速缓存线是共享的,或者很可能是共享的,则它将保留在L3中–导致重复,这在完全排他的层次结构中永远不会发生。如果所获取的高速缓存行包含代码,或者如果先前已共享数据(跟踪共享历史记录),则很可能被共享。其次,L3的驱逐政策已更改。在K8中,当从内存中引入高速缓存行时,最近使用的伪最少算法将逐出高速缓存中最旧的行。但是,在巴塞罗那的L3中,替换算法已更改为也考虑了共享,并且它希望逐出未共享的线路。
AMD的K10 /巴塞罗那的继任者是推土机。 https://www.realworldtech.com/bulldozer/3/指出,推土机的共享L3也是受害者缓存,因此大部分不包含L2。大概就像巴塞罗那的L3。
但是Bulldozer的L1d是一个小型直写式高速缓存,具有甚至更小的(4k)写合并缓冲区,因此它主要包含L2。在CPU设计领域,Bulldozer的直写式L1d通常被认为是一个错误,Ryzen回到了正常的32kiB回写式L1d,就像Intel一直以来一直在使用(效果很好)。一对弱整数核心形成一个共享FPU / SIMD单元和shares a big L2 that's "mostly inclusive"的“集群”。 (即可能是标准的NINE)。这个集群的东西是Bulldozer替代SMT /超线程的替代品,AMD也放弃了Ryzen,转而使用具有广泛乱序内核的普通SMT。
显然,Ryzen在核心集群(CCX)之间也具有某些排他性,但是我没有研究细节。
我一直在谈论AMD,因为它们在最近的设计中使用了独占缓存,并且似乎更喜欢受害者缓存。英特尔没有尝试过太多不同的事情,因为they hit on a good design with Nehalem一直坚持到Skylake-AVX512。
Intel Nehalem和更高版本使用包含共享标签的大型L3缓存。对于专用的每核L1d或L2(NINE)高速缓存中的修改/排他(MESI)的行,L3标签仍指示哪些核(可能)具有行的副本,因此从一个核中请求独占访问一条线不必广播到所有核心,而只广播到可能仍对其进行缓存的核心。 (即,它是用于一致性流量的探听过滤器,它使CPU可以在每个芯片上扩展多达数十个内核,而在它们甚至不共享内存时也不会因请求而相互淹没。)
即L3标签保存有关L2或L1中某行(或可能)缓存行的信息,因此它知道向哪里发送无效消息,而不是将消息从每个核心广播到所有其他核心。
通过Skylake-X(Skylake服务器/ SKX / SKL-SP),Intel删除了该文件,并将其制作为L3 NINE and only a bit bigger than the total per-core L2 size 。但是仍然有一个探听过滤器,它只是没有数据。我不知道英特尔为 future (双?)/四核/十六进制笔记本电脑/台式机芯片(例如Cannonlake / Icelake)打算做什么。这足够小,以至于他们的经典环形总线仍然很棒,因此他们可以继续在移动/台式机部件中这样做,而仅在高端/服务器部件中使用网格,就像在Skylake中一样。
Realworldtech论坛关于包容性,专有性与非包容性的讨论:
CPU体系结构专家花时间在该论坛上讨论什么是好的设计。在搜索有关独占缓存的内容时,我发现了this thread,其中存在严格包含的最后一级缓存的一些缺点。例如它们会强制私有的每核L2缓存较小(否则,由于L3和L2之间的重复会浪费太多空间)。
而且,L2缓存对L3的过滤器请求,因此,当其LRU算法需要删除一条线时,最近最少看到的那条线很容易成为永久处于核心L2 / L1状态的线。但是,当包含端的L3决定删除一条线时,它也必须从具有该行的所有内部缓存中逐出!
大卫·坎特(David Kanter)回复了interesting list of advantages for inclusive outer caches。我认为他是在与专有缓存进行比较,而不是与NINE进行比较。例如他关于简化数据共享的观点仅适用于独占缓存,我认为他的建议是,当多个内核甚至以共享/只读方式需要同一行时,严格独占的缓存层次结构可能会导致驱逐。
关于caching - 为什么L1和L2 Cache浪费空间来保存相同的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785750/
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我正在尝试保存模型的实例,但我得到了 Invalid EmbeddedDocumentField item (1) 其中 1 是项目的 ID(我认为)。 模型定义为 class Graph(Docum
我有一个非常奇怪的问题......在我的 iPhone 应用程序中,用户可以打开相机胶卷中的图像,在我的示例中 1920 x 1080 像素 (72 dpi) 的壁纸。 现在,想要将图像的宽度调整为例
目前,我正在使用具有排序/过滤功能的数据表成功地从我的数据库中显示图像元数据。在我的数据表下方,我使用第三方图像覆盖流( http://www.jacksasylum.eu/ContentFlow/
我的脚本有问题。我想按此顺序执行以下步骤: 1. 保存输入字段中的文本。 2. 删除输入字段中的所有文本。 3. 在输入字段中重新加载之前删除的相同文本。 我的脚本的问题是 ug()- 函数在我的文本
任何人都可以帮助我如何保存多对多关系吗?我有任务,用户可以有很多任务,任务可以有很多用户(多对多),我想要实现的是,在更新表单中,管理员可以将多个用户分配给特定任务。这是通过 html 多选输入来完成
我在 Tensorflow 中训练了一个具有批归一化的模型。我想保存模型并恢复它以供进一步使用。批量归一化是通过 完成的 def batch_norm(input, phase): retur
我遇到了 grails 的问题。我有一个看起来像这样的域: class Book { static belongsTo = Author String toString() { tit
所以我正在开发一个应用程序,一旦用户连接(通过 soundcloud),就会出现以下对象: {userid: userid, username: username, genre: genre, fol
我正在开发一个具有多选项卡布局的 Angular 7 应用程序。每个选项卡都包含一个组件,该组件可以引用其他嵌套组件。 当用户选择一个新的/另一个选项卡时,当前选项卡上显示的组件将被销毁(我不仅仅是隐
我尝试使用 JEditorPane 进行一些简单的文本格式化,但随着知识的增长,我发现 JTextPane 更容易实现并且更强大。 我的问题是如何将 JTextPane 中的格式化文本保存到文件?它应
使用 Docker 相当新。 我为 Oracle 11g Full 提取了一个图像。创建了一个数据库并将应用程序安装到容器中。 正确配置后,我提交了生成 15GB 镜像的容器。 测试了该图像的新容器,
我是使用 Xcode 和 swift 的新手,仍在学习中。我在将核心数据从实体传递到文本字段/标签时遇到问题,然后用户可以选择编辑和保存记录。我的目标是,当用户从 friendslistViewCon
我正在用 Java 编写 Android 游戏,我需要一种可靠的方法来快速保存和加载应用程序状态。这个问题似乎适用于大多数 OO 语言。 了解我需要保存的内容:我正在使用策略模式来控制我的游戏实体。我
我想知道使用 fstream 加载/保存某种结构类型的数组是否是个好主意。注意,我说的是加载/保存到二进制文件。我应该加载/保存独立变量,例如 int、float、boolean 而不是结构吗?我这么
我希望能够将 QNetworkReply 保存到 QString/QByteArray。在我看到的示例中,它们总是将流保存到另一个文件。 目前我的代码看起来像这样,我从主机那里得到一个字符串,我想做的
我正在创建一个绘图应用程序。我有一个带有 Canvas 的自定义 View ,它根据用户输入绘制线条: class Line { float startX, startY, stopX, stop
我有 3 个 Activity 第一个 Activity 调用第二个 Activity ,第二个 Activity 调用第三个 Activity 。 第二个 Activity 使用第一个 Activi
我想知道如何在 Xcode 中保存 cookie。我想使用从一个网页获取的 cookie 并使用它访问另一个网页。我使用下面的代码登录该网站,我想保存从该连接获得的 cookie,以便在我建立另一个连
我有一个 SQLite 数据库存储我的所有日历事件,建模如下: TimerEvent *Attributes -date -dateForMark -reminder *Relat
我是一名优秀的程序员,十分优秀!