我试图从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
    

    但坦率地说,我看不出它们的效果有什么不同?
    它们都为256位或。
    但是后者可以在AVX和AVX2上使用,第一个只能在AVX2上使用。
    为什么您会使用兼容性较低的第一个?

    最佳答案

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

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

    我不确定在这方面AMD Excavator会做什么,但是Bulldozer,Piledriver和Steamroller会有那些旁路延迟,因此我也希望在Excavator中也能做到。

    关于intrinsics - _mm256_xor_si256()和_mm256_xor_ps()之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27804476/

    10-11 19:04