Разница между инструкциями AVX vxorpd и vpxor

Согласно Intel Intrinsics Guide,

  • vxorpd ymm, ymm, ymm: Вычислить побитовое исключающее ИЛИ упакованных элементов с плавающей запятой двойной точности (64-битные) в a и b и сохранить результаты в dst.
  • vpxor ymm, ymm, ymm: вычислить побитовое исключающее ИЛИ 256 бит (представляющих целочисленные данные) в a и b и сохранить результат в dst.

Какая разница между двумя? Мне кажется, что обе инструкции будут выполнять побитовое XOR для всех 256 бит регистров ymm. Есть ли снижение производительности, если я использую vxorpd для целочисленных данных (и наоборот)?


person netvope    schedule 15.11.2014    source источник
comment
В современных процессорах Intel модуль SIMD имеет два домена: INT и FLOAT. Перенос данных от одного к другому снижает производительность. Пропускная способность также выше в домене INT.   -  person Mysticial    schedule 15.11.2014
comment
Спасибо Mysticial! В этом ответе говорится, что Intel Sandy Bridge и более поздние процессоры имеют задержку обхода 0-1 циклов при использовании векторных инструкций с неправильный тип данных   -  person netvope    schedule 15.11.2014
comment
Также обратите внимание, что vxorpd - это AVX, тогда как vpxor - это AVX2 (конечно, это не влияет на производительность, а только на совместимость).   -  person Paul R    schedule 15.11.2014


Ответы (1)


Объединение некоторых комментариев в ответ:

Помимо производительности, они имеют идентичное поведение (я думаю, даже с аргументом в пользу памяти: одинаковое отсутствие требований к выравниванию для всех инструкций AVX).

От Nehalem до Broadwell (V)PXOR может работать на любом из 3 портов выполнения ALU, p0 / p1 / p5. (V)XORPS/D может работать только на p5.

Некоторые процессоры имеют задержку обхода между целочисленными доменами и доменами FP. В документации по микроархитектуре Agner Fog говорится, что на SnB / IvB задержка обхода иногда равна нулю. например при использовании неправильного типа перемешивания или логической операции. В Haswell его примеры показывают, что orps не имеет дополнительной задержки при использовании с результатом целочисленной инструкции, но что por имеет дополнительный 1 такт задержки при использовании с результатом addps.

В Skylake логические значения FP могут работать на любом порту, но задержка обхода зависит от того, на каком порте они запускались. (См. Таблицу в руководстве Intel по оптимизации). Порт 5 не имеет задержки обхода между математическими операциями FP, но порт 0 или порт 1 имеет. Поскольку блоки FMA находятся на портах 0 и 1, на этапе выдачи uop обычно назначаются логические значения port5 в тяжелом коде FP, потому что он может видеть, что много uop поставлено в очередь для p0 / p1, но p5 менее занят. (Как именно запланированы мопы x86?).

Я бы рекомендовал не беспокоиться об этом. Настройтесь на Haswell и Skylake. Или просто всегда используйте VPXOR для целочисленных данных и VXORPS для данных FP, и Skylake подойдет (но Haswell может нет).


На AMD Bulldozer / Piledriver / Steamroller нет версии логической операции FP для FP. (см. стр. 182 руководства по микроархитектуре Agner Fog.) Имеется задержка для пересылки данных между исполнительными модулями (1 цикл для ivec- ›fp или fp-› ivec, 10 циклов для int- ›ivec (eax -› xmm0), 8 циклов для ivec- ›int. (8,10 на bulldozer. 4, 5 на steamroller для movd / pinsrw / pextrw)) В любом случае, вы не можете избежать задержки обхода на AMD, используя соответствующее логическое значение insn. XORPS для кодирования требуется на один байт меньше, чем PXOR или XORPD (версия, отличная от VEX. Все версии VEX занимают 4 байта.)

В любом случае задержки обхода - это просто дополнительная задержка, а не снижение пропускной способности. Если эти операции не являются частью самой длинной цепочки депов во внутреннем цикле или если вы можете чередовать две итерации параллельно (так что у вас есть несколько цепочек зависимостей, идущих одновременно для выполнения вне очереди), тогда PXOR может быть путь идти.

На процессорах Intel до Skylake упакованные целочисленные инструкции всегда могут выполняться на большем количестве портов, чем их аналоги с плавающей запятой, поэтому предпочитайте целочисленные операции.

person Peter Cordes    schedule 08.06.2015