【发布时间】:2016-12-18 19:02:37
【问题描述】:
假设一行缓存的大小为 2^nB。连续读取字节长的连续内存中预期的命中率是多少?
在我看来是 (2^n - 1) / 2^n。
但是,我不确定我是否正确。你怎么看?
【问题讨论】:
-
你能问你的教授或同学这些琐碎的初学者问题吗?此外,这与 x86 无关,因为真正的 x86 硬件具有预取功能,因此请取消标记。
标签: caching cpu-architecture cpu-cache
假设一行缓存的大小为 2^nB。连续读取字节长的连续内存中预期的命中率是多少?
在我看来是 (2^n - 1) / 2^n。
但是,我不确定我是否正确。你怎么看?
【问题讨论】:
标签: caching cpu-architecture cpu-cache
是的,看起来适合简单的硬件(非流水线,没有预取)。例如64B 高速缓存行 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 中的其他链接,了解有关真实硬件性能的更多信息。
【讨论】: