В программировании SSE/AVX, избирательное копирование с одного вектора на другой на основе маски называется смесь. В SSE4.1 добавлены инструкции, такие как PBLENDVB xmm1, xmm2/m128, <XMM0>
, где неявный операнд XMM0 контролирует, какие байты src перезаписывают соответствующие байты в dst. (Без SSE4.1 вы обычно должны И и ANDNOT маску на два вектора, а OR - вместе, трюк xor имеет меньше параллелизма на уровне инструкций и, вероятно, требует, чтобы по меньшей мере столько команд MOV копировали регистры.)
Существует также инструкция немедленного смешивания, pblendw
, где маска является 8-битным немедленным, а не регистром. И есть 32-битные и 64-битные немедленные смеси (blendps
, blendpd
, vpblendd
) и переменные смеси (blendvps
, blendvpd
).
IDK, если другие наборы инструкций SIMD (NEON, AltiVec, любые MIPS называет их и т. Д.) Также называют их «смесями» или нет.
SSE/AVX (или x86 целочисленные инструкции) не дают ничего лучше, чем обычный побитовое исключающее ИЛИ/И для этого побитовое (вместо поэлементно) не смешивается до AVX512F.
AVX512F может сделать версию побитовое этого (или любой другой побитовое трехкомпонентную функция) с одним или vpternlogd
vpternlogq
инструкции. (Единственное различие между размерами элементов d и q заключается в том, что вы используете регистр маски для маскирования слияния или нулевой маскировки адресата, но это не помешало Intel делать отдельные функции даже для случая без маски:
__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)
и эквивалент ..._ epi64 версия.
imm8
немедленных байт является таблицей истинности. Каждый битого назначения определяется независимо, из соответствующих бит а, б и в с использованием их в качестве 3- разрядный индекс в таблицу истинности, т. е. как imm8[a:b:c]
.
AVX512 будет забавно играть, когда он в конце концов появится в главном рабочем столе/ноутбуке CPU, но это, вероятно, еще пару лет.
* «Имеет ли конкретная инструкция по сборке для этой операции на каком-либо наборе команд?» * - Я не знал бы какого-либо набора команд, который ** не выполнял ** операции AND и XOR. – IInspectable
Но, возможно, некоторые архитектуры имеют эту операцию, подключенную к аппаратным средствам, чтобы сделать это в одной команде вместо нескольких. – Vincent
Это довольно стандартный расчет для [Ternary Raster Operations] (https://msdn.microsoft.com/en-us/library/dd145130.aspx), так что да, я бы предположил, что выделенная схема доступна. – IInspectable