Что такое ассемблерный эквивалент SSE2? - PullRequest
0 голосов
/ 12 января 2019

Я использую Fasm (сборка) и ищу инструкции по сборке SSE2, эквивалентные этим встроенным инструкциям:

_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8

Где их взять (веб-сайт, pdf ...)?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вместо того, чтобы возиться с внутренней документацией, прежде всего посмотрите на документацию Intel asm в их x86 Software Developer Manual vol.2 . Или HTML-фрагменты только записей инструкций, без вступления и приложений, на https://www.felixcloutier.com/x86/index.html., например. https://www.felixcloutier.com/x86/PCMPEQB:PCMPEQW:PCMPEQD.html

(Записи руководства Intel по asm приведены ниже для этой инструкции). Списки - беспорядок, теперь, когда AVX512 является частью основного PDF, но вы все равно можете проверить свои догадки / память в другом направлении. если вы уже догадались, какая инструкция будет использоваться для встроенной функции, и поищите ее. Или, если вы выполните поиск в полной версии PDF, вы получите удар по собственному имени, для встроенных функций, которые отображаются непосредственно в одну инструкцию, например _mm_cmpeq_epi8, но не set1)

Это лучше / более подробно, чем их внутренняя документация (например, раздел «Операция» всегда существует и обычно более конкретен). Кроме того, он показывает, в каком порядке идут операнды. Обычно это соответствует внутреннему, но я, кажется, помню случай, когда это не так, может быть, с перемешиванием. И, конечно, есть vfmadd132ps против vfmadd213ps против vfmadd231ps, которые отличаются в зависимости от того, какой из аддента или одного из мультипликаторов является местом назначения, а какой может быть памятью.

Также показывает, какой операнд может быть памятью. Это не всегда последний, например VBLENDVPS xmm1, xmm2, xmm3/m128, xmm4 (потому что последний операнд закодирован в непосредственном байте, а не в явном виде xmm0, как версия без VEX). Кроме того, pmovzxbd xmm1, dword [rdi] и другие полезны в качестве узкой нагрузки (которая не требует выравнивания, потому что она меньше 16 байт), но вы никогда не узнаете об этом из встроенных функций, которые предоставляют только источник __m128i. Компиляторы не всегда могут оптимизироваться в операнд памяти после использования _mm_cvtsi32_si128 (int a).

И есть pblendvb, где не-VEX форма равна PBLENDVB xmm1, xmm2/m128, <XMM0>, неявно используя XMM0 для вектора управления смешиванием. Встроенные функции также скрывают это, так что вы получите ошибочные ошибки, если попытаетесь написать pblendvb xmm1, xmm8, xmm7.

Руководство по оптимизации ассемблера Agner Fog также содержит главу по SIMD с некоторыми довольно хорошими таблицами инструкций перемещения данных, которые полезны для различных видов задач.

См. Также SO x86 tag wiki для получения дополнительных ссылок.


Мне кажется, что мнемонику asm легче запомнить; они короче и имеют немного меньше странных различий, таких как перемешивание и перестановка в именовании (большую часть времени, до AVX ...). Что еще более важно, я склонен мыслить в терминах asm, а затем писать внутренние компоненты, которые позволят компилятору эффективно компилировать.

Информация о задержке / пропускной способности / порте выполнения процессора - мнемоническая, а не внутренняя (таблицы Агнера Фога, instlatx64 и http://uops.info/),, поэтому вы должны знать эти имена, чтобы действительно сведения о низкоуровневой производительности, а также проверить, хорошо ли работал компилятор с вашим кодом, и посмотреть на результаты профилирования perf record / perf report, чтобы выяснить, почему где-то есть горячая точка.

Intel имеет номера пропускной способности / задержки в своем руководстве по встроенным функциям, но не порт исполнения, поэтому вы не можете знать, могут ли две команды throughtput=1 выполняться в одном и том же цикле, что делает их не очень полезными. 1056 *

0 голосов
/ 12 января 2019

Используйте Intel Intrinsics Guide , но обратите внимание, что некоторые intrinisics не отображаются на одну инструкцию, например, _mm_set1_epi8. Для большинства встроенных функций в описании перечислены соответствующие машинные инструкции.

Вы также можете использовать безумно полезный Проводник компилятора , чтобы увидеть сгенерированный код для заданных встроенных функций, например, этот пример для _mm_set1_epi8.

...