2

我试图从 AVX(2)中找到_mm256_xor_si256_mm256_xor_ps内在函数之间的实际区别。

它们分别映射到 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上。为什么你会使用第一个,兼容性较低?

4

1 回答 1

9

效果没有区别,两者都进行 256 位的按位异或。但这并不意味着没有差异,只是差异不那么明显。

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

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

于 2015-01-06T18:21:07.807 回答