缓存中的命中率 - 读取长字节序列

hit ratio in cache - reading long sequence of bytes

假设一行缓存的大小为 2^nB。在逐字节长的连续内存中顺序读取的预期命中率是多少?

在我看来是 (2^n - 1) / 2^n。

但是,我不确定我是否正确。你怎么看?

是的,看起来很适合简单的硬件(非流水线,没有预取)。例如64B 高速缓存行有 1 次未命中和 63 次命中。


在真正的硬件上,即使是有序的单问题(非超标量)CPU,通常也支持 ,因此在 运行 超出加载缓冲区之前,您会看到未命中。这也使内存访问流水线化,这在不同缓存行的未命中可以同时进行而不是等待每个缓存行的完整延迟时很有用。

真正的硬件也会有硬件预取。例如,查看一些用例的英特尔 article about disabling HW prefetching

在大多数 CPU 上,硬件预取可能跟得上一次一个字节的循环,因此如果预取良好,您几乎看不到任何 L1 缓存未命中。

查看 Ulrich Drepper 的 What Every Programmer Should Know About Memory, and other links in the 标签 wiki,了解更多关于真实硬件性能的信息。