float 型の 3D ベクトル (x、y、z)、内積、外積を処理する最速の方法を探しています。SSE4などのインテルの技術に行くかもしれないと思います。誰でも良い提案がありますか?または、f32vec4 などの SSE4 の使用経験はありますか? ありがとう。
1 に答える
ずいぶん前のことですが、この種の計算で生成されたアセンブラコードを前回確認したときは、コンパイラによって結果が大きく異なり、まったく同じマシンコードでもプロセッサによって実行速度が異なっていました。
私が言いたいのは、ある場合には最適化が別の場合には悲観的であることがあり、常に正しい選択をするのは非常に難しいということです。
例として、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 程度) であり、最終的には最も読みやすいバージョンを使用しました。
今は良くなっているかもしれませんが、私はそれを疑っています。本当にすべてのジュースを絞り出したい場合、答えは正確にどのコンパイラ バージョンと正確にどのプロセッサに依存します。これはまた、コンソールのような固定ハードウェア ソリューション用にコーディングしていない限り、コンパイラとプロセッサの両方が移行するわずか数か月でコードがおそらく最適ではないことを意味します。