_mm256_permutexvar_epi8 и _mm256_permutexvar_epi16 эквиваленты AVX2 для перетасовок с постоянным временем компиляции?

Я ищу способ переставить значения 1 байт и/или 2 байта в регистре __m256i с помощью инструкций AVX2. Решение должно иметь возможность перемещать значения по 128-битным дорожкам.

Я знаю, что с AVX512 я мог бы использовать _mm256_permutexvar_epi8 и _mm256_permutexvar_epi16, но я не могу найти общего решения с AVX2, когда значения должны проходить через дорожки (если значения могут оставаться в пределах дорожки _mm256_shuffle_epi8 или _mm256_shuflehi_epi16(_mm256_shufflelo_epi16)).

Индексы перестановки будут известны во время компиляции.


person Noah    schedule 11.10.2020    source источник
comment
Одной инструкцией это не сделать, поэтому vpermb требует AVX512VBMI. Где VPERMB в AVX2?. Если вам нужна полностью универсальная вещь, которая работает для любого вектора переменной времени выполнения, вам придется эмулировать ее, возможно, с помощью 2x _mm256_shuffle_epi8 и смеси или чего-то в этом роде. (Вам придется поменять местами ввод для одного vpshufb с vpermq или чем-то еще, так что это как минимум 3 перетасовки). В противном случае, надеюсь, вы сможете сделать что-то более эффективное.   -  person Peter Cordes    schedule 11.10.2020
comment
Любые улучшения, если вектор перестановки известен во время компиляции (но может быть чем угодно)?   -  person Noah    schedule 11.10.2020
comment
_mm256_shuflehi_epi16 равно vpshufhw и работает только для непосредственных констант. Вы не можете эмулировать перемешивание байтов во время выполнения. Если ваша перетасовка является константой времени компиляции, вам снова следует подумать о том, чтобы сделать что-то более умное. В VCL Agner Fog есть метапрограммирование шаблонов, позволяющее найти эффективные способы реализации произвольного перемешивания. github.com/vectorclass/version2   -  person Peter Cordes    schedule 11.10.2020
comment
Я понимаю. Надо было проверить это раньше. Благодарю вас!   -  person Noah    schedule 11.10.2020
comment
Поскольку перестановка известна во время компиляции, если вы используете GCC или clang, вы можете использовать __builtin_shuffle (GCC) или __builtin_shufflevector (clang). Как правило, они очень хорошо справляются с выбором лучших инструкций.   -  person nemequ    schedule 12.10.2020
comment
@nemequ это здорово. В Clang это действительно оптимизировано (похоже, gcc пропускает несколько случаев).   -  person Noah    schedule 12.10.2020
comment
@Noah, если вам нужна абстракция, которая работает на обоих компиляторах, не стесняйтесь украсть github.com/simd-everywhere/simde/blob/master/simde/ (это файл MIT, но если он вам нужен под другой лицензией, дайте мне знать, что макрос исключительно по моей вине, поэтому я могу дать вам лицензию на других условиях).   -  person nemequ    schedule 12.10.2020