如何找到英特尔x86 CPU解码指令的微操作?

时间:2014-11-04 12:32:02

标签: x86 intel compiler-optimization

英特尔优化参考,根据第3.5.1节,建议:

"赞成单微操作说明。"

"避免使用具有4个以上微操作且需要多个周期进行解码的复杂指令(例如,输入,离开或循环)。请改用简单指令序列。"

尽管英特尔自己告诉编译器编写者使用可以解码少数微操作的指令,但我在他们的任何手册中都找不到任何东西,这解释了每个ASM指令解码的微操作数量!这些信息是否随处可用? (当然,我希望不同代CPU的答案会有所不同。)

3 个答案:

答案 0 :(得分:11)

Agner Fog关于x86指令的PDF document(链接主页汉斯引用)是我在指令时序和微操作上发现的唯一参考。我从未见过关于微操作故障的英特尔文档。

答案 1 :(得分:5)

除了其他答案(Agner Fog's tablesIACA)中已经提到的资源之外,您还可以找到有关最新Intel CPU(从Nehalem到Cannon Lake)上大多数x86指令的μop的详细信息。 )在我们的网站uops.info上。该网站还包含有关每个指令的延迟和吞吐量的信息。通过在实际硬件(使用硬件性能计数器)和不同版本的IACA上运行自动生成的微基准来获取数据。

与Agner Fog的指令表相比,uops.info上的数据在某些情况下更加准确。例如,考虑有关Nehalem的PBLENDVB指令。根据Agner Fog的表,该指令有一个只能使用端口0的μop,和一个只能使用端口5的μop。这可能是基于以下观察结果:在独立地重复执行该指令时,平均而言,端口0上一个μop,端口5上一个μop。uops.info上的微基准表明,实际上两个μop都可以使用端口0和端口5。这是通过执行指令以及只能使用端口0的指令来确定的或端口5。

uops.info上的数据还揭示了英特尔IACA中的一些错误。例如,在Skylake的CVTPI2PS XMM的两个μop上,MM指令只能使用IACA(http://uops.info/html-ports/SKL/CVTPI2PS_XMM_MM-IACA3.0.html)中的端口0。在实际的硬件上,只有一个μop只能使用端口0,而一个μop可以同时使用端口0和端口1。但是,他声称此μop只能使用端口1,这是不正确的。

答案 2 :(得分:1)

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

在某些情况下很容易猜到:Haswell的haddps端口为1 uop,端口5为2 uops。显然有2次shuffle(端口5)和FP-add(端口1)。端口5上有许多其他执行单元,例如向量布尔值,SIMD整数加法和大量标量整数,但鉴于haddps需要多个uops,英特尔通过随机播放和常规"垂直&#实现它非常明显34;加上uop。

有可能弄清楚那些uops之间的依赖关系(例如,2个shufps样式的shuffle是否为FP添加,或者是shuffle-add-shuffle?)。我们也不确定shuffle是否相互独立:Haswell只有一个shuffle端口,因此资源冲突会给我们5c的总延迟,因为shuffles不能并行运行,即使它们是是独立的。

两个shuffle uops可能都需要两个输入,所以即使它们彼此独立,让一个输入比另一个更早就不会改善关键路径的延迟(来自较慢的输入)到输出)。

如果可以实现具有2个独立单输入shuffle的HADDPS,那意味着在xmm1为常量的循环中的HADDPS xmm0,xmm1将仅向涉及xmm0的dep链添加4c的延迟。我没有测量,但我认为这不太可能;几乎可以肯定,它是两个独立的双输入shuffle来为ADDPS提供uop。