Что такое эквивалент встроенных функций в сборке SSE2?

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

_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8

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


person FigFox François Giron    schedule 12.01.2019    source источник
comment
См. также Руководство по внутренним компонентам Intel. Для каждой встроенной инструкции указана инструкция по сборке.   -  person jww    schedule 04.02.2019


Ответы (2)


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

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

person Paul R    schedule 12.01.2019

Вместо того, чтобы возиться с документацией по внутренним компонентам, в первую очередь посмотрите документацию Intel по asm в их Руководство разработчика программного обеспечения x86, том 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 для получения дополнительных ссылок.


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

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

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

person Peter Cordes    schedule 12.01.2019