缓存行通常 64字节,其他大小也存在。
我的一个非常简单的问题是:这个数字背后是否存在理论,或者仅仅是大量测试和测量的结果,毫无疑问,它背后的工程师办?
无论哪种方式,我都想知道那些(理论,如果有一个,以及决定背后的各种测试)。
答案 0 :(得分:3)
一般来说,微架构参数倾向于通过性能建模而不是某种理论模型进行调整。也就是说,没有像“大O”那样用于表征算法性能的东西。而是使用性能模拟器运行基准测试,这用于指导最佳参数的选择。
据说有一些原因可以解释为什么缓存行大小在已建立的架构中会相当稳定:
大小是2的幂:为了简化寻址,行大小应该是2的幂,因此这限制了缓存行大小的可能选择的数量。
软件基于缓存参数进行优化:许多微体系结构参数完全隐藏在程序员之外。但是缓存行大小是可见的,并且可能对某些应用程序的性能产生重大影响。一旦程序员针对64字节高速缓存行大小优化了代码,那么处理器架构师就有动力在未来的处理器中保持相同的高速缓存行大小,即使底层技术的改变使得不同大小的高速缓存行更容易用硬件实现。
缓存一致性与缓存行交互:缓存一致性协议的验证非常困难,缓存一致性是处理器中许多错误的来源。在高速缓存行级别跟踪一致性,因此更改高速缓存行将需要重做一致性协议的所有验证步骤。因此,需要有强烈的动机来改变这些参数。
更改缓存行大小可能会导致错误共享:这是基于缓存参数优化软件的特例,但我认为值得一提。并行程序很难以实际提供性能优势的方式编写。由于以缓存行粒度跟踪数据,因此避免false sharing非常重要。如果缓存行大小从一个处理器生成更改为另一个生成器,则可能导致新处理器中的错误共享(旧处理器中不存在)。
虽然64字节是用于x86和大多数ARM处理器的行大小,但还有其他行号正在使用中。例如,MIPS有许多处理器,其行大小为32字节,有些处理器的行大小为16字节。
在某种程度上调整行大小,以便为预期运行的体系结构提供最佳性能。但是,一旦选择了行大小,并且已经为该体系结构编写了大量软件,那么由于我在上面列出的原因,未来的行大小不太可能发生变化。