【问题标题】:Is the TLB shared between multiple cores?TLB 是否在多个内核之间共享?
【发布时间】:2016-03-29 23:43:20
【问题描述】:

我听说 TLB 由 MMU 而非 CPU 缓存维护。
那么 CPU 上是否存在一个 TLB 并在所有处理器之间共享,或者每个处理器都有自己的 TLB 缓存?

谁能解释一下MMU和L1、L2 Cache之间的关系?

【问题讨论】:

  • 已经探索了私有和共享 TLB 设计,它们提供了不同的权衡。有关详细讨论,请参阅我在 TLB 上的 survey paper
  • 这取决于实现。 cpuid 可以在您的 PC 上显示 TLB 信息。

标签: caching x86 cpu-architecture cpu-cache tlb


【解决方案1】:

TLB 缓存页表中列出的翻译。每个 CPU 内核都可以在不同的上下文中运行,具有不同的页表。这就是你所说的 MMU,如果它是一个单独的“单元”,那么每个内核都有自己的 MMU。任何共享缓存总是物理索引/物理标记,因此它们基于后 MMU 物理地址进行缓存。

TLB 是(PTE 的)缓存,因此从技术上讲,它只是一个实现细节,可能因微架构而异(在 x86 架构的不同实现之间)。

在实践中,真正变化的只是大小。 2 级 TLB 现在很常见,可以将完整的 TLB 未命中保持在最低限度,但仍然足够快,允许每个时钟周期进行 3 次转换。

仅重新遍历页表(在本地 L1 数据或 L2 缓存中可能很热)以重建 TLB 条目比尝试跨内核共享 TLB 条目要快得多。 这是什么设置了在避免 TLB 未命中方面值得采取的极端做法的下限,这与数据缓存不同,数据缓存是您必须离开核心到共享 L3 缓存或芯片外到 DRAM 之前的最后一道防线。 L3 未命中。

例如,Skylake 添加了第二个页面遍历单元(到每个核心)。良好的页面遍历对于内核无法有效共享 TLB 条目(来自不同进程的线程,或不接触许多共享虚拟页面)的工作负载至关重要。

共享 TLB 意味着 invlpg 在您进行更改页表时使缓存的翻译无效,这将始终必须脱离核心。 (尽管在实践中,操作系统需要确保运行多线程进程的其他线程的其他内核在munmap 之类的过程中“关闭”它们的私有 TLB 条目,使用软件方法进行内核间通信,如 IPI(inter -处理器中断)。)

但是使用私有 TLB,上下文切换到新进程只需设置一个新的 CR3(顶级页面目录指针)并使该内核的整个 TLB 无效,而无需打扰其他内核或全局跟踪任何内容。

有一个 PCID(进程上下文 ID)功能,可以让 TLB 条目使用 16 个左右的 ID 之一进行标记,因此来自不同进程页表的条目可以在 TLB 中处于热状态,而无需在上下文切换时刷新。对于共享 TLB,您需要加强这一点。

另一个复杂的问题是 TLB 条目需要跟踪 PTE 中的“脏”和“访问”位。它们必然只是 PTE 的只读缓存。


有关各个部分如何在真实 CPU 中组合在一起的示例,see David Kanter's writeup of Intel's Sandybridge design。请注意,这些图表适用于单个 SnB 内核。 大多数 CPU 中唯一的内核间共享缓存是最后一级数据缓存。

英特尔的 SnB 系列设计均在环形总线上使用每核 2MiB 的模块化 L3 高速缓存。因此,添加更多内核会向总池中添加更多 L3,以及添加新内核(每个内核都有自己的 L2/L1D/L1I/uop-cache 和两级 TLB。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多