Разница между mm256 xor si256() и mm256 xor ps()


Я пытаюсь найти фактическую разницу между _mm256_xor_si256 и _mm256_xor_ps внутренностями из AVX(2).

Они соответственно сопоставляются с инструкциями intel:

  • vpxor ymm, ymm, ymm
  • vxorps ymm, ymm, ymm

Которые определяются Intel как:

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 2

1 ответ:

Нет никакой разницы в эффектах, оба делают побитовое XOR 256 бит. Но это не значит, что различий нет, различия только менее заметны.

vxorps может, на Haswell, только перейти к порту port 5 (и поэтому имеет пропускную способность 1), но vpxor может перейти к портам 0, 1 и 5, и имеет пропускную способность 3/cycle. Кроме того, существует задержка обхода, когда результат, сгенерированный в области с плавающей запятой, используется командой, которая выполняется в целочисленной области, и наоборот. Так использование" неправильной " инструкции может иметь несколько большую задержку, поэтому vxorps может быть лучше в некоторых контекстах (но это не так просто, как "всегда при использовании поплавков").

Я не знаю точно, что будет делать экскаватор AMD в этом отношении, но бульдозер, свайная река и паровой каток имеют эти задержки обхода, поэтому я ожидаю их и в экскаваторе.