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

pyt*_*nic 4 x86 multithreading caching multiprocessing

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

Pet*_*des 5

没有一个主要的x86 CPU微体系结构使用虚拟地址缓存.它们都使用虚拟索引/物理标记(VIPT)L1缓存.VIPT是一种性能破解,它允许集合中的标记与TLB查找并行获取.

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

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

超线程可以在单独的进程中正常工作,因为x86 CPU可以避免缓存别名(同义词/同音词问题).它们像物理地址缓存一样工作.但是,两个不共享任何内存的内存密集型进程可能会因超线程而运行速度较慢.如果这是一个选项,那么缓存的竞争共享可能比在另一个进程之后运行一个进程更糟糕.

对于超出超线程共享资源以外的其他事物的流程,HT肯定有帮助.例如,分支错误预测.还有缓存未命中,因为不可预测的访问大型工作集仍然会在没有超线程的情况下经常丢失.


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

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

请注意,只有L1使用virt地址. 大L2和L3缓存总是物理/物理.


其他链接: