次のように定義された 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ビットなので、自動的に整列されると思います。しかし、私は間違っているようです!
これに関する洞察は高く評価されます。
ありがとう!