2

次のように定義された 16 ビット整数の 2 次元配列を使用しています。

int16_t e[MAX_SIZE*MAX_NODE][MAX_SIZE];
int16_t C[MAX_SIZE][MAX_SIZE];

Max_SIZEとは定数MAX_NODE値です。私はプロのプログラマーではありませんが、StackOverflow の人々の助けを借りて、データに SSE 命令を展開するコードを書くことができ、大幅なスピードアップを達成しました。現在、データ アライメントを必要としない組み込み関数 (主に_mm_loadu_si128_mm_storeu_si128) を使用しています。

for (b=0; b<n; b+=8){
    v1 = _mm_loadu_si128((__m128i*)&C[level][b]); // level defined elsewhere.
    v2 = _mm_loadu_si128((__m128i*)&e1[node][b]); // node defined elsewhere.
    v3 = _mm_and_si128(v1,v2);
    _mm_storeu_si128((__m128i*)&C[level+1][b],v3);
}

組込み関数を整列されたデータ (つまり_mm_load_si128_mm_store_si128) に対応するものに変更すると、実行時エラーが発生し、データが適切に整列されていないという仮定につながります。

私の質問は、私のデータが適切に配置されていない場合、対応する組み込み関数を使用できるように配置するにはどうすればよいですか? 整数は16ビットなので、自動的に整列されると思います。しかし、私は間違っているようです!

これに関する洞察は高く評価されます。

ありがとう!

4

1 に答える 1

8

SSE では、データを 16ビットではなく 16バイト境界に揃える必要があります。これが問題です。

静的配列を整列させるために探しているものは、コンパイラに依存します。

MSVC を使用している場合は を使用する必要があり__declspec(align(16))、GCCを使用している場合は__attribute__((aligned (16))).

于 2012-06-16T22:29:10.503 に答える