5

私は現在、独自のC ++ベクトル数学ライブラリを作成しようとしていますが、SSEで最適化することに興味があります。私のvec2およびvec3データ型の場合、予想されるサイズである必要があるため、__ m128型を直接保存することはできませんが、vec4についてはどうでしょうか。私のvec4タイプが次のようになっていると仮定します(説明を簡単にするために16バイトのアライメント要件を無視します)。

union vec4 {
  struct {float x, y, z, w;};
  __m128 sse;
}

vec4 operator+(const vec4& left, const vec4& right) {
  vec4 result;
  result.sse = _mm_add_ps(left.sse, right.sse);
  return result;
}

それはそれを行うための提案された方法ですか、それとも私が考えられない大きな理由がありますか?つまり、代わりにこれを行う必要があります:

struct vec4 {
  float x, y, z, w;
};

vec4 operator+(const vec4& left, const vec4& right) {
  __m128 leftSSE = _mm_load_ps(reinterpret_cast<const float*>(&left));
  __m128 rightSSE = _mm_load_ps(reinterpret_cast<const float*>(&right));
  __m128 resultSSE = _mm_add_ps(leftSSE, rightSSE);
  vec4 result;
  _mm_store_ps(reinterpret_cast<float*>(&result), resultSSE);
  return result;
}

そして、私たちがそれに取り組んでいる間、私の理論上のvec2およびvec3タイプはどうですか?最初にそれらをvec4に変換してから、SIMD命令を使用するか、または単にそれらのスカラー要素を個別に処理する方が速いでしょうか?

4

2 に答える 2

6

すべての小規模/プリミティブ操作にロード/ストア命令がある場合、それらの操作を使用する全体的な式は、ロード/ストア命令のオーバーヘッドで小さくなり、実際の作業を完全に上回るため、ペストのような2番目のバージョンは避けてください。終わり。

すべてのベクトル演算/関数は、すでにsseレジスタにロードされているパラメータのみを想定して適用し、それらのみを処理する方法で作成する必要があります。ロード/ストア操作は、ループの反復ごとに1回だけ、または非常にまれにしか実行する必要がないように制御される関数のコンテキスト外で明示的に記述する必要があります。

また、Mysticalが指摘しようとしていたのは、SSE組み込み型の個々の要素にアクセスすると、ロード/ストア命令が生成されるため、個々の要素へのアクセス/変更を避ける必要があるということです。生成されたアセンブリに注意してください。

vec2 / 3の場合、vec4の強い型エイリアスにし、最初に作成したときに他のコンポーネントをゼロにします。SSEには、最初のコンポーネントのみで機能するほとんどの操作のバリエーションもあるため、覚えておく価値のあるもう1つのことです。

SSEを最大限に活用するには、SoA、ハイブリッドSoA-AoSを処理するか、SoA形式へのスウィズリング/シャッフルをオンザフライで実行する必要があります。

このビデオをチェックしてください。

于 2012-07-23T20:54:52.897 に答える
0

Visual C ++(使用していると思います-他のものを使用している場合は指定してください)__m128では、次のように定義されています。

typedef struct __declspec(intrin_type) __declspec(align(16)) __m128 {
   float m128_f32[4];
} __m128;

その表現は、128ビットで整列されていることを除いて、4つのfloatの構造と同じである必要があります。これは、ユニオンにも引き継がれる必要があります。_mm_loadu_ps特に、これは、構造が整列していない可能性があるため、代わりに使用しない限り、2番目の例が正しくないことを意味します。

したがって、このように結合で使用__m128すると、構造が高速に整列された荷重に対して適切に整列されていることを確認するのに役立ちます。したがって、これは悪い考えではありません。

于 2012-07-21T22:47:21.710 に答える