私は実際のコンパイラの知識がなく、選択したコードの部分に対して SSE2 関数を手作業でコーディングしていました。生成された機械語コードの読み方は知っていますが、コンパイラーによって可能になったクレイジーな最適化についてはほとんど知りません。私の作業はすべて Visual Studio を使用して行われます。
関数の一部の SSE2 レジスタ スピル カウントを Visual Studio が教えてくれる方法はありますか? その理由は、SSE2 ライクなコード (テンプレート) をすぐに大量生産できるようになり、それらのそれぞれを適切な品質のマシン コードにコンパイルしたいと考えているからです。それらのそれぞれを手動で確認することはおそらくできません。私が得たいと思っているのは、コンパイルされたコードが受け入れられ、簡潔であるというある種の保証です。最後の一滴まで搾る必要はありません。
__forceinline
または、 「__forcenospill」のように、コンパイラに SSE2 レジスタをスピルさせないようにするキーワードはありますか? (スピルが発生する必要がある場合、コンパイルは失敗するため、問題を認識して SSE2 コードをリファクタリングしようとします。)
一部の計算を高度に登録する必要があるため (「単純な操作」の 1 つのステップで 6 つ以上のオペランドを使用する必要があるため (注 #1)、既存のベクトル ライブラリまたはブリッターを使用することは論外です。中間値は 16 ビットに昇格されます)。または32ビットオンザフライで変換して戻すなど)一般的なベクトルライブラリで言い換えると、ランタイムが2倍または3倍になることを意味します(そこにいて、それを行いました)。
商用ツールも問題ありません。プロジェクトの性質を考えると、私は確かにそれを買う余裕があります。
そのようなツールがない場合は、プロファイリングに頼ります。この投稿に反対票を投じて、そのようなものが存在しないことを知らせてください。
ありがとう!
(注 #1) これは適応しきい値アルゴリズムです。