我试图从AVX(2)中找到_mm256_xor_si256和_mm256_xor_ps内部函数之间的实际差异。
它们分别映射到英特尔指令:
英特尔将其定义为:
dst[255:0] := (a[255:0] XOR b[255:0])
dst[MAX:256] := 0
与
FOR j := 0 to 7
i := j*32
dst[i+31:i] := a[i+31:i] XOR b[i+31:i]
ENDFOR
dst[MAX:256] := 0
但坦率地说,我看不出它们的效果有什么不同?
它们都为256位或。
但是后者可以在AVX和AVX2上使用,第一个只能在AVX2上使用。
为什么您会使用兼容性较低的第一个?
最佳答案
效果没有差异,两者都执行256位的按位XOR。但这并不意味着没有差异,只有差异不那么明显。
在Haswell上,vxorps
只能进入端口5(因此吞吐量为1),但是vpxor
可以进入端口0、1和5,吞吐量为3 /周期。同样,当在整数域中执行的指令使用浮点域中生成的结果时,会有旁路延迟,反之亦然。因此,使用“错误的”指令可能会有稍高的延迟,这就是为什么vxorps
在某些情况下可能会更好的原因(但它并不像“始终使用浮点数时那样简单”)。
我不确定在这方面AMD Excavator会做什么,但是Bulldozer,Piledriver和Steamroller会有那些旁路延迟,因此我也希望在Excavator中也能做到。
关于intrinsics - _mm256_xor_si256()和_mm256_xor_ps()之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27804476/