SSE を使用してコードを高速化しようとしていますが、次のコードはうまく機能します。基本的に、__m128
一度に 4 つの操作を実行するには、変数は連続して 4 つの float を指す必要があります。
このコードはfrom toで計算c[i]=a[i]+b[i]
するのと同じです。i
0
3
float *data1,*data2,*data3
// ... code ... allocating data1-2-3 which are very long.
__m128* a = (__m128*) (data1);
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
しかし、使用するデータ (以下を参照) を少しシフトしたい場合、from toで計算c[i]=a[i+1]+b[i]
するために、実行時にクラッシュします。i
0
3
__m128* a = (__m128*) (data1+1); // <-- +1
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
私の推測では、それ__m128
は 128 ビットであり、float
データが 32 ビットであるという事実に関連しているということです。したがって、128 ビットのポインターが 128 で割り切れないアドレスを指すことは不可能な場合があります。
とにかく、何が問題なのか、どうすればそれを回避できるのか知っていますか?