Я ищу способ переставить значения 1 байт и/или 2 байта в регистре __m256i
с помощью инструкций AVX2. Решение должно иметь возможность перемещать значения по 128-битным дорожкам.
Я знаю, что с AVX512 я мог бы использовать _mm256_permutexvar_epi8
и _mm256_permutexvar_epi16
, но я не могу найти общего решения с AVX2, когда значения должны проходить через дорожки (если значения могут оставаться в пределах дорожки _mm256_shuffle_epi8
или _mm256_shuflehi_epi16(_mm256_shufflelo_epi16)
).
Индексы перестановки будут известны во время компиляции.
vpermb
требует AVX512VBMI. Где VPERMB в AVX2?. Если вам нужна полностью универсальная вещь, которая работает для любого вектора переменной времени выполнения, вам придется эмулировать ее, возможно, с помощью 2x_mm256_shuffle_epi8
и смеси или чего-то в этом роде. (Вам придется поменять местами ввод для одногоvpshufb
сvpermq
или чем-то еще, так что это как минимум 3 перетасовки). В противном случае, надеюсь, вы сможете сделать что-то более эффективное. - person Peter Cordes   schedule 11.10.2020_mm256_shuflehi_epi16
равноvpshufhw
и работает только для непосредственных констант. Вы не можете эмулировать перемешивание байтов во время выполнения. Если ваша перетасовка является константой времени компиляции, вам снова следует подумать о том, чтобы сделать что-то более умное. В VCL Agner Fog есть метапрограммирование шаблонов, позволяющее найти эффективные способы реализации произвольного перемешивания. github.com/vectorclass/version2 - person Peter Cordes   schedule 11.10.2020__builtin_shuffle
(GCC) или__builtin_shufflevector
(clang). Как правило, они очень хорошо справляются с выбором лучших инструкций. - person nemequ   schedule 12.10.2020