L1-Dcache是​​终极数据缓存吗DSB也是gem5可以模拟的缓存吗?

Is the L1-Dcache the ultimate data cache and is DSB also a cache that can be simulated by gem5?

  1. 不知L1-Dcache是​​不是数据的终极缓存。因为我知道对于 i-cache,有一个更接近 CPU 的 DSB,可以看作是 L0-icache。

  2. 此外,我对哪些硬件更改会影响 DSB 的性能感兴趣?我的意思是对于缓存,有诸如缓存大小、缓存关联性之类的东西。但 DSB 是否也只是一个会受到这些因素影响的缓存?

  3. 如果是,我可以用gem5模拟结果吗?我知道 gem5,我可以配置 L1 指令缓存并观察 L1 指令缓存性能。如何在 gem 上为 DSB 做同样的事情?

I wonder if the L1-Dcache is the ultimate cache that data comes from

是的,或者存储缓冲区。 解释了部分存储转发如何让一个内核加载一个从不全局可见的双字值,因此没有其他内核可以加载。


DSB(uop 缓存)缓存,但它不缓存机器代码。缓存了x86机器码解码成uops的结果。

它有各种限制,比如对来自同一个 32 字节 x86 机器代码块的 uops 使用不超过 3 个“行”,所以建模是 不是 这么简单只是大小/关联性。例如每种方式(又名线)最多可以容纳 6 个微指令,但以无条件(或预测采用)分支微指令结束。并且来自多 uop 指令的所有 uops 都必须在同一行。

来自每条 x86 指令的融合域 uops 的数量完全取决于它是什么指令;参见 https://uops.info/, but note that will mean some instructions take more uops in the issue/rename stage and ROB than they do decoders and uop-cache. (Micro fusion and addressing modes)

Agner Fog 的微架构指南有一些详细的测试结果(https://agner.org/optimize/), and see also https://www.realworldtech.com/sandy-bridge/4/

Intel的uop缓存的基本参数是,如Agner's microarch guide的Sandybridge部分所述:

The µop cache is organized as 32 sets x 8 ways x 6 µops, totaling a maximum capacity of 1536 µops. It can allocate a maximum of 3 lines of 6 µops each for each aligned and contiguous 32-bytes block of code.

据我所知,从 SnB 到 Skylake 和 Ice Lake,这种几何形状一直保持不变。

L1i 缓存 包含 uop 缓存。 uop 缓存是虚拟寻址的,因此不需要 TLB 查找。但我想它也必须在 TLB 失效时被驱逐。 (这不是一个大问题,因为传统解码器非常好;Sandybridge 系列避免了 P4 解码缓慢的问题,并尝试使用其跟踪缓存 而不是 普通 L1i。)

请注意,AMD 的 Zen 微体系结构系列也使用 uop 缓存。他们不称它为 DSB,它可能与英特尔的有一些不同。


Also, I am interested in what hardware changes could influence DSB's performance?

Skylake 将 uop-cache -> IDQ 的带宽从每周期 4 微指令增加到 6 微指令。因此,即使在高吞吐量代码中,uop-cache 也可以在气泡部分耗尽 IDQ 后“赶上”。

不过,它每个周期仍然只能读取 1 个 uop 缓存行,因此例如在 Skylake 上,微码更新禁用了循环缓冲区 (LSD),这是一个通常 运行 在 1 个周期的小循环如果循环跨 32 字节边界拆分,则每次迭代可以减慢到 2 个周期,因为这意味着它的 uops 将在 2 个单独的 uop-cache 行中。 (例如每行 1 或 2 个。)

但是 Haswell 可以 在理想条件下从 uop 缓存中维持每个时钟 4 uops,即使指令将 uop 缓存行完全打包为每行 6 uops。所以在 uop 缓存行获取和添加到 IDQ 之间显然有一些缓冲,否则如果添加到 IDQ 的所有 uops 都必须来自同一行,它将是 4 : 2 模式。