如何在Intel';s x86 CPU解码到?

如何在Intel';s x86 CPU解码到?,x86,intel,compiler-optimization,X86,Intel,Compiler Optimization,“英特尔优化参考”在第3.5.1节中建议: “支持单微操作说明。” 避免使用包含4个以上微操作且需要多个周期才能解码的复杂指令(例如,输入、输出或循环)。请改用简单指令序列 虽然英特尔自己告诉编译器编写者使用解码到几个微操作的指令,但我在他们的任何手册中都找不到任何解释每个ASM指令解码到多少微操作的内容!这些信息在任何地方都有吗?(当然,我希望不同代CPU的答案会有所不同。)Agner Fog关于x86指令的PDF(链接到主页Hans cites)是我找到的关于指令计时和微操作的唯一参考资料。

“英特尔优化参考”在第3.5.1节中建议:

“支持单微操作说明。”

避免使用包含4个以上微操作且需要多个周期才能解码的复杂指令(例如,输入、输出或循环)。请改用简单指令序列


虽然英特尔自己告诉编译器编写者使用解码到几个微操作的指令,但我在他们的任何手册中都找不到任何解释每个ASM指令解码到多少微操作的内容!这些信息在任何地方都有吗?(当然,我希望不同代CPU的答案会有所不同。)

Agner Fog关于x86指令的PDF(链接到主页Hans cites)是我找到的关于指令计时和微操作的唯一参考资料。我从未见过有关Microop细分的英特尔文档。

Agner Fog的insn表显示了Microop在哪个端口上运行,这对性能至关重要。它并没有确切地显示每个uop都做了什么,因为这不是你可以逆向工程的东西。(即,在该端口上使用哪个执行单元)

不过,在某些情况下很容易猜测:
hasdps
on Haswell的端口为1个uop,端口5为2个uop。很明显,这是2次洗牌(端口5)和一次FP添加(端口1)。端口5上还有许多其他执行单元,例如向量布尔、SIMD整数加法和许多标量整数内容,但鉴于
haddps
需要多个uop,很明显Intel通过随机洗牌和常规的“垂直”加法uop来实现它

也许可以弄清楚这些UOP之间的依赖关系(例如,是2个shufps样式的洗牌给FP添加,还是洗牌添加洗牌?)。我们也不确定洗牌是否相互独立:Haswell只有一个洗牌端口,因此资源冲突会给我们5%的总延迟,因为洗牌即使是独立的,也不能并行运行

两个shuffle uop可能都需要两个输入,因此即使它们彼此独立,一个输入比另一个更早准备好也不会改善关键路径的延迟(从较慢的输入到输出)


如果可以用两个独立的单输入洗牌来实现HADDP,这意味着在xmm1为常数的循环中,HADDPS xmm0、xmm1只会给涉及xmm0的dep链增加4c的延迟。我没有测量过,但我认为不太可能;几乎可以肯定的是,为ADDPS uop提供数据需要两个独立的2输入随机序列。

已经指出,这是一个非常好的资源,尤其是his,它几乎全面地支持所有感兴趣的x86微体系结构

但您还有另一个选择:。有一篇关于如何使用它的文章,但是它非常简单(尽管对于一次性分析来说有点乏味)。您只需下载可执行文件,围绕要分析的指令块发出一些开场白和尾声代码(它包括一个用于此目的的C头(
iacaMarks.h
),可与各种编译器一起工作,或者您只需指示汇编程序发出相应的字节),然后通过
iaca.exe
运行二进制文件。当前版本(v2.2)仅支持64位二进制文件,但这不是主要限制,因为对于32位和64位模式,指令级分析不会有实质性的不同。从Nehalem到Broadwell,当前版本还支持专业软件开发人员可能感兴趣的所有现代英特尔微体系结构

从该工具获得的输出将告诉您特定指令可以在哪些端口上执行,以及该指令将在指定的微体系结构上分解为多少µOp

这是您将要直接回答问题的最接近的答案,因为每个指令分解为的确切µops由Intel故意保密。它们不仅是专有的商业秘密,而且英特尔希望能够自由地将其工作方式从一种微体系结构更改为另一种微体系结构。但事实上,在优化代码时,一条指令分解成多少µops是您想要知道的全部。指令分解为哪个操作并不重要

但我要重申其中的一部分:“尽管在某些情况下很容易猜测”。如果您必须为正在考虑的每个指令查找此类详细信息,您将浪费大量时间。你也会让自己发疯,因为正如你已经知道的,不同的微体系结构,它是不同的。这里真正的诀窍是直观地感觉x86 ISA中的哪些指令“简单”,哪些指令“复杂”。通过阅读文档,这一点应该非常明显,而这种直观的感觉正是英特尔的优化建议所驱使您实现的目标。避免使用“复杂”(旧CISC样式)指令,如
循环
输入
离开
,等等。例如,与
循环相比,更喜欢
DEC
+
JNZ
。相对而言,只有一小部分“经典”x86指令能够解码到一个或两个以上的µops。*研究一个好的优化编译器的输出也将引导您走向正确的方向,因为您永远不会看到编译器使用这些“复杂”指令

虽然与Peter的回答有些相反,但我很确定英特尔优化手册中引用的部分是而不是指的是SIMD指令。他们谈论的是在微码中实现的老式CISC指令,如果不支持它们的向后兼容性,它们可能已经放弃了。如果你需要