Как добиться эффекта vpmovmskb на регистрах ZMM? - PullRequest
4 голосов
/ 07 августа 2020

Причудливая инструкция (v) pmovmskb, восходящая к SSE, берет наиболее значимые биты байтов в регистре mm, xmm или ymm и перемещает их в регистр общего назначения. Это очень полезно для классификации элементов вектора или выполнения операций SWAR над отдельными битами. В частности, я использовал эту инструкцию в предыдущем ответе для вычисления подсчета численности популяции.

К сожалению, эта инструкция не была распространена на регистры ZMM и на удивление отсутствует в AVX-512 состав. Как я могу эффективно имитировать его эффект для регистров ZMM? Какие у меня есть похожие / другие варианты?

1 Ответ

4 голосов
/ 07 августа 2020

Там - это инструкция для этого в AVX512BW, только с другим именем. _mm512_movepi8_mask / vpmovb2m k, zmm, доступно для каждого размера элемента от байта до qword. (AVX512DQ для версий D и Q, AVX512BW для версий B и W).

Также есть маска -> обратная маска перемещения вектора, vpmovm2b (снова доступна для всех размеров элементов ).

AVX512, конечно, также имеет различные команды cmp и test в маске, поэтому с вектором set1_epi8(1<<n) вы можете захватить любую битовую позицию в регистр маски с помощью vptestmb k2{k1}, zmm2, zmm3/m512; _mm512_test_epi8_mask. Обратите внимание, что в отличие от vpmov2bm, он поддерживает нулевую маскировку в место назначения для эффективного И с другой маской k бесплатно, поэтому, возможно, стоит использовать, даже если вам просто нужен высокий бит.

Также есть версия NAND vptestnmb. Версии D и Q этих операндов-источников поддерживают широковещательную память, а версии B и W.

С 8 различными константами маски вы можете извлекать разные биты из развернутого l oop, не тратя никаких затрат. инструкции по смене. Или вы можете извлечь разные биты из разных элементов.

Это все AVX512BW, доступные на процессорах AVX512, начиная со Skylake-AVX512, но не Xeon Phi (KNL / KNM).

...