質問
の場合
と言うちょっとしたクラス:
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いけ替えるだけで簡単にこれらの機能団体を用いた数intrinsics.もうこんでみたいという気持ちになり違うの?MMX使用を伴う費用のかかる状態cahnges IIRCは、信用格又はそのようなご指示が?ともあれば、ダイレクト"の利用SSE"オーバーヘッドが移動して値をSSEを登録しなければならないもんで何が早い?
ケース
しかし、皆さんはまったくんとOOに基づくドラインをサポートしています。というより、配列ベクトルのPoint3D物、単に大きな配列をfloat:
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実際に価値あるものやるなんて本当に価値がバルクが実現されるのでしょう。
解決
一般必要になることがありますので追加取得にSSE(その他のSIMD建築):
データが必要16バイト整列(適)
データが必要に連続した
必要な十分なデータのSIMD運用価値のある
必要なもの合体として多くの事業ときを緩和するための費用の負荷/店舗
意識する必要があり、キャッシュ-メモリ階層とそのパフォーマンスへの影響など使用ストリップ-マイニング-タイリング)
他のヒント
それは貴重です。たとえば、あなたは多くの-多くの方程式の平方根を計算します。あなたは一度、SSEレジスタと呼び出し操作で4つの値を読み込むことができます。これは4で、パフォーマンスが向上します。
とその中のすべてのSSE最適化を持っているライブラリがあります。改革ではない自転車の操作を行います。
この Gamasutraの記事ベースのコード。それは詳細にあなたの「ケース1」をカバーしています。
ソースコードは著者のホームページのから入手可能です。
私は数年前に仕事でケースの一つを試してみましたが、パフォーマンスの向上はほとんど測定可能でした。 16のバイト境界上のすべてのPoint3D
を合わせ持つすべての手間が、それは価値がない作られたので、最後に、私はそれをスキップすることを決定します。
あなたが正しく推測してきたようにSSEは、ほとんどの彼らはかなり良いスピードを放棄することができます一括操作に適しています。あなたは先に行くと、コンパイラがすでに発生しているものをコードSSEの組み込み関数のチェックを使用する前に。私は、例えばVisual StudioはSSE-最適化を使用した時はかなり良好であることを経験から知っています。