首页 文章

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

提问于
浏览
2

我只是想澄清这个概念,并且可以找到足够详细的答案,这些答案可以说明一切在硬件中的实际效果 . 请提供任何相关细节 .

在VIPT高速缓存的情况下,存储器请求并行发送到TLB和高速缓存 .

从TLB我们得到了经过翻译的物理地址 . 从高速缓存索引中,我们得到标签列表(例如,来自属于一组的所有高速缓存行) .

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

  • 我的问题是这次检查在哪里进行?

  • 在缓存中?

  • 如果不在Cache中,还有哪些地方?

  • 如果在Cache中执行检查,则

  • 是否有从TLB到Cache模块的边带连接,以获得与标签地址进行比较所需的翻译物理地址?

请问某人“实际上”如何实现这一点以及Cache模块和TLB(MMU)模块之间的连接?

我知道这依赖于具体的架构和实现 . 但是,当有VIPT缓存时,您知道的实现是什么?

谢谢 .

1 回答

  • 4

    At this level of detail, you have to break "the cache" and "the TLB" down into their component parts . 它们在设计中非常紧密地互连,该设计使用与标记获取并行转换的VIPT速度黑客(即利用索引位全部低于页面偏移并因此被转换"for free" . 相关:Why is the size of L1 cache smaller than that of the L2 cache in most of the processors?

    L1dTLB本身是一个小/快Content addressable memory,具有(例如)64个条目和4路组关联(Intel Skylake) . 通常使用并行检查的第二(和第三)阵列来处理重复数据,例如, 32页4路,适用于2M页面和1G页面:4入口完全(4路)关联 .

    但是现在,简化你的心理模型,忘记大片 . L1dTLB是单个CAM,并且检查它是单个查找操作 .

    "The cache" 至少由以下部分组成:

    • 以阵列形式存储标签数据的SRAM阵列

    • 控制逻辑,用于根据索引位获取一组数据标记 . (高性能L1d缓存通常与标记并行获取集合的所有方式的数据,以减少命中延迟,而不是等到选择正确的标记,就像使用更大的更高关联缓存一样 . )

    • 比较器根据翻译的地址检查标签,如果其中一个匹配,则选择正确的数据,或触发错误处理 . (并且在命中时,更新LRU位以将此方式标记为最近使用的)

    L1dTLB与L1D缓存并不是真正独立的 . 我实际上并没有设计硬件,但我认为现代高性能设计中的加载执行单元可能会像这样工作:

    • AGU从寄存器偏移量生成地址 .

    (有趣的事实:Sandybridge家族将这一过程简化为简单的寻址模式: [reg + 0-2047] 比其他寻址模式具有低1c的负载使用延迟,可能是因为页面位准备得更快 . 可能使用x和x 4096的进位选择加法器从低位或其他什么东西带出来?)

    • 索引位用于获取集合的所有方式(因为它们需要转换) .

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

    • 标记比较器从该集合接收已转换的物理地址标记和提取的标记 .

    • 如果匹配,则缓存从数据中提取匹配方式的正确字节(使用偏移位)

    如果L1dTLB CAM中没有匹配,则整个缓存获取操作无法继续 . 我不确定CPU是否/如何管理这个,以便在解决TLB-miss时其他负载可以继续执行 . 该过程涉及检查L2TLB(Skylake:统一的1536条目12路用于4k和2M,16条用于1G),如果失败则用于页面漫步 .

    我假设TLB未命中导致标签数据提取被丢弃 . 一旦找到所需的翻译,就会重新获取它们 . 在其他负载运行时,没有地方可以保留它们 .

    最简单的是,它可以在转换准备就绪时重新运行整个操作(包括从L1dTLB获取转换),但它可以通过缩短过程并直接使用转换而不是放置来降低L2TLB命中的延迟它进入L1dTLB并再次将其取回 .

    显然,这要求dTLB和L1D真正设计在一起并紧密集成 . 因为他们只需要互相交谈,这是有道理的 . 硬件页面遍历通过L1D缓存获取数据 . (页面表总是有已知的物理地址,以避免捕获22 /鸡蛋问题) .

    TLB到Cache之间是否存在边带连接?

    我不会称之为边带连接 . L1D缓存是唯一使用L1dTLB的东西 . 类似地,L1iTL仅由L1I高速缓存使用 .

    如果有一个二级TLB,它通常是统一的,所以L1iTLB和L1dTLB都会检查它是否错过 . 就像拆分L1I和L1D缓存一样,如果它们错过了,通常会检查统一的L2缓存 .

    外部缓存(L2,L3)是普遍的PIPT . 在L1检查期间发生转换,因此可以将物理地址发送到其他缓存 .

相关问题