我的程序是用C ++编写的。在linux上,进程被分配了一定量的内存。部分是堆栈,部分是堆,部分是文本,部分是BSS。
以下是真的:
分配给我的进程的Heap组件的内存量越大 - Translation Lookaside Buffer未命中的几率会增加?
一般而言 - 我的申请流程消耗的内存越多,TLB错失的可能性就越大?
答案 0 :(得分:2)
我认为分配的内存量与TLB的未命中率之间没有直接关系。据我所知,只要你的程序具有良好的局部性,TLB未命中率就会很低。
导致高TLB未命中的原因有几个: 1.没有足够的内存和许多运行过程; 2.程序的位置低。 3.在代码中循环访问数组元素的低效方式。
答案 1 :(得分:1)
程序通常分为具有完全不同的内存和执行特征的阶段 - 您的代码可能在某些时候分配大量内存,然后执行其他一些不相关的计算。在这种情况下,您的TLB(基本上只是地址转换的缓存)会使未使用的页面老化并最终丢弃它们。虽然你没有使用这些页面,但你不应该关心它。
真正的问题是 - 当你进入一些性能关键阶段时,你是否会使用比TLB可以同时维持的更多页面?一方面,现代CPU具有大的TLB,通常具有2级缓存 - 现代英特尔CPU的L2 TLB应该具有(IIRC)512个条目 - 如果您使用4k页面,那将是2M的数据(大页面将会更多,但TLB通常不喜欢与他们合作,因为可能与较小的页面冲突..)。
应用程序很可能使用超过2M的数据,但如果可能的话,您应该避免同时执行此操作 - 通过执行缓存切片或更改算法。这并不总是可能的(例如,当从内存或IO流式传输时),但TLB未命中可能不是您的主要瓶颈。使用同一组数据并多次访问相同的元素时 - 您应该始终尝试将它们尽可能地缓存。
还可以使用软件预取来使CPU在较早的时间内执行TLB未命中(以及跟随页面遍历),从而阻止它们阻止您的进度。在一些CPU上,硬件预取已经为你做了这个。