significado instrucciones fm3 cpus con x86 simd avx

x86 - instrucciones - sse vs avx



¿Cómo puedo intercambiar los 128 bits bajos y los 128 bits altos en un registro AVX(YMM) de 256 bits? (2)

Estoy transfiriendo el código SSE SIMD para usar las extensiones AVX de 256 bits y parece que no puedo encontrar ninguna instrucción que mezcle / mezcle / mueva los 128 bits altos y los 128 bits bajos.

La historia de respaldo:

Lo que realmente quiero es que VHADDPS / _mm256_hadd_ps actúe como HADDPS / _mm_hadd_ps , solo con palabras de 256 bits. Desafortunadamente, actúa como dos llamadas a HADDPS actuando independientemente en las palabras altas y bajas.


La única forma que conozco de hacer esto es con _mm256_extractf128_si256 y _mm256_set_m128i . Por ejemplo, para intercambiar las dos mitades de un vector de 256 bits:

__m128i v0h = _mm256_extractf128_si256(v0, 0); __m128i v0l = _mm256_extractf128_si256(v0, 1); __m256i v1 = _mm256_set_m128i(v0h, v0l);


Usando VPERM2F128, uno puede intercambiar los 128 bits altos y bajos (así como otras permutaciones). Lo intrínseco es

x = _mm256_permute2f128_ps( x , x , 1)

El tercer argumento es una palabra de control que le da al usuario mucha flexibilidad. La documentación en línea de Intel parece carecer totalmente de explicación de cuál es la estructura de la palabra de control, pero la aplicación descargable Intel Instrinsic Guide ofrece una mejor explicación.