3

每条指令的未命中与计算机执行时间的未命中惩罚有什么区别?这个问题与计算机体系结构有关。

4

1 回答 1

5

每条指令未命中(MPI,或者更好地称为每 1000 条指令的 MPKI 未命中)是描述给定工作负载在具有给定缓存层次结构的特定机器上如何表现的统计数据。它取决于访问模式(您的代码是一遍又一遍地访问相同的地址,还是一直访问新地址?重复地址的“重用距离”是多少?),以及缓存大小、关联性、替换政策等等。它也是特定于每个缓存的——给定的工作负载对于 L1 缓存、L2 和 L3(或您可能拥有的任何其他缓存层次结构)将具有不同的 MPKI 值。

顺便说一句 - 另一个类似的统计数据是缓存命中率(总访问次数中的命中数) - 这两者与每条 X 指令的内存操作数有关。

以上所有内容都可能暗示您的缓存对给定代码的行为有多有效(此代码是否由于缓存行为而遇到内存瓶颈),但它仍然不能告诉您每次访问的速度有多快。为此,您应该测量未命中惩罚 - 您必须等待多少个周期才能从下一级缓存中获取一行。这当然因系统而异,但在现代 CPU 上,例如,对于命中 L1 的访问来说,期望几个(3-5 个周期)的访问是很常见的,对于错过 L1 并命中 L2 的访问,~10 是很常见的,~30访问到 L3 的周期,对于缺少所有缓存级别并一直到内存的访问,大约 100 甚至更多。

这两个统计数据的组合可以大致描述您在代码中花费多长时间进行内存访问,但它仍然不能告诉您运行时将多长时间 - 这取决于访问如何交错(如果没有依赖和它们可能是并行提交的),考虑到您的 CPU 支持多少未处理请求(每个级别取决于不同的资源和限制,例如行填充缓冲区、内存信用、总线带宽等)。例如,遍历链表意味着所有访问都是序列化的,因此如果您的未命中率很高,则必须累积未命中惩罚。并行访问会更快,尽管正如我所说 - 仍然受到物理限制的限制。

总体而言,当您想要分析和优化代码时,这些统计数据非常有用,因为它们可能表明瓶颈在哪里,以及您的系统需要为它们支付多少费用。

于 2013-10-14T13:06:48.783 回答