堆栈是否在缓存中?

Tyl*_*den 5 memory performance stack caching

在现代计算机中,我知道当前代码区域在高速缓存中。但是,在许多计算机语言实现中,本地(自动)变量将位于堆栈中,因此将有大量内存访问堆栈。

堆栈是否在正常架构中的另一个缓存中?

如果不是,则假设堆栈可以重新定位为“本地”,即非常靠近当前代码段,以便它位于用于代码的缓存内。这会加速自动变量的内存访问吗?

Tyl*_*den 6

大多数现代计算机都会不加区别地缓存内存,因此 CPU 访问的任何内存都会被缓存。所以,这包括内存和堆栈。事实上,堆栈很可能几乎一直被缓存,因为它被频繁访问。

对堆栈进行缓存的主要问题是,由于它被频繁修改,可能会导致缓存与主内存不同步并触发缓存未命中,这会损害性能。这种情况通常不会发生,因为大多数体系结构使用所谓的回写缓存,这意味着每个缓存块(称为缓存行)都有一个脏位,并在需要时使用缓存的延迟副本返回到主内存。这通常会导致主内存更新相对较少,并且性能会很好。

但是,如果两个不同的线程尝试写入同一内​​存,则可能会出现性能问题。这可能会导致一致性缺失,从而导致缓存写入和更新到内存并降低性能。通常,软件的结构不会使两个不同的线程使用相同的堆栈。但是,如果发生这种情况,则某些体系结构上的性能可能会很差,因为不同线程的堆栈访问冲突会导致频繁的缓存未命中。