我试图找到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
但坦率地说,我看不出他们的影响有什么不同? 它们都是xor 256位。 但后者可用于AVX和AVX2,这是AVX2上的第一个。 为什么你会使用第一个,兼容性较低的?
答案 0 :(得分:8)
效果没有区别,两位都是256位的按位异或。但这并不意味着没有差异,差异只是不太明显。
在Haswell上, vxorps
只能转到端口端口5(因此吞吐量为1),但vpxor
可以转到端口0,1和5,吞吐量为3 /循环。此外,当在整数域中执行的指令使用浮点域中生成的结果时,存在旁路延迟,反之亦然。所以使用"错误"指令的延迟可能稍微高一些,这就是vxorps
在某些情况下可能更好的原因(但它并不像&#34那么简单;总是在使用浮点数&#34时)。
我不确定AMD挖掘机在这方面会做些什么,但是Bulldozer和Piledriver以及Steamroller都有这些旁路延迟,所以我希望它们也能用于挖掘机。