【问题标题】:Improve TLB (translation lookaside buffer) hit rate to approach 100%?将 TLB(翻译后备缓冲区)命中率提高到接近 100%?
【发布时间】:2016-05-04 11:55:46
【问题描述】:

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

context

许多工作负载(当然不是全部)接近 100% TLB 命中率。

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

【问题讨论】:

  • 您能提供更多的上下文吗?那句话出自哪里?接近 100% 和正好 100% 是两件非常不同的事情。此外,您的标题并不能完全反映您的实际问题,因此最好澄清一下。 TLB 的命中率永远不会恰好为 100%,因此如果不展望未来,将命中率提高到 100% 是不可能的,而这在目前看来是不可行的。
  • @cad 感谢您的澄清,但我明白这一点。我的问题是:哪些工作负载可以使 TLB 命中率接近 100% 命中?
  • 然后把它写在你的标题中。正如我所说,它并不能完全反映您的实际问题。
  • @cad 好的,我更新了标题,感谢您指出这一点。没有太多上下文,因为我在操作系统类幻灯片上看到它(没有太多细节,只是标题)。

标签: memory-management operating-system tlb


【解决方案1】:

这是我通过 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 被转储)。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2014-03-20
    • 1970-01-01
    • 2016-12-05
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多