每条指令的未命中与计算机执行时间内的未命中罚分有什么不同?这个问题与计算机体系结构有关。
答案 0 :(得分:4)
每条指令未命中(MPI,或者更好地称为每1000条指令的MPKI未命中)是一个统计信息,用于描述给定工作负载在具有给定缓存层次结构的特定计算机上的行为方式。它取决于访问模式(您的代码是一遍又一遍地访问相同的地址,还是一直使用新的地址?"重复使用距离"对于重复地址?),以及缓存尺寸,相关性,更换政策等。它也是每个缓存特定的 - 给定的工作负载将具有L1缓存,L2和L3(或您可能具有的任何其他缓存层次结构)的不同MPKI值。
顺便说一下 - 另一个类似的统计数据是缓存命中率(总访问次数中的命中数) - 这两个是根据每个X指令的内存操作数相关的。
上述所有内容都可能暗示您的缓存对给定代码的行为有效程度(此代码是否由于缓存行为而遇到内存瓶颈),但它仍然没有告诉您每次访问的速度有多快。为此,您应该测量未命中的惩罚 - 您必须等待从下一级缓存中获取一行的周期数。当然,这在每个系统上是不同的,但在现代CPU上,例如,期望一些(3-5个周期)用于访问L1的访问,~10个用于错过L1并且访问L2的访问,~30个周期用于访问L3,这是很常见的,和~100甚至更多的访问丢失所有缓存级别并一直到内存。
这两个统计数据的组合可以粗略地描述您在代码中花费多长时间进行内存访问,但它仍然没有告诉您运行时间有多长 - 这取决于访问的交错方式(如果没有依赖关系并且它们可以并行提交),给定CPU支持多少个超出请求(每个级别取决于不同的资源和限制,例如行填充缓冲区,内存信用,总线带宽等等。 )。遍历链接列表,例如意味着所有访问都是序列化的,因此如果您的错失率很高,则必须累积未命中罚金。并行访问会更快,尽管如我所说 - 仍然受到物理限制的限制。
总的来说,当您想要分析和优化代码时,这些统计数据非常有用,因为它们可能表明瓶颈在哪里,以及您的系统为您支付多少费用。