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

Bra*_*ram 2 intrinsics avx avx2

我试图从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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

har*_*old 9

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

vxorps可以,在Haswell的,只去端口端口5(并因此具有可以通过的1),但vpxor可以去端口0,1和5,并且具有可以通过3 /周期.此外,当在整数域中执行的指令使用浮点域中生成的结果时,存在旁路延迟,反之亦然.因此,使用"错误"指令可以有一个稍高的等待时间,这就是为什么vxorps可能在某些情况下更好的(但它不是那么简单的"使用浮动时总是").

我不确定AMD挖掘机在这方面会做些什么,但Bulldozer和Piledriver以及Steamroller都有这些旁路延迟,所以我也期待它们在挖掘机中.