Я использую Fasm (сборка) и ищу инструкции по сборке SSE2, эквивалентные этим внутренним инструкциям:
_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
Где их взять (веб-сайт, pdf...)?
Я использую Fasm (сборка) и ищу инструкции по сборке SSE2, эквивалентные этим внутренним инструкциям:
_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
Где их взять (веб-сайт, pdf...)?
Воспользуйтесь Руководством по внутренним компонентам Intel, но обратите внимание, что некоторые внутренние элементы не связаны с одной инструкцией, например _mm_set1_epi8
. Для большинства встроенных функций в описании перечислены соответствующие машинные инструкции.
Вы также можете использовать невероятно полезный Compiler Explorer, чтобы увидеть сгенерированный код для заданных встроенных функций, например. этот пример для _mm_set1_epi8
.
Вместо того, чтобы возиться с документацией по внутренним компонентам, в первую очередь посмотрите документацию 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
выполняться в одном и том же цикле, что делает их не очень полезными.