2 つの浮動小数点数を格納できる配列があり、__m128 変数があります。__m128 変数の最初の 2 つの float のみを格納したいと考えています。
私が今していることは
_mm_storeu_ps((float*)a, m0); //a is the array, m0 is the __m128 variable
これは、m0 の最初の 2 つの float を a に入れますが、最後の 2 つの float を a のメモリを超えて格納し続けます。
2 つの浮動小数点数を格納できる配列があり、__m128 変数があります。__m128 変数の最初の 2 つの float のみを格納したいと考えています。
私が今していることは
_mm_storeu_ps((float*)a, m0); //a is the array, m0 is the __m128 variable
これは、m0 の最初の 2 つの float を a に入れますが、最後の 2 つの float を a のメモリを超えて格納し続けます。
いくつかのオプションがあります。
へのポインターをにキャストし、それに応じてインデックス__m128
を付けることができます。float*
float *p = (float *)&m0;
a[0] = p[0];
a[1] = p[1];
4 つの float の配列と の和集合を作成することを好む人もいますが、__m128
パフォーマンスに関しては非常に似ています。
SSE 組み込み関数のみを使用する場合は、_mm_store_ss
andを使用でき_mm_shuffle_ps
ます。
_mm_store_ss(&a[0], m0);
_mm_store_ss(&a[1], _mm_shuffle_ps(m0, m0, _MM_SHUFFLE(1,1,1,1)));
SSE のシャッフル命令は非常に便利です。詳細については、こちらを参照してください。