【发布时间】:2016-11-06 08:40:27
【问题描述】:
我有一个用一些 intel-intrinsincs 编写的 C 代码。在我先用 avx 然后用 ssse3 标志编译它之后,我得到了两个完全不同的汇编代码。例如:
AVX:
vpunpckhbw %xmm0, %xmm1, %xmm2
SSSE3:
movdqa %xmm0, %xmm2
punpckhbw %xmm1, %xmm2
很明显,vpunpckhbw 只是 punpckhbw,但使用的是 avx 三操作数语法。但是第一条指令的延迟和吞吐量是否等于最后一条指令的延迟和吞吐量的总和?
还是答案取决于我使用的架构?顺便说一下,它是 IntelCore i5-6500。
我试图在 Agner Fog 的说明表中搜索答案,但找不到答案。英特尔规范也没有帮助(但是,我可能只是错过了我需要的那个)。
如果可能,使用新的 AVX 语法总是更好吗?
【问题讨论】:
-
有些日子,你不只是渴望mov al,8的旧时光 :-)
-
@Neil 哦,是的,我渴望
rep movsb被认为是 SIMD 的日子。 -
如果您需要支持 AVX,那么您的问题的答案很可能没有实际意义,因为在旧类型(非 VEX)SSE 指令和 VEX 编码 SSE 之间切换会导致高性能损失/AVX 指令在运行时。因此,它是“全有或全无”。
-
您的 CPU 每个时钟周期只能推送 4 个微融合微操作。在 AVX 情况下,负载可以微熔。在 SSE 的情况下,它不能。这可能意味着在一个紧密的循环中,SSE 案例需要五个微操作,而 AVX 案例只需要四个融合微操作。这可能会对性能产生很大影响。请参阅this 了解更多详情或等待 Peter Cordes 回复更多更好的细节。
-
我见过一些情况,使用
-mavx重新编译遗留 SSE 代码会带来适度的性能提升,这可能是由于非破坏性 VEX SSE 指令减少了需要执行的指令数同样的工作。