Optimization 如何连接两个SSE寄存器的低半部?
我有两个SSE寄存器,我想用另一个的低半部替换其中的高半部。和往常一样,这是最快的方式 我想可以将其中一个寄存器移位8个字节,然后Optimization 如何连接两个SSE寄存器的低半部?,optimization,x86,sse,simd,Optimization,X86,Sse,Simd,我有两个SSE寄存器,我想用另一个的低半部替换其中的高半部。和往常一样,这是最快的方式 我想可以将其中一个寄存器移位8个字节,然后aligner连接起来 是否有任何单一指令解决方案?您可以使用该解决方案将两个寄存器的低半部分合并为单个寄存器中的hi:lo。这与movlhpsFP指令的功能相同,也与unpcklpd相同,但在CPU上的整数域中运行,它关心FP与整数洗牌的旁路延迟 额外读数:组合两个寄存器的不同部分 palignr仅适用于将hi:xxx与xxx:lo组合,以产生lo:hi(即反向)
aligner
连接起来
是否有任何单一指令解决方案?您可以使用该解决方案将两个寄存器的低半部分合并为单个寄存器中的hi:lo。这与movlhps
FP指令的功能相同,也与unpcklpd
相同,但在CPU上的整数域中运行,它关心FP与整数洗牌的旁路延迟
额外读数:组合两个寄存器的不同部分
palignr
仅适用于将hi:xxx
与xxx:lo
组合,以产生lo:hi
(即反向)。您可以使用FP shuffle(注册格式为movsd
)来获取hi:lo
(通过移动xxx:lo
的下半部分来替换hi:xxx
中的低垃圾)。如果没有这一点,您可能希望使用punpckhqdq
将一个寄存器的高半部转换为低半部,然后使用punpcklqdq
将两个寄存器的低半部合并
在除Intel Nehalem之外的大多数CPU上,整数数据上的浮点洗牌通常都很好(在向量整数ALU指令之间使用时,很少或没有额外延迟)。在Nehalem上,您可能会在浮点洗牌中获得两个周期的额外延迟(总共有4个周期的延迟),但如果它是循环携带的依赖链的一部分,这只是吞吐量的一个大问题。有关更多信息,请参阅
Agner的《优化汇编指南》还有一整节SSE/AVX指令表,可用于寄存器内或寄存器之间的各种数据移动。有关链接,请参见tag wiki,下载PDF,阅读第130页第13.7节“排列数据”
要将FP Shuffle与内部函数一起使用,您必须使用
\u mm\u castsi128\u ps
和\u mm\u castps\u si128
,这是不发出指令的重新解释强制转换。movlhps
,不确定是否存在旁路延迟though@harold谢谢,我可以试试。@Harold:mh,我被卡住了,因为我使用的是intrisincs语法,而且我的数据是整数。强制转换是不可能的。是的,它们是:\u-mm\u-castsi128\u-ps
和\u-mm\u-castsi128
是不发出指令的重新解释强制转换。看来PUNPCKLQDQ正是我所需要的:Destination[0..63]=Destination[0..63];目的地[64..127]=源[0..63]@YvesDaoust:已修复以正确回答问题:P