256 ビット AVX 拡張機能を使用するために SSE SIMD コードを移植していますが、上位 128 ビットと下位 128 ビットをブレンド/シャッフル/移動する命令が見つからないようです。
裏話:
私が本当に望んでいるのはVHADDPS
/_mm256_hadd_ps
のように振る舞うことですHADDPS
、_mm_hadd_ps
256 ビットワードだけで。残念ながら、それHADDPS
は下位語と上位語で独立して行動するための 2 つの呼び出しのように機能します。
VPERM2F128 を使用すると、下位 128 ビットと上位 128 ビット (および他の順列) を交換できます。組み込み関数の使用法は次のようになります
x = _mm256_permute2f128_ps( x , x , 1)
3 番目の引数は、ユーザーに多くの柔軟性を与えるコントロール ワードです。詳細については、Intel Instrinsic ガイドを参照してください。
私が知っている唯一の方法は、 と を使用すること_mm256_extractf128_si256
です_mm256_set_m128i
。たとえば、256 ビット ベクトルの 2 つの半分を交換するには:
__m128i v0h = _mm256_extractf128_si256(v0, 0);
__m128i v0l = _mm256_extractf128_si256(v0, 1);
__m256i v1 = _mm256_set_m128i(v0h, v0l);