0

float 型の 3D ベクトル (x、y、z)、内積、外積を処理する最速の方法を探しています。SSE4などのインテルの技術に行くかもしれないと思います。誰でも良い提案がありますか?または、f32vec4 などの SSE4 の使用経験はありますか? ありがとう。

4

1 に答える 1

2

ずいぶん前のことですが、この種の計算で生成されたアセンブラコードを前回確認したときは、コンパイラによって結果が大きく異なり、まったく同じマシンコードでもプロセッサによって実行速度が異なっていました。

私が言いたいのは、ある場合には最適化が別の場合には悲観的であることがあり、常に正しい選択をするのは非常に難しいということです。

例として、3d ベクトル クラスを次のように定義したことを覚えています。

struct P3d {
    float x,y,z;
    ...

コンパイラを使用した場合、私の PC でのベクトル加算の最良の解決策は、拡張代入を定義し、それを使用して加算を定義することでした

    ...
    P3d& operator+=(const P3d& other)
    {
        x += other.x;
        y += other.y;
        z += other.z;
        return *this;
    }
 };

 inline P3d operator+(P3d a, const P3d& b)
 {
     a += b;
     return a;
 }

別のコンパイラでは、代わりに、より自然なコードで最適なコードが生成されました。

 inline P3d operator+(const P3d& a, const P3d& b)
 {
     return P3d(a.x+b.x, a.y+b.y, a.z+b.z);
 }

残念なことに、数式で x、y、z を明示的に手動でコードを記述するほど高速な C++ ソリューションはありませんでした。

ただし、違いは「小さく」(最大で 20% の IIRC 程度) であり、最終的には最も読みやすいバージョンを使用しました。

今は良くなっているかもしれませんが、私はそれを疑っています。本当にすべてのジュースを絞り出したい場合、答えは正確にどのコンパイラ バージョンと正確にどのプロセッサに依存します。これはまた、コンソールのような固定ハードウェア ソリューション用にコーディングしていない限り、コンパイラとプロセッサの両方が移行するわずか数か月でコードがおそらく最適ではないことを意味します。

于 2013-01-30T21:04:14.400 に答える