我正在阅读一些关于英特尔奔腾处理器指令的文档invlpg
,它说它需要 25 个时钟周期。我认为这取决于实现(特定的 CPU)而不是实际的指令集架构?还是该指令必须花费 25 个时钟周期才能运行的事实也是指令集规范的一部分?
2 回答
文档说 Pentium 需要 25 个时钟周期。指令在其他 CPU 上占用的时钟周期数可能更多或更少。指令的性能不是指令集规范的一部分。
该数字不是任何官方 ISA 文档的一部分,它只是有人在英特尔 ISA 文档的旧(当时)副本中注释的性能数据。
它来自一些随机的微架构,大概是 P5 Pentium,当 Tripod 是一个广泛使用的网络主机时,它是相关的,并且该指南将自己标记为文档。(现在有 Pentium/Celeron CPU只是同一代 i3/i5/i7 的精简版本,禁用了 AVX 和 BMI1/2 之类的东西。但 Pentium 过去指的是P5 微架构。)
它不是来自英特尔的文档。它是由编译该 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 vs. tripod)的文字是逐字相同的。
所以是的,这是基于英特尔第 2 卷手册的旧 PDF->HTML,添加了 P5 周期和指令配对信息(inc
在该双问题有序管道上的 U 或 V 管道中的对不将指令分解为微指令)。还与 FLAGS 更新部分变成了表格。
在为 Skylake 和 Zen 等现代微架构进行调优时,指令配对和周期计数信息完全无关紧要,但您可以在Agner Fog 的指令表中找到它:他的电子表格有一张用于 P5 以及后来的 Intel、AMD、和通过微架构。(另请参阅他的优化指南和 microarch pdf 以获取背景信息,以帮助您了解 uops / 端口 / 延迟 / 吞吐量信息。) Agner 不测试大多数内核指令,因此 invlpg 不在他的列表中。
http://faydoc.tripod.com/cpu/index.htm显然不是英特尔的官方来源。IDK 的作者从哪里获得了他们的信息。也许他们测试了自己。或者英特尔有时会发布一些微架构的计时数字,例如作为优化手册的一部分。这与 x86 ISA 手册完全不同,您不能依赖它来保证正确性。其他人已经公布了他们的测试结果。
指令性能(端口、延迟和吞吐量的微指令)的实验测试结果的另一个好来源是https://uops.info/。 他们的测试invlpg m8
表明它在 Skylake-client 上的实际背靠背吞吐量约为 194 个周期,在 Nehalem 上约为 157 个周期,在 Zen+ 和 Zen2 上约为 126.25 个周期,以挑选一些随机示例。但它可能与其他指令更好地交错,在最近的英特尔 CPU 上“仅”占用 47 个前端 uops,因此如果后端在 ROB / RS 中有空间,则可以在 12 个周期内发出,可能让后面的指令在执行时执行invlpg
操作正在进行中。(尽管如果它的 uops 需要超过 100 个周期才能退休,这通常会使 OoO exec 在总时间的一小部分时间停止。)
请记住,指令性能不能用乱序 CPU 上的单个数字来表征。它不是一维的。性能分析并不像将循环中所有指令的周期成本相加那样简单,您必须分析它们如何相互重叠。或者对于复杂的情况,例如invlpg
,测量。