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

时间:2015-01-06 18:04:39

标签: intrinsics avx avx2

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

他们分别映射到英特尔指令:

  • 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

但坦率地说,我看不出他们的影响有什么不同? 它们都是xor 256位。 但后者可用于AVX和AVX2,这是AVX2上的第一个。 为什么你会使用第一个,兼容性较低的?

1 个答案:

答案 0 :(得分:8)

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

在Haswell上,

vxorps只能转到端口端口5(因此吞吐量为1),但vpxor可以转到端口0,1和5,吞吐量为3 /循环。此外,当在整数域中执行的指令使用浮点域中生成的结果时,存在旁路延迟,反之亦然。所以使用"错误"指令的延迟可能稍微高一些,这就是vxorps在某些情况下可能更好的原因(但它并不像&#34那么简单;总是在使用浮点数&#34时)。

我不确定AMD挖掘机在这方面会做些什么,但是Bulldozer和Piledriver以及Steamroller都有这些旁路延迟,所以我希望它们也能用于挖掘机。

相关问题