SIMD - _mm256_shuffle_epi32 что это функция
Подскажите пожалуйста, что это за "странная" такая функция перемешивания:
__m256i _mm256_shuffle_epi32 ( __m256i a , const int imm8 )
Описание: Перемешайте 32-битные целые числа в пределах 128-битных дорожек, используя элемент управления в imm8 , и сохраните результаты в dst .
То есть получается, какая то странная ситуация: у меня 256 битный вектор, который заполнен 8-ю 4-ех байтными значениями, но функция может перемешивает только 4-е 4-ех байтных элемента в нем и только в пределах 128 бит.
И при этом какой то другой функции, которая может перемешать все 8-емь 4-батныйх значений - нет.
Ответы (1 шт):
Данная функция перемешивает значения внутри старших 128 бит, и младших по отдельности по маске заданной в imm8. Нашел пример на Rust:
let a = _mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7);
let c1 = _mm256_shuffle_epi32(a, 0b00_11_10_01);
let c2 = _mm256_shuffle_epi32(a, 0b01_00_10_11);
let expected1 = _mm256_setr_epi32(1, 2, 3, 0, 5, 6, 7, 4);
let expected2 = _mm256_setr_epi32(3, 2, 0, 1, 7, 6, 4, 5);
expected1 - то что должно получится в результате применения маски 0b00_11_10_01.
(Соответствует c1).
expected2 - то что должно получится в результате применения маски 0b01_00_10_11.
(Соответствует c2).