_mm256_xor_si256() 和 _mm256_xor_ps() 之间的区别

Difference between _mm256_xor_si256() and _mm256_xor_ps()

我正在尝试找出 _mm256_xor_si256 and _mm256_xor_ps 内在函数与 AVX(2) 之间的实际区别。

分别映射到intel指令:

英特尔定义为:

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位的按位异或。但这并不意味着没有差异,只是差异不太明显。

vxorps 在 Haswell 上只能到达端口 5(因此吞吐量为 1),但是 vpxor 可以到达端口 0、1 和 5,并且具有3/周期的吞吐量。此外,当在整数域中执行的指令使用在浮点域中生成的结果时,存在旁路延迟,反之亦然。所以使用"wrong"指令可以有稍高的延迟,这就是为什么vxorps在某些情况下可能更好(但它不像"always when using floats"那么简单)。

我不确定 AMD Excavator 在这方面会做什么,但是 Bulldozer 和 Piledriver 以及 Steamroller 有这些旁路延迟,所以我希望它们在 Excavator 中也一样。