gpt4 book ai didi

caching - TLB 是否在多个内核之间共享?

转载 作者:行者123 更新时间:2023-12-02 14:49:41 27 4
gpt4 key购买 nike

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

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

最佳答案

TLB 缓存页表中列出的转换。每个CPU核心可以在不同的上下文中运行,具有不同的页表。每个内核都有自己的 MMU,尽管实际上它根本不是一个单独的单元,但它是内核的一部分(加载/存储端口、TLB 和页遍历器的一部分)。任何共享缓存始终都是物理索引/物理标记的,因此它们基于后 MMU 物理地址进行缓存。

TLB 是一个实现细节(只是 PTE、页表条目的缓存),可能会因微体系结构而异;例如386没有,每次加载都会多次访问内存。实际上,真正不同的是大小。它始终是针对每个核心的。 2 级 TLB 现在很常见,可以将完整的 TLB 缺失保持在最低限度,但仍然足够小且足够快,允许每个时钟周期进行 3 次转换(用于数据加载/存储,与 iTLB 并行。)

仅重新遍历页表(在本地 L1 数据或 L2 缓存中可能很热)来重建 TLB 条目比尝试跨内核共享 TLB 条目要快得多。是为避免 TLB 未命中而值得采取的极端情况设定下限的因素,这与数据缓存不同,数据缓存是您必须从核心转到共享 L3 缓存或从片外转到 DRAM 之前的最后一道防线。 L3 未命中。

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

共享 TLB 意味着当您确实更改页表时,invlpg 使缓存的翻译无效,总是必须离开核心。 (尽管在实践中,操作系统需要确保运行多线程进程的其他线程的其他核心在诸如 munmap 之类的过程中使用软件方法进行核心间通信,将其私有(private) TLB 条目“击落”就像 IPI(处理器间中断)。)

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

有一个 PCID(进程上下文 ID)功能,可以让 TLB 条目用 16 个左右的 ID 之一进行标记,这样来自不同进程页表的条目可以在 TLB 中成为热门条目,而不需要在上下文切换时刷新。对于共享 TLB,您需要加强这一点。 (PCID 是针对每个核心的,因此可以为每个核心单独跟踪最近运行的任务。)

另一个复杂之处是 TLB 条目需要跟踪 PTE 中的“脏”和“已访问”位。它们通常是 PTE 的直写式缓存。

<小时/>

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

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

关于caching - TLB 是否在多个内核之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34437371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com