将 TLB(翻译后备缓冲区)命中率提高到接近 100%



我正在阅读TLB的工作原理,我遇到了这个:

上下文

许多工作负载(尽管肯定不是全部)接近 100% TLB 命中率。

什么样的工作负载?任何例子都会真正有所帮助。

这是我

通过DuckDuckGo找到的一篇很好的小论文,它很好地解释了TLB的工作原理(威斯康星大学麦迪逊分校Comp Sci课程的一部分,从外观上看):https://pages.cs.wisc.edu/~remzi/OSTEP/vm-tlbs.pdf。这应该足以让你开始推理你的数据布局和算法如何影响你的TLB命中率。

从本质上讲,它归结为在内存中保持紧密相连,因此您可以最大限度地减少在访问数据和指令时必须访问的不同页面的数量。对于典型的4K页面或更大的页面,事实证明,大多数程序通常具有非常高的TLB命中率。事实上,我们今天使用的计算机系统就是这样专门设计的,基于对大多数计算工作负载在设计这些系统之前通常所做的广泛研究。

如果你考虑一个没有任何分支的函数,你可以想象每个指令的顺序获取和执行,从页面中的某个点开始,然后继续向下页面。第一条指令可能会导致 TLB 未命中,但之后的每一条指令都将是 TLB 命中,直到到达页面末尾。当访问下一页上的第一条指令时,可能会有另一个TLB未命中,但随后该页指令的其余部分都将被命中。如果函数包含一个循环,它会变得更好,因为 CPU 将跳回到它刚刚执行的内容。 它甚至可能不会长时间离开同一页面。

程序还倾向于访问它们最近访问的页面上的数据。例如,函数中的所有自动变量通常驻留在一个或两个堆栈页上,在许多情况下,调用堆栈中所有函数的所有堆栈帧通常都适合少量页面。对于堆分配或静态分配的内存,通常也存在一些局部性。我上面提到的论文给出了一个很好的例子,说明数组遍历如何导致高TLB命中率。

TLB 命中率往往相对较低的工作负载是那些将其经常访问的数据和/或指令分布在大量页面上的工作负载,中间有不经常访问的数据/指令;以及那些执行操作使其 TLB 条目无效的工作负载(例如,在某些系统上,流程上下文切换导致 TLB 被转储)。

最新更新