计算内存访问的平均时间

Gre*_*ron 3 memory performance computer-science cpu-architecture cpu-cache

我发现很难理解局部和全局未命中率之间的差异以及如何计算内存访问的平均时间,我只想举一个我试图解决的问题的例子。如果有人能告诉我我是否在正确的轨道上,或者我是否错了我错过的东西,我将不胜感激。

考虑以下多级缓存层次结构及其寻道时间和未命中率:

  • L1 缓存,0.5 ns,20%
  • L2 缓存,1.8 ns,5%
  • L3 缓存,4.2 ns,1.5%
  • 主存储器,70 ns,0%

在这种情况下,给出的寻道时间是指检查请求的数据在当前层次结构上是否可用,并将数据传输到上层(或 CPU)所需的总时间。这和命中时间一样吧?给出的未命中率是本地的。正如我所理解的,一个级别的未命中率需要乘以所有先前级别的未命中率才能对该级别进行正确处理。

假设我们有 1000 次内存访问,在 L1 中,其中 20% 会丢失。因此,其中 20% 将进入 L2,其中 5% 将错过。因此,从 1000 次内存访问中,1000 * 20% * 5% 将到达那里。现在,据我所知......如果我错了,请纠正我,上述未命中率是局部的,但它们的乘积是每个相应级别的全局未命中率。这意味着 L2 的全局未命中率为 0,2*0,05 = 1%。

现在,我可能对这个计算非常错误,但这就是我的想法:

AMAT (Average Memory Access Time) = Hit time + Miss rate * Miss penalty

AMAT = 0.5 + 0.2 * (1.8 + 0.2 * 0.05 * (4.2 + 0.2 * 0.05 * 0.015 * 70))
Run Code Online (Sandbox Code Playgroud)

计算后我得到 AMAT = 0.868421 ns

我这样做正确吗?

Gre*_*ron 6

现在我很清楚全局和局部未命中率到底是什么,因此我意识到我在计算中犯了一个错误。

之前,计算是这样的:

AMAT = 0.5 + 0.2 * (1.8 + 0.2 * 0.05 * (4.2 + 0.2 * 0.05 * 0.015 * 70)) = 0.868421 ns

这意味着,例如,L1 的局部未命中率会影响层次结构中每个更远的未命中惩罚的贡献,太多次……当它已经在前一阶段被考虑在内时。

正确的解决方法应该是:

AMAT = 0.5 + 0.2 * (1.8 + 0.05 * (4.2 + 0.015 * 70)) = 0.9125 ns

因此,递归地我们可以定义:

AMAT = L1 命中时间 + L1 未命中率 * L1 未命中惩罚

L1 未命中惩罚 = L2 命中时间 + L2 未命中率 * L2 未命中惩罚

L2 未命中惩罚 = L3 命中时间 + L3 未命中率 * L3 未命中惩罚

L3 未命中惩罚 = 主存命中时间

  • 很好的答案,添加“递归”公式可以更容易地理解这类事情! (3认同)