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 шт):

Автор решения: mazik7512

Данная функция перемешивает значения внутри старших 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).

Ссылка на пример Rust

→ Ссылка