假设一行缓存的大小为2 ^ nB。在连续读取字节中按字节长连续内存预期的命中率是多少?
在我看来,它是(2 ^ n - 1)/ 2 ^ n。
但是,我不确定我是否正确。你觉得怎么样?
答案 0 :(得分:0)
是的,看起来适合简单的硬件(没有预取的非流水线)。例如64个缓存行有1个未命中和63个点击。
在真实硬件上,即使是有序单一问题(非超标量)CPU,通常也支持miss under miss (multiple outstanding misses),因此在用完加载缓冲区之前,您将看到未命中。这使得内存访问也是流水线化的,这对于可以同时处理不同缓存行的错误非常有用,而不是等待每个缓存行的完整延迟。
真正的硬件也会有硬件预取。例如,在某些用例中查看英特尔的article about disabling HW prefetching。
在大多数CPU上,硬件预取可能跟上一次一个字节的循环,因此通过良好的预取,您几乎看不到任何L1缓存未命中。
有关真实硬件性能的更多信息,请参阅Ulrich Drepper的What Every Programmer Should Know About Memory以及x86标记wiki中的其他链接。