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