gpt4 book ai didi

multithreading - 缓存可以保存来自多个进程的数据吗?

转载 作者:行者123 更新时间:2023-12-04 04:33:33 24 4
gpt4 key购买 nike

我们知道缓存使用虚拟地址。那么,当涉及多个进程时这是如何工作的,特别是对于共享缓存,例如共享 L2 缓存,甚至对于本地 L1 缓存,当进程切换时,如在同时(超)多线程中,您可以从两个不同的进程运行在同一个物理核心上。当涉及来自不同进程的线程时,超线程是否有好处,或者只有在涉及同一进程的线程时才能提高性能?

最佳答案

没有一个主要的 x86 CPU 微架构使用虚拟寻址缓存。它们都使用虚拟索引/物理标记 (VIPT) L1 缓存。 VIPT 是一种性能黑客,它允许从一组标签中提取与 TLB 查找并行的标签。

用作索引的地址位在物理地址和虚拟地址中是相同的。 (即它们是 4k 页内偏移量的一部分,因此它们不需要由 TLB 翻译)。这意味着它的行为与物理/物理 (PIPT) 缓存完全一样,避免了虚拟寻址的所有问题。

这是通过保持缓存很小并有足够的方式来实现的。 Intel 的 L1 缓存是 32kiB,8 路关联,64B 线。这说明了所有页内地址位。 (有关图表和更详细的解释,请参阅其他资源。)

超线程适用于单独的进程 ,因为 x86 CPU 避免缓存别名(同义词/同音异义词问题)。它们的工作方式类似于物理寻址的缓存。但是,两个不共享任何内存的内存密集型进程在使用超线程时可能比不使用时运行得更慢。如果这是一种选择,缓存的竞争共享可能比仅在另一个进程完成后运行一个进程更糟糕。

对于在超线程共享的资源以外的其他方面遇到瓶颈的进程,HT 肯定会有所帮助。例如与分支错误预测。由于对大型工作集的不可预测访问而导致缓存未命中,如果没有超线程,这些工作集仍会经常丢失。

使用 virt/virt 缓存的 CPU 确实需要在上下文切换时使它们无效,或者有额外的标签来跟踪它们用于哪个 PID。这就像缓存目前为支持虚拟化所做的那样:它们用 VM ID 标记,因此它们知道它用于哪个 VM 的物理地址。 virt/virt L1 意味着你不需要一个快速的 TLB:它只在 L1 未命中时需要,所以 L1 缓存也在缓存翻译。

有些设计必须使用 phys/phys L1,但我不知道任何具体的例子。 virt/phys 技巧在高性能 CPU 中很常见,因为无论如何,L1 有足够的方法使其成为可能只是一个好主意。

请注意,只有 L1 使用虚拟地址。 Big L2 and L3 caches are always phys/phys .

其他链接:

  • http://www.realworldtech.com/forum/?threadid=76592&curpostid=76600整个线程进入了一堆关于缓存的细节和问题。大卫·坎特 (David Kanter) 的帖子倾向于以可读的方式解释事物。我还没有阅读整个线程。 RWT 论坛现在可以搜索了!因此,如果您在 google 上搜索更多详细信息,您很可能会从那里多年的论坛主题中看到更多点击率。
  • Paul Clayton explains why phys-idx/virt-tag (PIVT) is such a bad idea that nobody would ever build one :它具有虚拟寻址缓存的缺点,没有任何优点。 ( Wikipedia says that MIPS r6000 is the only known implementation ,并给出了极其深奥的原因:即使是 TLB 也太大而无法在发射器耦合逻辑中实现,因此他们实现了一个 TLB 切片来为物理索引转换足够的位。鉴于该限制,PIPT 和 VIPT不是选项,他们决定使用 PIVT 而不是 VIVT。
  • Another very-detailed answer from Paul Clayton about caches .
  • 关于multithreading - 缓存可以保存来自多个进程的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36799946/

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