Z b*_*son 7 assembly sse intel
我试图在切换执行单元的域时理解可能的旁路延迟.
例如,以下两行代码给出了完全相同的结果.
_mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 8)));
_mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40));
Run Code Online (Sandbox Code Playgroud)
哪一行代码更好用?
第一行的汇编输出给出:
vpslldq xmm1, xmm0, 8
vaddps xmm0, xmm1, xmm0
Run Code Online (Sandbox Code Playgroud)
第二行的汇编输出给出:
vshufps xmm1, xmm0, XMMWORD PTR [rcx], 64 ; 00000040H
vaddps xmm2, xmm1, XMMWORD PTR [rcx]
Run Code Online (Sandbox Code Playgroud)
现在,如果我看一下Agner Fog的微体系结构手册,他给出了第112页的一个例子,在浮点值上使用整数shuffle(pshufd),而在float值上使用float shuffle(shufps).交换域增加了4个额外的时钟周期,因此使用shufps的解决方案更好.
我列出的第一行代码_mm_slli_si128
必须在整数和浮点向量之间切换域.第二个使用_mm_shuffle_ps
停留在同一个域中.这是否意味着第二行代码是更好的解决方案?