现代缓存中的方式预测

2024-04-27

我们知道,就缓存命中时间而言,直接映射缓存优于集合关联缓存,因为不涉及特定标签的搜索。另一方面,组关联缓存通常比直接映射缓存具有更好的命中率。

我读到,现代处理器试图通过使用一种称为路径预测的技术来结合两者的优点。他们预测给定集合中最有可能发生命中的行,并仅在该行中进行搜索。如果尝试导致未命中,请在该组的所有缓存行中使用正常的组关联搜索。

我想了解这种路径预测是如何工作的。预测硬件/逻辑的延迟如何小于整套的搜索延迟?


AMD Bulldozer 和 Ryzen 系列的方式预测机制基于 µtag,并记录在“Take A Way:探索 AMD 缓存方式预测器的安全影响”中(Moritz Lipp 等人,2020 年,PDF https://mlq.me/download/takeaway.pdf).

基于 µtag 的方式预测匹配虚拟地址的哈希值而不是完整的虚拟地址,因此它不仅避免了像虚拟标记缓存那样的地址转换开销,而且通过使用更少的存储,可以以更低的延迟和更短的时间访问预测数组。标签检查延迟稍低。 “Take A Way”逆向工程表明,AMD 的 Bulldozer 系列和 Ryzen 系列都使用第 12 位到第 27 位作为哈希函数,并使用单个异或 (⊕) 层,从而减少延迟。推土机家族使用了12⊕21、13⊕22:、14⊕23、15⊕24、16⊕25、17⊕26、18⊕27; Ryzen 系列使用 12⊕27、13⊕26、14⊕25、15⊕20、16⊕21、17⊕22、18⊕23、19⊕24。

这些 µtag 哈希函数有两个方面值得注意。首先,通过使用较低有效位而不是完整的 48 个有效虚拟地址位,哈希函数中使用的所有位都可以更早地使用,因为减少了进位传播延迟(地址生成涉及加法,尽管高性能加法器具有 log(n )延迟较低有效位仍将更早可用)。 (这种效果还意味着用于确定缓存集的 12 个最低有效位甚至更早可用,因此可以在计算 µtag 之前对预测器表进行索引。)其次,在 Ryzen 系列中,通常最小变量(最重要)位与哈希的三个位的通常最可变(最不重要)位进行异或;这应该会减少错误匹配的可能性。错误匹配是通过替换匹配来处理的,而不是使用普通的(面向LRU的)替换策略;这通常会导致更高的失误率。

(最近的 Intel x86 处理器也使用基于 µtag 的方式预测。)

其他方式预测示例

路径预测并不是一项新技术。 POWER6 使用 µtag 预测器,11 位标签为 [14:17].([16:23]⊕[24:31]),用于具有 128 B 缓存行的 64 KiB 8 路缓存。 (“IBM POWER6 微架构”,H.Q. Le 等人,2007 年)。每个硬件线程还包含一个有效位,以避免同音异义词(不同地址空间的有效地址匹配)的混乱。与 Ryzen 一样,人们清楚地认识到最低有效位变化更频繁,因此两个最低有效位与任何其他位进行异或。

Pentium4 还使用了 µtag 预测器。根据“采用 90 纳米技术的英特尔® 奔腾® 4 处理器的微架构”(Darrell Boggs 等人,2004 年),90 纳米实现“与之前的实现相比显着增加了部分地址匹配的大小,从而减少了错误的数量”。别名情况”。细节似乎尚未公布。

MIPS R10000 使用一个简单的基于 MRU 的路预测器来实现其片外双向关联 L2 缓存。提供 8Ki 单比特预测条目来指示一组中最近使用的缓存块。如果提供超过 8 个 Ki 集(具有 64 B 块的 16 MiB L2 缓存最多支持 128 个 Ki 集),则不同的集将使用相同的预测位(预测器混叠)。这种方式的预测被用来减少引脚数;一次只能读取一个标签,并且只能从一种方式读取部分数据块。替代方案是直接映射缓存(HP PA-RISC 使用大型片外直接映射 L1 缓存)或用于处理标签比较的专用(更昂贵)芯片(MIPS R8000 使用特殊标签 SRAM,其中包括标签比较逻辑和使用比较结果来寻址保存数据的普通 SRAM)。

Alpha 21264 指令高速缓存使用集合和路径预测器,可以将其视为分支目标缓冲区的变体。对于四个 4 字节指令的每个对齐块,包括对下一行(索引)和方式的预测。如果指令块包含上次执行时采用的分支,则该分支的目标行和路径将是该行的预测。具有可变目标(包括调用返回)和分支的控制流指令(无论它们是否被执行)都会发生变化,这会导致错误预测,但该预测器的准确性通常很高。

延迟和功耗考虑因素

现代高性能处理器主要使用方式预测来减少访问能量,同时保持快速访问。通过支持 32 字节缓存访问(例如,AVX)和快速未对齐加载(这实际上使访问大小加倍),并行读取八路数据和(通常)仅读取一种数据路之间的能量差异很大。由于需要读取和比较 µtag,标签读取和比较能量的节省会有所减少。 (请注意,放宽 TLB 上的延迟约束 — 使用物理标签和权限标签进行命中确认可以在执行单元使用预测方式数据之后发生 — 也可以用来减少访问能量或增加 TLB 容量。)

直接映射缓存无需在将数据转发到执行单元之前选择正确的方式,从而获得了延迟优势。选择正确的方式包括标签比较和多路复用器选择本身。然而,如果路确定(或预测)延迟小于数据访问延迟,则组关联性唯一增加的延迟是“预热”多路复用器的直通延迟。由于标签数组比数据数组小得多,因此它们的访问延迟也小得多,因此更容易(尤其是虚拟地址标签)在数据本身可用之前确定路径。 (在早期的处理器中,较小的缓存块(标签阵列大小更接近数据阵列大小)以及与逻辑延迟相比相对较低的线路延迟将使在数据可用之前完成路径确定变得更加困难,并适度增加选择延迟的影响。)

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

现代缓存中的方式预测 的相关文章

  • 基于超简单静态文件(html)的php站点缓存

    我有一个网站 基本上只显示内容 没有任何表格和后期处理 该网站基于 PHP 并托管在共享主机上 它很少改变 我想为此网站启用缓存 它是共享托管 所以我需要一个解决方案 不使用 Memcached 不需要将我的网站移至 VPS 不要使用APC
  • 第一次播放声音时 AVAudioPlayer 启动缓慢

    我试图消除通过 iPhone 上的 AVAudioPlayer 播放 非常短 不到 2 秒 音频文件时的启动延迟 首先 代码 NSString audioFile NSString stringWithFormat caf NSBundle
  • 如何防止LRU缓存android中的内存不足错误

    我在我的 Android 应用程序中使用内存 LRU 缓存来缓存位图 但是在将某些位图加载到 LRU 映射中后 应用程序强制关闭并提示内存不足异常 我花了一整天的时间 但还没有找到解决方案 请任何人都可以帮助我 我严重陷入这个问题 提前致谢
  • 即使禁用缓存,Safari 也会缓存 GET 请求

    我已经将我所知道的所有标头设置为在我的服务器上禁用缓存 甚至禁用 ETAG 但 Safari 仍然偶尔 大约 50 次 缓存我的请求 Workflow 我正在实施 oauth 1 所以 浏览器使GET api user request 服务
  • 使用二级缓存时,nhibernate 查询缓存和实体缓存有什么区别?

    我正在尝试设置 nhibernate 二级缓存我在这篇文章中看到 http www gitshah com 2012 03 nhibernate and caching part 2 html我想了解查询缓存和实体缓存之间的区别 它说你需要
  • 如何通过点积获得峰值 CPU 性能?

    Problem 我一直在研究 HPC 特别是使用矩阵乘法作为我的项目 请参阅我的个人资料中的其他帖子 我在这些方面取得了不错的成绩 但还不够好 我退后一步 看看我在点积计算方面能做得如何 点积与矩阵乘法 点积更简单 并且允许我测试 HPC
  • 在不运行控制台命令的情况下清理缓存的最佳方法是什么?

    在我的项目的管理面板中 我编写了更改要使用的数据库名称的功能 我把新的数据库名称写在parameters ini 之后必须清理缓存才能加载新配置 在不运行控制台命令的情况下清理缓存的最佳方法是什么 或者是否有另一种最佳实践如何更改当前数据库
  • CPU缓存:两个地址之间的距离是否需要小于8字节才能具有缓存优势?

    这似乎是一个奇怪的问题 假设缓存行的大小为 64 字节 此外 假设 L1 L2 L3 具有相同的缓存行大小 this https stackoverflow com a 15333156 8385554帖子说英特尔酷睿 i7 就是这种情况
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • 使用 Webpack 进行缓存,索引源代码中的 [hash] 值,使用 React.js

    我正在构建一个同构应用程序 它完全是用react构建的 也就是说 html基础也在react中 我有我的根 html 作为应用程序组件 它看起来像这样 var AppTemplate React createClass displayNam
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • Flask:缓存静态文件(.js、.css)

    我真的找不到任何这方面的资源 那么如何将视图 函数的缓存与静态文件 即 css js 分开 我想将静态对象缓存一周 另一方面 我只需要缓存函数 视图几分钟 当我执行以下操作时 from flask ext cache import Cach
  • 使用 Hibernate 作为 ORM 机制的 Web 应用程序中的 L1 和 L2 缓存有什么区别?

    我只想要一些有关使用 L1 缓存和 L2 缓存的标准用途的一般信息 我很好奇 因为我正在研究使用赤土陶器作为二级缓存的系统 并且我发现它也有一级缓存 L1 缓存是每个 Hibernate 会话都存在的缓存 并且该缓存不在线程之间共享 该缓存
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 在 SPA 中加载外部脚本和样式文件

    我有一种 SPA 它使用 API 来获取数据 该 SPA 有一些实例 它们都使用通用样式和脚本文件 所以我的问题是 当我更改这些文件中的一行时 我将必须打开每个实例并更新文件 这对我来说真的很耗时 一种方法是将这些文件放在服务器中的文件夹中
  • 如何在高速缓存中存储图像

    我对此完全空白 我想从 URL 下载图像 并且必须将其存储在内部 以便下次我不需要连接到网络 而是从缓存中检索它 但我不知道该怎么做 谁能帮我提供一个代码片段 import java io BufferedInputStream impor
  • 如何缓存 ASP.NET 网站以获得更好的性能

    我是一名网页设计师 通常设计不需要更新的企业网站 所以我想将输出缓存一天 我怎样才能做到这一点 此外 任何有关在慢速服务器上提高 ASP NET 性能的建议都被接受 请注意 ASP NET 缓存有一个bug http connect mic
  • 使 Django 1.3.1 中的视图缓存过期

    我正在尝试使模型上的视图级缓存过期post save 这是通过设置的https docs djangoproject com en 1 3 topics cache from olddocs the per view cache https
  • 本地化 ASP.NET 资源的滑动过期

    假设我们有 2 个站点 myDomain AU 和 myDomain RU 具有相同的代码和本地化资源文件 resx 和 ru resx 我们预计大多数英语用户将使用 AU 网站 大多数俄语用户将使用 RU 网站 但是 如果 AU 域的某些
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i

随机推荐