私は自分のアプリケーションで 3D 数学を広範囲に使用しています。ベクトル/行列ライブラリを SSE、AltiVec、または同様の SIMD コードに変換すると、どの程度の速度向上を達成できますか?
7 に答える
私の経験では、通常、アルゴリズムを x87 から SSE に移行することで約 3 倍の改善が見られ、VMX/Altivec に移行することで 5 倍以上の改善が見られます (パイプラインの深さやスケジューリングなどに関係する複雑な問題のため)。しかし、私は通常、一度に 1 つのベクトルをアドホックに実行する場合ではなく、操作する数が数百または数千ある場合にのみこれを行います。
これですべてではありませんが、SIMD を使用してさらに最適化することは可能です。Miguel がPDC 2008で開催した MONO を使用して SIMD 命令を実装した時期に関するプレゼンテーションをご覧ください。
(出典: tirania.org )
非常に大まかな数値について: ompf.orgで、手動で最適化されたレイ トレーシング ルーチンの速度が 10 倍になったと主張する人がいると聞きました。また、スピードアップもうまくいきました。問題にもよりますが、ルーチンで 2 倍から 6 倍の間のどこかを取得したと推定していますが、これらの多くには不要なストアとロードがいくつかありました。コードに大量の分岐がある場合は、それを忘れてください。ただし、本来データ並列である問題については、非常にうまく処理できます。
ただし、アルゴリズムはデータ並列実行用に設計する必要があることを付け加えておきます。これは、あなたが言及したように一般的な数学ライブラリがある場合、個々のベクトルではなくパックされたベクトルを使用する必要があることを意味します。そうしないと、時間を無駄にするだけです。
たとえば、次のようなもの
名前空間 SIMD { クラス PackedVec4d { __m128×; __m128年; __m128z; __m128w; //... }; }
大規模なデータセットを扱う可能性が高いため、パフォーマンスが重要なほとんどの問題は並列化できます。あなたの問題は、時期尚早の最適化の場合のように聞こえます。
答えは、ライブラリが何をしているか、どのように使用されているかによって大きく異なります。
ゲインは数パーセント ポイントから「数倍速く」なる可能性があります。ゲインが最も見られやすい領域は、孤立したベクトルや値を扱っているのではなく、複数のベクトルや値を処理する必要がある領域です。同じ方法。
もう 1 つの領域は、キャッシュまたはメモリの制限に達している場合です。この場合も、多くの値/ベクトルを処理する必要があります。
ゲインが最も大きくなる可能性があるドメインは、おそらく画像および信号処理、計算シミュレーション、およびメッシュに対する一般的な 3D 数学操作 (孤立したベクトルではなく) のドメインです。
最近、x86用のすべての優れたコンパイラは、デフォルトでSPおよびDP浮動小数点演算用のSSE命令を生成します。これらの命令を正しくスケジュールする限り、スカラー演算の場合でも、ネイティブの命令よりもこれらの命令を使用する方がほとんどの場合高速です。これは、過去にSSEが「遅い」と感じ、コンパイラーが高速なSSEスカラー命令を生成できないと考えていた多くの人にとっては驚きです。ただし、ここでは、スイッチを使用してSSE生成をオフにし、x87を使用する必要があります。x87はこの時点で事実上非推奨であり、将来のプロセッサから完全に削除される可能性があることに注意してください。これの1つの欠点は、レジスターで80ビットDPフロートを実行する機能を失う可能性があることです。ただし、精度を64ビットのDPフロートではなく80ビットに依存している場合は、より精度の高い損失耐性のあるアルゴリズムを探す必要があるというのがコンセンサスのようです。
上記のすべてが私にとって完全な驚きでした。それは非常に直感的ではありません。しかし、データは話し合います。
ほとんどの場合、高速化はごくわずかであり、プロセスは予想よりも複雑になります。詳細については、Fabian Giesen によるThe Ubiquitous SSE vector class の記事を参照してください。
ユビキタスな SSE ベクター クラス: 一般的な神話を暴く
それほど重要ではない
何よりもまず、ベクトル クラスはおそらくあなたが考えるほどプログラムのパフォーマンスにとって重要ではありません (もしそうなら、計算が非効率的であるというよりも、何か間違ったことをしているからである可能性が高いです)。誤解しないでほしいのですが、少なくとも 3D グラフィックスを扱うときは、おそらくプログラム全体で最も頻繁に使用されるクラスの 1 つになるでしょう。しかし、ベクトル演算が一般的になるからといって、それらがプログラムの実行時間を支配するということを自動的に意味するわけではありません。
それほど暑くない
簡単ではありません
今はやめろ
今までにない