Ros*_*ana 1 architecture cpu cpu-architecture execution cpu-cache
每条指令未命中和计算机执行时间中的未命中惩罚有什么区别?这个问题与计算机体系结构有关。
每条指令未命中数(MPI,或更广为人知的每 1000 条指令的 MPKI 未命中数)是一种统计数据,它描述了给定工作负载在具有给定缓存层次结构的特定机器上的行为方式。这取决于访问模式(您的代码是一遍又一遍地访问相同地址,还是一直访问新地址?重复地址的“重用距离”是多少?)以及缓存大小、关联性、替换政策等。它也是特定于每个缓存的 - 给定的工作负载对于 L1 缓存、L2 和 L3(或您可能拥有的任何其他缓存层次结构)将具有不同的 MPKI 值。
顺便说一句 - 另一个类似的统计数据是缓存命中率(总访问中的命中数) - 这两个根据每个 X 指令的内存操作数相关。
以上所有内容都可能暗示您的缓存对给定代码的行为有多有效(此代码是否由于缓存行为而遇到内存瓶颈),但它仍然没有告诉您每次访问的速度有多快。为此,您应该测量未命中惩罚 - 您必须等待多少个周期才能从下一级缓存中获取一行。这当然因系统而异,但在现代 CPU 上,例如,对于访问 L1 的访问期望有几个(3-5 个周期),对于错过 L1 并访问 L2 的访问,大约需要 10 个周期,大约为 30访问 L3 的周期,对于缺少所有缓存级别并一直到内存的访问,大约为 100 甚至更多。
这两个统计信息的组合可以粗略地描述您将在代码中花费多长时间在内存访问上,但它仍然没有告诉您运行时需要多长时间 - 它取决于访问可能如何交错(如果没有依赖和它们可以并行提交),考虑到您的 CPU 支持多少超出的请求(每个级别取决于不同的资源和限制,例如行填充缓冲区、内存信用、总线带宽等)。遍历链表 for eg 意味着所有访问都是序列化的,因此如果您的未命中率很高,则必须累积未命中的惩罚。并行访问会更快,尽管正如我所说 - 仍然受到物理限制的限制。
总的来说,当您想要分析和优化代码时,这些统计数据非常有用,因为它们可能表明瓶颈在哪里,以及您的系统让您为此付出了多少。
| 归档时间: |
|
| 查看次数: |
5904 次 |
| 最近记录: |