现代缓存中的方式预测

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(使用前将#替换为@)

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

  • Zend_Cache_Backend_Sqlite 与 Zend_Cache_Backend_File

    目前我正在使用 Zend Cache Backend File 来缓存我的项目 尤其是来自外部 Web 服务的响应 我在想是否能找到将结构迁移到 Zend Cache Backend Sqlite 的一些好处 可能的优点是 文件系统有序 缓
  • 我可以在 ASP.NET MVC 中使用 [CompressFilter] 而不破坏甜甜圈缓存吗

    我正在努力获得 压缩过滤器 http www thegrubbsian com p 202 使用甜甜圈缓存并遇到问题 发生的情况是整个页面都被缓存 而不仅仅是甜甜圈 的来源CompressFilter我正在使用的是下面的 我从原始来源 ht
  • ASP.NET MVC3 IIS7.5:Cache-Control maxage 始终为 0(不利于客户端缓存)

    我正在使用 Fiddler 测试我的网站 并注意到网络服务器总是返回 Cache Control private s maxage 0 用于动态内容 MVC 操作 这可以防止页面在客户端缓存 不知道是MVC还是IIS的问题 我该如何修复它
  • iOS 解决方案仅当图像尚未使用 SDWebImage 缓存在内存中时才加载带有动画的图像

    我已经为这个问题苦苦挣扎了几天 以前我使用 AFNetworking 类别来加载和缓存图像 但它的回调中没有提供缓存类型 所以我过去常常在每个控制器中跟踪哪些图像已经加载 我浏览了 SDWebImage 它提供了我正在寻找的东西 SDIma
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的
  • Yslow 替代方案 - 针对小型网站的优化

    我正在开发一个基于内部网的小型 Web 应用程序 我安装了 YSlow 它建议我做几件事 但它们似乎与我无关 例如 我不需要 CDN 我的应用程序很慢 所以我想减少请求的带宽 我应该遵守 YSlow 的哪些规则 是否有适用于小型网站的替代工
  • 帮助我了解实体框架 4 延迟加载的缓存

    我在实体框架 4 0 中遇到了一些意想不到的行为 我希望有人可以帮助我理解这一点 为了解决这个问题 我使用了 Northwind 数据库 我还使用默认的代码生成器 不是 poco 或自我跟踪 我希望每当我查询框架的上下文时 如果我尚未获取这
  • Java8流操作有缓存吗? [复制]

    这个问题在这里已经有答案了 我在我的电脑上运行了下面的示例代码Intel R Xeon R CPU E5 2680 0 2 70GHz 2 CPUs 2 7GHz String format 7s run taken 6d micro se
  • Mathematica 中的数据缓存

    有一个非常耗时的操作在我的包中生成数据集 我想保存此数据集 并仅在我手动删除缓存文件时才让包重建它 这是我的方法作为包的一部分 myDataset Module fname data fname cached data mx If File
  • Azure 函数和缓存

    我们计划开发一个 Azure 函数 其输入触发器是服务总线消息 输出是 blob 存储 服务总线消息将包含图像 url 该函数会将图像大小调整为预定义的分辨率 并将上传到 azure blob 存储 图像大小应调整到的分辨率存储在数据库中
  • 较低级别的缓存是否可以具有更高的关联性并且仍然保留包含性?

    较低级别的缓存是否可以具有更高的关联性并且仍然保留包含性 假设我们有 2 级缓存 L1 最接近 CPU L2 最接近主内存 L1 高速缓存是与 4 个组关联的 2 路组 假设 L2 高速缓存与 16 个高速缓存行直接映射 并假设两个高速缓存
  • 有没有办法清除所有会话中的一些会话数据?

    一般来说 我有以下场景 从数据库中获取产品及其相关数据 将获取的数据转换为 php product 对象 在会话中缓存产品对象 缓存是只读的 即客户在网站上查看产品 但也有类似的电话getProductIdsByCategory categ
  • 如何禁用通过 IIS 提供的单页应用程序 HTML 文件的缓存?

    我有一个通过 IIS 提供服务的单页面应用程序 Angular js 如何防止 HTML 文件缓存 该解决方案需要通过更改index html 或web config 中的内容来实现 因为无法通过管理控制台访问IIS 我目前正在研究的一些选
  • TagHelper 通过调用 GetChildContentAsync() 和 Content.GetContent() 缓存输出

    根据本文 https docs asp net en latest mvc views tag helpers authoring html avoiding tag helper conflicts如果我们使用多个标签助手 针对同一标签
  • Laravel 模型访问器从缓存中获取 - 性能增强

    我在数据库中有一个项目列表 每个项目都可以选择被否决或赞成 这些投票与其他项目字段一起存储在 MySql 中 例如这样的事情 Schema create items function table table gt increments id
  • 如何仅在打开开发者工具时关闭 Firefox 中的缓存?

    我知道我可以关闭 Firefox 中的缓存即将about config https stackoverflow com q 289751 1420197和设置network http use cache and browser cache
  • 咖啡因与番石榴缓存

    根据这些微观基准 https github com ben manes caffeine wiki Benchmarks事实证明Caffeine https static javadoc io com github ben manes ca
  • 使用键模式从 Laravel 4 缓存中删除?

    对于我的包 我们使用 Laravel 缓存 我们创建的每个缓存键都有前缀 所以我们得到mypackage config mypackage md5ofafilename有时我需要刷新我的包创建的所有缓存文件 问题是什么 我只知道缓存键的模式
  • 在apache中有条件地设置缓存头

    我想根据访问文件的路径有条件地设置缓存标头 基本上 访问http www example com cache cache key 应该为具有遥远未来缓存标头的文件提供服务 我使用重写规则来设置环境变量 然后尝试根据该变量设置缓存控制标头 然
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一

随机推荐