_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指令:
- vpxor ymm, ymm, ymm
- vxorps ymm, ymm, ymm
英特尔定义为:
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 中也一样。
我正在尝试找出 _mm256_xor_si256 and _mm256_xor_ps 内在函数与 AVX(2) 之间的实际区别。
分别映射到intel指令:
- vpxor ymm, ymm, ymm
- vxorps ymm, ymm, ymm
英特尔定义为:
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 中也一样。