【发布时间】:2020-06-26 00:29:07
【问题描述】:
我正在阅读一些关于英特尔奔腾处理器的invlpg 指令的documentation,它说它需要25 个时钟周期。我认为这取决于实现(特定的 CPU)而不是实际的指令集架构?还是说这条指令必须花费 25 个时钟周期才能运行也是指令集规范的一部分?
【问题讨论】:
标签: performance assembly x86 instruction-set cpu-cycles
我正在阅读一些关于英特尔奔腾处理器的invlpg 指令的documentation,它说它需要25 个时钟周期。我认为这取决于实现(特定的 CPU)而不是实际的指令集架构?还是说这条指令必须花费 25 个时钟周期才能运行也是指令集规范的一部分?
【问题讨论】:
标签: performance assembly x86 instruction-set cpu-cycles
文档说 Pentium 需要 25 个时钟周期。指令在其他 CPU 上占用的时钟周期数可能更多或更少。指令的性能不是指令集规范的一部分。
【讨论】:
这个数字不是任何官方 ISA 文档的一部分,它只是有人在英特尔 ISA 文档的旧(当时)副本中注释的性能数据。
它来自一些随机的微架构,大概是 P5 Pentium,当 Tripod 是一个广泛使用的网络主机时,它是相关的,并且该指南将自己标记为文档。 (These days there are Pentium/Celeron CPUs 只是同一代 i3/i5/i7 的缩减版本,禁用了 AVX 和 BMI1/2 等功能。但 Pentium 过去指的是P5 microarchitecture。)
它不是来自英特尔的文档;它是由编译该 HTML 的人添加的。格式类似于 Intel 的 vol.2 x86 SDM 指令集参考手册的现代版本。例如,您可以在 https://github.com/HJLebbink/asm-dude/wiki/INVLPG 和 https://www.felixcloutier.com/x86/invlpg 找到它的 HTML 摘录。顶部的编码/助记符/描述表在您的 Tripod 链接中具有相同的格式,但实际文本有些不同。此外,inc 的文本(current Intel 与 tripod)一字不差。
是的,这是基于 Intel vol.2 手册的旧 PDF->HTML,添加了 P5 周期和指令配对信息(U 或 V 管道中的inc 对在不会将指令分解为微指令的双问题有序管道上)。还带有 FLAGS 更新部分变成了表格。
在为 Skylake 和 Zen 等现代微架构进行调优时,指令配对和循环计数信息完全无关紧要,但您可以在 Agner Fog's instruction tables 中找到它:他的电子表格有一张 P5 以及后来的英特尔的表格, AMD 和 Via 微架构。 (有关背景信息,请参阅他的优化指南和 microarch pdf,以帮助您了解 uops / 端口 / 延迟 / 吞吐量信息。)Agner 不测试大多数内核指令,因此 invlpg 不在他的列表中。
http://faydoc.tripod.com/cpu/index.htm 显然不是英特尔的官方来源。 IDK 的作者从哪里获得了他们的信息。也许他们测试了自己。或者英特尔有时会发布一些微架构的时序数字,例如作为优化手册的一部分。这与 x86 ISA 手册完全不同,您不能依赖它来确保正确性。并且其他人已经公布了他们的测试结果。
另一个关于指令性能(端口、延迟和吞吐量的微指令)实验测试结果的良好来源是https://uops.info/。他们对invlpg m8 的测试表明它具有回溯性在 Skylake 客户端的实践中,反向吞吐量约为 194 个周期,Nehalem 上约为 157,Zen+ 和 Zen2 上约为 126.25,以选择一些随机示例。但它可能与其他指令更好地交错,在最近的英特尔 CPU 上“仅”占用 47 个前端 uops,因此如果后端在 ROB / RS 中有空间,则可以在 12 个周期内发出,可能让后面的指令在执行时执行invlpg 操作正在进行中。 (尽管如果它的 uops 需要超过 100 个周期才能退休,这通常会使 OoO exec 在总时间的一小部分时间停止。)
请记住,指令性能不能用乱序 CPU 上的单个数字来表征;它不是一维的。性能分析并不像将循环中所有指令的循环成本相加那样简单,您必须分析它们如何相互重叠。或者对于像invlpg 这样的复杂情况,测量。
【讨论】: