缓存行大小背后的理论和度量是什么?

What's the theory and measurements behind cache line sizes?

缓存行通常是 64 字节,其他大小也存在。

我很简单的问题是:这个数字背后有什么理论,还是只是大量测试和测量的结果 背后的工程师无疑是这样做的?

不管怎样,我想知道那些(理论,如果有的话,以及决定背后的各种测试)是什么。

一般来说,微架构参数倾向于通过性能建模而不是某种理论模型来调整。也就是说没有像"big O"这样的东西用来表征算法的性能。相反,基准测试是 运行 使用性能模拟器,这用于指导最佳参数的选择。

话虽如此,缓存行大小在已建立的架构中将相当稳定的原因有几个:

  • Size is a powder of 2: line size 应该是2的幂,为了简化寻址,所以这样就限制了可能的选择数缓存行大小。

  • 软件根据缓存参数优化:许多微架构参数对程序员完全隐藏。但是缓存行大小是可见的,并且会对某些应用程序的性能产生重大影响。一旦程序员针对 64 字节缓存行大小优化了他们的代码,那么处理器架构师就有动力在未来的处理器中保持相同的缓存行大小,即使底层技术发生了变化,使得不同大小的缓存行更容易在硬件中实现。

  • 缓存一致性与缓存行交互:缓存一致性协议的验证极其困难,缓存一致性是处理器中许多错误的来源。在高速缓存行级别跟踪一致性,因此更改高速缓存行将需要重做一致性协议的所有验证步骤。所以需要有强烈的动机来改变这个参数。

  • 更改缓存行大小可能会引入虚假共享:这是软件根据缓存参数进行优化的特例,但我认为值得一提.并行程序很难以实际提供性能优势的方式编写。由于数据是在缓存行粒度上跟踪的,因此避免 false sharing 很重要。如果缓存行大小从一代处理器更改为另一代处理器,这可能会导致新处理器中的错误共享,而旧处理器中不存在。

虽然 64 字节是用于 x86 和大多数 ARM 处理器的行大小,但还有其他行大小在使用。例如,MIPS 有许多处理器的行大小为 32 字节,有些处理器的行大小为 16 字节。

行大小在某种程度上进行了调整,以便为架构预期的工作负载提供最佳性能 运行。但是,一旦选择了线宽,并且已经为架构编写了大量软件,那么线宽在未来就不太可能改变,原因我在上面列出。