7

I'm trying to optimize my code using SSE intrinsics but am running into a problem where I don't know of a good way to extract the integer values from a vector after I've done the SSE intrinsics operations to get what I want.

Does anyone know of a good way to do this? I'm programming in C and my compiler is gcc version 4.3.2.

Thanks for all your help.

4

2 に答える 2

7

それは、あなたが持っている SSE サポートの最小レベルについて何を想定できるかによって異なります。

SSE2 に戻ると、128 ビットのベクトルから任意の 16 ビットの要素を抽出するために使用できる_mm_extract_epi16( ) があります。PEXTRW32 ビット要素の 2 つの半分を取得するには、これを 2 回呼び出す必要があります。

SSE の最近のバージョン (SSE4.1 以降)では、1 つの命令で 32 ビット要素を抽出できる_mm_extract_epi32( ) があります。PEXTRD

または、これがパフォーマンスクリティカルなループ内にない場合は、ユニオンを使用できます。

typedef union
{
    __m128i v;
    int32_t a[4];
} U32;
于 2010-12-05T22:19:24.950 に答える
6
_mm_extract_epi32

抽出組み込み関数は確かに最良のオプションですが、SSE2 をサポートする必要がある場合は、これをお勧めします。

inline int get_x(const __m128i& vec){return _mm_cvtsi128_si32 (vec);}
inline int get_y(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0x55));}
inline int get_z(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xAA));}
inline int get_w(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xFF));}

ベクトルを int[4] 表現に reinterpret_cast/union すると、コンパイラは物事をメモリにフラッシュバックする傾向があり (それほど悪くはないかもしれません)、それを int として読み戻しますが、見ていませんアセンブリで、最新バージョンのコンパイラがより良いコードを生成するかどうかを確認します。

于 2012-07-11T11:04:45.177 に答える