我想知道 L1-Dcache 是否是数据来自的终极缓存
是的,或者存储缓冲区。 Globally Invisible load instructions 解释了部分存储转发如何让核心加载一个从不全局可见的 dword 值,因此没有其他核心可以加载。
DSB(uop 缓存)是缓存,但它不缓存机器代码。它将x86机器码解码的结果缓存到微指令中。
它有各种限制,例如不能对来自同一个 32 字节 x86 机器代码块的微指令使用超过 3 个“行”,因此建模不像像大小/关联性那么简单。例如每种方式(又名线路)最多可以容纳 6 个微指令,但以无条件(或预测采用)分支微指令结束。并且来自多微指令指令的所有微指令都必须在同一行中。
来自每条 x86 指令的融合域微指令的数量取决于它是什么指令;请参阅https://uops.info/,但请注意un-lamination 将意味着某些指令在发布/重命名阶段和 ROB 中比解码器和 uop-cache 占用更多的微指令。 (Micro fusion and addressing modes)
Agner Fog 的微架构指南有一些详细的测试结果 (https://agner.org/optimize/),另请参阅 https://www.realworldtech.com/sandy-bridge/4/
Intel uop 缓存的基本参数,如 Sandybridge 部分 Agner 的微架构指南中所述:
µop 缓存被组织为 32 组 x 8 路 x 6 µops,总计最大容量为
1536 微操作。它可以为每个对齐和分配最多 3 行,每行 6 µops
连续的 32 字节代码块。
AFAIK,从 SnB 到 Skylake 和 Ice Lake,这种几何形状一直保持不变。
L1i 缓存包含 uop 缓存。 uop 缓存是虚拟寻址的,因此不需要 TLB 查找。但我猜它也必须在 TLB 失效时被驱逐。 (这不是一个大问题,因为旧版解码器非常好;Sandybridge 系列避免了 P4 解码速度慢的问题,并尝试使用它的跟踪缓存而不是普通的 L1i。)
请注意,AMD 的 Zen 微架构系列也使用 uop 缓存。他们不称它为 DSB,而且它可能与 Intel 的有所不同。
另外,我对哪些硬件变化会影响 DSB 的性能感兴趣?
Skylake 将 uop-cache -> IDQ 的带宽从每周期 4 微秒增加到 6 微秒。因此,即使在高吞吐量代码中,uop-cache 也可以在气泡部分耗尽 IDQ 后“赶上”。
尽管如此,它仍然每个周期只能读取 1 个 uop 缓存行,因此例如在 Skylake 上,微码更新禁用了循环缓冲区 (LSD),通常每次迭代运行 1 个周期的微小循环可能会减慢到如果循环跨 32 字节边界分割,则为 2 个周期,因为这意味着它的 uop 将位于 2 个单独的 uop-cache 行中。 (例如每行 1 或 2 个。)
但 Haswell 可以在理想条件下从 uop 缓存维持每个时钟 4 uops,即使指令将 uop 缓存行完全打包为每行 6 个 uops。因此,在 uop 缓存行获取和添加到 IDQ 之间显然存在一些缓冲,否则如果添加到 IDQ 的所有 uops 必须来自同一行,这将是 4 : 2 模式。