Как добиться эффекта vpmovmskb на регистрах ZMM?

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

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


person fuz    schedule 07.08.2020    source источник
comment
_mm_mask?   -  person Paul R    schedule 07.08.2020
comment
@PaulR Как я мог это пропустить ... стыдно. Не могли бы вы написать это в качестве ответа, чтобы мы могли с этим справиться?   -  person fuz    schedule 07.08.2020
comment
Ха - без проблем - сейчас я использую мобильное устройство, поэтому, если вы хотите продолжить и ответить самостоятельно, меня устраивает.   -  person Paul R    schedule 07.08.2020


Ответы (1)


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

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


AVX512, конечно, также имеет различные инструкции cmp и test в маске, поэтому с вектором set1_epi8(1<<n) вы можете захватить любую битовую позицию в регистр маски с помощью _ 7_; _mm512_test_epi8_mask. Обратите внимание, что в отличие от vpmov2bm, он поддерживает нулевую маскировку в место назначения для эффективного И с другой k маской бесплатно, поэтому, возможно, стоит использовать, даже если вам просто нужен старший бит.

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

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

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

person Peter Cordes    schedule 07.08.2020