5

ケース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を使用して単一ベクトル演算を最適化しようとすることは実際に価値がありますか、それとも一括演算を行う場合にのみ本当に価値がありますか?

4

4 に答える 4

6

一般に、SSE (またはその他の SIMD アーキテクチャ) を最大限に活用するには、追加の手順を実行する必要があります。

  • データは 16 バイト アラインする必要があります (理想的には)

  • データは連続している必要があります

  • SIMD 操作を価値のあるものにするのに十分なデータが必要です

  • ロード/ストアのコストを軽減するために、できるだけ多くの操作を結合する必要があります

  • キャッシュ/メモリ階層とそのパフォーマンスへの影響を認識する必要があります (例: ストリップマイニング/タイリングを使用)

于 2010-04-12T16:39:44.493 に答える
1

データの範囲に対して同じ計算を何度も行う場合は、価値があります。たとえば、多対多方程式の平方根を計算します。sse レジスタに 4 つの値をロードし、操作を 1 回呼び出すことができます。これにより、パフォーマンスが 4 向上します。

また、すべてのsse最適化が内部にあるライブラリがあります。自転車を再発明しないでください。

于 2010-04-12T16:25:33.210 に答える
1

このGamasutra の記事では、高速な SSE ベースのコードを作成するために何が必要かを示しています。それはあなたの「ケース1」を詳しくカバーしています。

ソースコードは作者のホームページから入手できます。

于 2010-07-29T09:15:35.157 に答える
0

I tried Case One at work a couple of years ago and the performance gain was barely measurable. In the end I decided to skip it since all the hassle with aligning all Point3D on 16 byte boundaries made it not worthwhile.

As you've correctly guessed SSE is most suited to bulk operations where they can give a pretty good speed up. Before you go ahead and use the SSE intrinsics check what code the compiler is already generating. I know from experience that for instance Visual Studio is pretty good at using SSE-optimizations.

于 2010-04-12T16:53:32.087 に答える