0

Intel SSE 組み込み関数のさまざまな算術演算について質問があります。_mm_add_ps との違いは何ですか。_mm_add_epi8/16/32? データが常に整列されていることを確認したい。

これを行うときのサンプルコードでは:

 __m128 u1 = _mm_load_ps(&V[(i-1)]);

セグメンテーション違反が発生します。しかし、私がこれを行うとき:

 __m128 u1 = _mm_loadu_ps(&V[(i-1)]);

それは正常に動作します。

データを揃えたいので、次のように配列を宣言しました。

 posix_memalign((void**)&V, 16, dx*sizeof(float));

誰かがこれを説明するのを助けることができますか.

4

1 に答える 1

4

_mm_add_psfloats を一緒に加算します。ここで_mm_add_epi8/16/32、浮動小数点数ではない整数を加算します。

_mm_loadu_psfloat を 16 バイト (128 ビット) に揃える必要はありませ_mm_load_psが、16 バイトに揃える必要があります。

したがって、最初のセグメントでセグ フォールトが発生した場合は、位置合わせが間違っています。

posix_memalignページには、次のように書かれています。

posix_memalign() 関数は、次の場合に失敗します:

[EINVAL] 整列パラメータの値が sizeof( void *) の 2 のべき乗倍数ではありません。

sizeof(float)==かどうかわかりませんsizeof(void*)?? thisによると Cでも同じようです(32ビットシステム上)。わかりました、ここで少しトリッキーです。ポインターのサイズは通常、CPUレジスタ幅のサイズであり、使用するシステムに応じて32ビットまたは64ビット(8バイト)ですが、afloatは通常32ビット(4バイト)です。

整列された割り当ては、次のようになります。

posix_memalign((void**)&V, 16, dx*sizeof(void*)); //since it will the correct size for your platform.  You can always cast to `float` later on.
于 2012-06-15T16:37:25.410 に答える