新的AVX指令语法

4

我有一段使用intel指令集编写的C语言代码。在我先使用avx编译,然后使用ssse3标志编译之后,我得到了两个非常不同的汇编代码。例如:

AVX:

vpunpckhbw  %xmm0, %xmm1, %xmm2 

SSSE3:

movdqa %xmm0, %xmm2
punpckhbw %xmm1, %xmm2

很明显,vpunpckhbw 只是使用AVX三操作数语法的 punpckhbw。但第一个指令的延迟和吞吐量是否等同于后面两个指令的延迟和吞吐量之和呢?还是答案取决于我正在使用的架构?顺便说一下,我的架构是Intel Core i5-6500。

我试图在Agner Fog的指令表中寻找答案,但没有找到。英特尔规格说明也没有帮助(不过,我可能只是错过了需要的那个)。

如果可能的话,总是更好地使用新的AVX语法吗?


5
有些日子,你是否也会渴望过去的“mov al,8”时代呢?:-) - Neil
2
@Neil 哦,是的,我渴望那些认为 rep movsb 是 SIMD 的日子。 - fuz
2
你的CPU每个时钟周期只能推送4个微融合微操作。在AVX情况下,负载可以进行微融合,而在SSE情况下则不行。这可能意味着在一个紧密循环中,SSE情况需要五个微操作,而AVX情况只需要四个融合微操作。这可能会对性能产生重大影响。请参见此处以获取更多详细信息或等待Peter Cordes提供更多和更好的详细信息。 - Z boson
3
我曾经看过一些情况,只需使用“-mavx”重新编译遗留的SSE代码就会带来适度的性能提升,这可能是由于非破坏性VEX SSE指令减少了执行相同任务所需的指令数量。 - Paul R
1
是的,在这个答案中写道:“在IvyBridge及以后,寄存器重命名阶段处理reg-reg移动,并且它们发生时具有零延迟。”因此,movdqa %xmm0,%xmm2i5-6500具有零延迟,但它仍然会影响吞吐量,因为它仍然被计算为一条指令。 - Z boson
显示剩余8条评论
1个回答

5

如果可能的话,总是使用新的AVX语法是否总是更好?

我认为首先需要问的问题是折叠指令是否比非折叠指令对更好。折叠将一对读取和修改指令像这样:

vmovdqa %xmm0, %xmm2
vpunpckhbw %xmm2, %xmm1, %xmm1

并将它们“折叠”成一个组合指令
vpunpckhbw  %xmm0, %xmm1, %xmm2

自从Ivy Bridge以来,寄存器到寄存器的移动指令可以具有零延迟并且可以使用零执行端口。 然而,展开的指令对于前端仍然算作两条指令,因此可能会影响整体吞吐量。 然而,折叠指令在前端只计为一条指令,这降低了前端的压力,没有任何副作用。 这可以增加整体吞吐量。
然而,对于内存注册移动来说,折叠可能会产生副作用(目前有一些争论),即使它降低了前端的压力。原因是,从前端的角度来看,乱序引擎只会看到一个折叠指令(假设这个答案是正确的),如果由于某种原因独立于其他操作重新排序内存读取操作(因为它需要执行端口并具有延迟),那么乱序引擎将无法利用这一点。我在这里首次观察到这一现象。
对于您特定的操作,AVX语法总是更好的,因为它可以将寄存器折叠到寄存器移动。然而,如果您有一个内存到寄存器的移动,折叠AVX指令在某些情况下可能比未折叠的SSE指令对性能更差。
请注意,一般情况下,使用vex编码指令应该仍然更好。但我认为大多数编译器现在都假定折叠始终更好,因此您无法控制折叠,除非使用汇编(甚至不是内部函数),或在某些情况下告诉编译器不要使用AVX进行编译。

1
是的,使用VEX编码的非破坏性目标特性以避免寄存器到寄存器的mov指令总是更好的选择。我认为“折叠”不是正确的词语。将其视为实际上将movdqa指令与ALU操作组合起来是错误的心理图像,在我看来。这不像将负载折叠到ALU指令中那样,因为寄存器重命名意味着punpckhbw %xmm1,%xmm2的结果已经被写入与任一输入不同的物理寄存器中。对于术语,“mov消除”也已经被使用了 :/ - Peter Cordes
2
不确定您所说的“在Sandy Bridge处理器上... [3操作数]指令可能表现更差”,即使在寄存器-寄存器情况下也是错误的。除非您要摆脱的movdqa占用了正确数量的空间以便稍后对齐某些内容。由于在SnB(而不是IvB或更高版本)上,movqda仍然需要执行端口,因此使用VEX编码来避免它会带来更大的优势。 - Peter Cordes
@PeterCordes,你对我在Sandy Bridge上的评论完全正确。我理解你关于术语的观点,因为折叠意味着微操作融合,这适用于内存读/写,但我认为类比折叠是可以的。使用reg reg移动进行折叠相当于使用mem reg移动,只是它不需要微操作并且不使用端口。 - Z boson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接