8

組み込み関数を使用すると、_mm_shuffle_ps()フロート入力を出力のロー2フロートとハイ2フロートにインターリーブできます。

例えば:

R = _mm_shuffle_ps(L1, H1, _MM_SHUFFLE(3,2,3,2))

結果は次のようになります。

R[0] = L1[2];
R[1] = L1[3];
R[2] = H1[2];
R[3] = H1[3]

整数データ型に使用できる同様の組み込み関数があるかどうかを知りたいですか?2つの__m128i変数とインターリーブ用のマスクを使用したものはありますか?

組み込みは、 2_mm_shuffle_epi32()つではなく1つの128ビットベクトルを取ります。

4

1 に答える 1

13

いいえ、これに相当する整数はありません。したがって、それをエミュレートするか、チートする必要があります。

1つの方法は、とを使用すること_mm_shuffle_epi32()です。次に、目的の用語をマスクして、またはそれらを元に戻します。AB

それは厄介になる傾向があり、約5つの命令があります。(または、SSE4.1ブレンド手順を使用する場合は3。)

3つの手順を含むSSE4.1ソリューションは次のとおりです。

__m128i A = _mm_set_epi32(13,12,11,10);
__m128i B = _mm_set_epi32(23,22,21,20);

A = _mm_shuffle_epi32(A,2*1 + 3*4 + 2*16 + 3*64);
B = _mm_shuffle_epi32(B,2*1 + 3*4 + 2*16 + 3*64);

__m128i C = _mm_blend_epi16(A,B,0xf0);

私が好む方法は、実際にチートすることです-そして浮動小数点シャッフルは次のようになります:

__m128i Ai,Bi,Ci;
__m128  Af,Bf,Cf;

Af = _mm_castsi128_ps(Ai);
Bf = _mm_castsi128_ps(Bi);
Cf = _mm_shuffle_ps(Af,Bf,_MM_SHUFFLE(3,2,3,2));
Ci = _mm_castps_si128(Cf);

これは、データ型を浮動小数点に変換して、float-shuffleを使用できるようにすることです。次に、それを元に戻します。

これらの「変換」はビット単位の変換(別名再解釈)であることに注意してください。実際には変換は行われず、命令にマップされません。アセンブリでは、整数または浮動小数点SSEレジスタの区別はありません。これらのキャスト組み込み関数は、C /C++によって課せられる型安全性を回避するためのものです。

ただし、このアプローチでは、整数と浮動小数点のSIMD実行ユニット間でデータを前後に移動するために余分な遅延が発生することに注意してください。したがって、シャッフル命令よりもコストがかかります。

于 2012-10-31T08:18:47.667 に答える