Как я могу обменять низкие 128 бит и высокие 128 бит в 256-битном регистре AVX (YMM)
Я переношу код SSE SIMD для использования 256-битных расширений AVX и не могу найти никакой инструкции, которая будет смешивать/перемешать/перемещать высокие 128 бит и низкие 128 бит.
История поддержки:
Я действительно хочу VHADDPS
/_mm256_hadd_ps
действовать как HADDPS
/_mm_hadd_ps
, только с 256-битными словами. К сожалению, он действует как два вызова HADDPS
, действующих независимо от младших и высоких слов.
Ответы
Ответ 1
Используя VPERM2F128, можно поменять низкие 128 и высокие 128 бит (а также другие перестановки). Внутренний
x = _mm256_permute2f128_ps( x , x , 1)
Третий аргумент - это управляющее слово, которое дает пользователю большую гибкость. В интерактивной документации Intel , по-видимому, полностью отсутствует объяснение структуры контрольного слова, но загружаемый Intel Instrinsic Guide дает лучшее объяснение.
Ответ 2
Единственный способ, которым я это знаю, - это _mm256_extractf128_si256
и _mm256_set_m128i
. Например. для замены двух половинок 256-битного вектора:
__m128i v0h = _mm256_extractf128_si256(v0, 0);
__m128i v0l = _mm256_extractf128_si256(v0, 1);
__m256i v1 = _mm256_set_m128i(v0h, v0l);