代码之家  ›  专栏  ›  技术社区  ›  Uchia Itachi

VIPT缓存:TLB和缓存之间的连接?

  •  8
  • Uchia Itachi  · 技术社区  · 7 年前

    我只是想澄清这个概念,并能找到足够详细的答案,这些答案可以帮助我们了解硬件中的实际工作情况。请提供任何相关详细信息。

    对于VIPT缓存,内存请求并行发送到TLB和缓存。

    从缓存索引中,我们可以得到标签列表(例如,从属于一个集合的所有缓存线)。

    然后将翻译后的TLB地址与标签列表匹配,以找到候选。

    • 我的问题是这项检查在哪里进行?
      • 在缓存中?
      • 如果不在缓存中,还有哪里?
      • 从TLB到缓存模块是否有边带连接以获取 翻译后的物理地址需要与标签地址进行比较?

    有人能“实际上”解释一下这通常是如何实现的,以及缓存模块和;TLB(MMU)模块?

    我知道这取决于具体的架构和实现。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  11
  •   Peter Cordes    3 年前

    在这个细节层次上,您必须将“缓存”和“TLB”分解为它们的组件部分 . 它们在一种设计中紧密相连,该设计使用VIPT speed hack并行翻译和标签提取(即利用索引位均低于页面偏移量,因此“免费”翻译)。相关: Why is the size of L1 cache smaller than that of the L2 cache in most of the processors?

    L1dTLB本身是一个小型/快速 Content addressable memory Intel Skylake ). Hugepages通常使用并行检查的第二个(和第三个)数组进行处理,例如,对于2M页面,32个条目4路,对于1G页面,4个条目完全(4路)关联。

    L1dTLB是单个CAM,检查它是单个查找操作。

    至少由以下部分组成:

    现代高性能设计中的负载执行单元是这样工作的 :

    • AGU根据寄存器+偏移量生成地址。

      (有趣的事实:Sandybridge家族乐观地缩短了这一过程,以实现简单的寻址模式: [reg + 0-2047] reg+disp . Is there a penalty when base+offset is in a different page than the base? )

    • 索引位来自地址页面部分内的偏移量,因此它们不需要从虚拟到物理的转换。或者转换是不可行的。这种VIPT速度和PIPT缓存的非混叠只要 L1_size / associativity <= page_size

    • 在L1dTLB CAM阵列中查找地址的高位。

    • 标签比较器接收转换后的物理地址标签和从该集合中提取的标签。

    但现代Intel CPU(P6及更高版本)对未对齐的加载UOP没有惩罚,即使是32字节向量,只要它们不跨越缓存线边界。基于行内偏移量、操作数大小和特殊属性(如零或符号扩展或广播负载),8种并行方式的字节粒度索引可能比仅获取整个8 x 64字节和在获取+TLB时设置输出的多路复用成本更高。因此,一旦完成标记比较,来自所选方式的64字节数据可能会进入一个已经配置的多路复用网络,该网络获取正确的字节并进行广播或符号扩展。

    AVX512 CPU甚至可以进行64字节的全行加载。


    如果L1dTLB CAM中没有匹配项,则整个缓存获取操作无法继续。我不确定CPU是否/如何管理管道,以便在TLB未命中问题得到解决时,其他负载可以继续执行。该过程包括检查L2TLB(Skylake:unified 1536 entry 12 way for 4k and 2M,16 entry for 1G),如果失败,则进行页面漫游。

    TLB与缓存之间是否有边带连接?

    我不会称之为边带连接。L1D缓存是 只有

    如果有第二级TLB,它通常是统一的,因此L1iTLB和L1dTLB都会在未命中时进行检查。就像拆分的L1I和L1D缓存一样,如果未命中,通常会检查统一的二级缓存。

    外部缓存(L2、L3)通常是PIPT。转换发生在L1检查期间,因此物理地址可以发送到其他缓存。