Как я могу обменять низкие 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);