SSEプログラミング

SSEでは、128bitのXMMと呼ばれるレジスタが用意されます。
XMMレジスタには、下の図のように複数の変数を格納できます。
f:id:skru_y:20130810133910p:plain


格納した複数の変数を同時に演算できます。
下の図は、4つのfloat型変数に1.0fを足す場合の例です。
f:id:skru_y:20130810134616p:plain

VisualC++のインラインアセンブラを使い、下のコードで上の図と同じ演算を行います。

__declspec(align(16)) float f[4] = {1.0f, 2.0f, 3.0f, 4.0f};
__declspec(align(16)) float one[4] = {1.0f, 1.0f, 1.0f, 1.0f};
_asm
{
    lea eax, f
    movaps xmm0, [eax]
    addps xmm0, one
    movaps [eax], xmm0
}

__declspec(align(16))をつけているのは、XMMレジスタに読み込む128bitのデータは、16の倍数のアドレスから始まっていないといけないという決まりがあるからです。