1

__m128i16 個の 8 ビット整数があり、それらを次のようにSSE2 を使用してロードしたいとします。

__m128i v = _mm_set_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

を使用してこれを静的に行うことができますが、_mm_set_epi8これを動的に行いたいと思います。値は実行時に決定されます。

C = userinput;
for(int i=0; i<16; i++)
{
    load C*i on v at position i
}

これどうやってするの?

4

4 に答える 4

5

1 つの方法は、共用体を使用することです。

union {
    __m128i v;
    uint8_t a[sizeof(__m128i)];
} u;

値を配列 a にロードし、v から SSE ベクトルを読み取ります。

または、データがすでに連続したメモリにある場合は、そのまま使用します_mm_load_si128(または_mm_loadu_si128、16 バイトのアライメントを保証できない場合)。

于 2012-10-10T01:13:21.763 に答える
2

この質問に答えられたかどうかはわかりませんが、Paul R が正しいことは確かです。

連続したデータの場合は、ロード組み込み関数を使用します

__m128i v = _mm_load_si128((__m128i*)&C[0]);

データが常に整列されていることが保証されていない場合は、 を使用して_mm_loadu_si128ください。

于 2012-11-16T03:56:47.983 に答える
0
char Strings[10][1001];
char *gc="GC";  

*((__m128i*)gc)  

*((__m128i*)(&(Strings[i][j])))  

そのようにしたい場合にも機能します。構造体の回答も気に入っていますが、テキストへのポインターを使用している場合は、通常、キャストしてポインター演算を行う必要があります。(とにかく、それは私の経験です。)

于 2012-10-11T16:53:07.843 に答える