Вместо того, чтобы возиться с внутренней документацией, прежде всего посмотрите на документацию 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 *