ケース1
あなたが小さなクラスを持っているとしましょう:
class Point3D
{
private:
float x,y,z;
public:
operator+=()
...etc
};
Point3D &Point3D::operator+=(Point3D &other)
{
this->x += other.x;
this->y += other.y;
this->z += other.z;
}
SSEを単純に使用すると、これらの関数本体をいくつかの組み込み関数を使用するように置き換えるだけです。しかし、これが大きな違いを生むと期待できるでしょうか?MMXは、高価な州のcahnges IIRCを含むために使用されましたが、SSEですか、それとも他の指示と同じですか?また、直接の「SSEの使用」オーバーヘッドがない場合でも、値をSSEレジスタに移動してから元に戻すと、実際に高速になりますか?
ケース2
代わりに、OOベースの少ないコードベースで作業しています。Point3Dオブジェクトの配列/ベクトルではなく、単純にフロートの大きな配列があります。
float coordinateData[NUM_POINTS*3];
void add(int i,int j) //yes it's unsafe, no overlap check... example only
{
for (int x=0;x<3;++x)
{
coordinateData[i*3+x] += coordinateData[j*3+x];
}
}
ここでのSSEの使用はどうですか?何か良いですか?
結論は
SSEを使用して単一ベクトル演算を最適化しようとすることは実際に価値がありますか、それとも一括演算を行う場合にのみ本当に価値がありますか?