我有一段使用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语法吗?
rep movsb
是 SIMD 的日子。 - fuzmovdqa %xmm0,%xmm2
与i5-6500
具有零延迟,但它仍然会影响吞吐量,因为它仍然被计算为一条指令。 - Z boson