我正在努力使用AVX优化此循环(仅限摘录,NASM语法):
.repete:
vmulpd ymm4, ymm1, ymm2
vhaddpd ymm5, ymm4, ymm4
vextractf128 xmm6, ymm5, 1
vaddsd xmm5, xmm5, xmm6
vcvtss2sd xmm7, [MSI + MCX * 4]
vmulsd xmm3, xmm7, xmm0
vaddsd xmm5, xmm5, xmm3
; Store result.
vcvtsd2ss xmm6, xmm5, xmm5
vmovss [MDI + MCX * 4], xmm6
vunpcklpd xmm7, xmm5, xmm7 (!!!!!!!!!!!!!!!!!!!!)
MSSE_SHUFFLEAVX(ymm2, ymm2, ymm7, 2, 0)
inc ecx
cmp ecx, edx
jl .repete
当存在(!!!!)标记指令时,它大约慢3倍。如果我将其更改为“vmovapd ymm7,ymm5”(仅用于测试),同样的事情。显然,对xmm5的依赖是问题所在。我试图通过将xmm5计算移动到开头来绕过它,但没有运气。
任何想法如何绕过它?或者它可能是别的吗?有关于这些事情的指南吗?最后AVX真正被vmulpd和vhaddpd所利用,所以也许它不值得吗?