GNU C++?SSEでコード最適化を行うには、SSE、SSE2、およびSSE3の速度を上げるための簡単なチュートリアルがありますか?
申し訳ありませんが、チュートリアルはわかりません。
最善策(IMHO)は、SSEを使用することです。インテルが提供する「一般的な」関数を介して(一般に)単一のSSE命令を使用します。 * mmintrin.hという名前のインクルードファイルのセット。たとえば、xmmintrin.hは元のSSE命令セットです。
Intelの最適化の内容に精通し始める リファレンスマニュアル は良いアイデアであり(組み込み関数の例についてはセクション4.3.1.2を参照)、SIMDセクションは重要な読み物です。命令セットのリファレンスマニュアルも非常に役立ちます。各命令のドキュメントには、対応する「本質的な」機能が含まれています。
Doコンパイラーによって生成されたアセンブラーを組み込み関数から検査し(多くを学ぶ)、プロファイリング/パフォーマンス測定(SSEコードの時間の浪費を避ける)努力の成果はほとんどありません)。
Update 2011-05-31:Agner Fogの組み込み関数とベクトル化の非常に素晴らしいカバレッジがあります 最適化PDF (- ありがとう )少し広がっていますが(例: 最初のもの のセクション12と 2番目のもの のセクション5)。これらは正確なチュートリアル資料ではありません(実際、「これらのマニュアルは初心者向けではありません」という警告があります)が、SIMD(asm、組み込み関数、コンパイラーのベクトル化で使用されるかどうか)をより大きな最適化ツールボックスの一部として正しく扱います。
2012-10-04更新:A Nice little Linux Journalの記事 gccベクトル組み込み関数については、ここで言及するに値します。 SSE(covers PPCおよびARM拡張機能も))。より多くの参照があります。 最後のページ 、これはIntelの "intrinsics manual" に注意を引いた。
使用する最も簡単な最適化は、gccがSSEコードを出力できるようにすることです。
フラグ:-msse、-msse2、-msse3、-march =、-mfpmath = sse
386オプションに関するより簡潔なリストについては、 http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-を参照してくださいオプション 、特定のコンパイラバージョンのより正確なドキュメントがあります: http://gcc.gnu.org/onlinedocs/ .
最適化のために、Agner Fogの http://agner.org/optimize/ を常にチェックしてください。私は彼がSSE組み込み関数のチュートリアルを持っていないと思うが、彼はいくつかの本当にきちんとしたstd-c ++トリックを持ち、コーディングに関する多くの情報も提供するSSEアセンブリ(これは多くの場合、組み込み関数に転写できます)。
もちろん、-mtuneおよび-marchオプション、-msse *、および-mfpmathを確認してください。これらのすべてにより、GCCはSSE固有の最適化を実行できます。
それ以上のものはアセンブラーの領域です、私は恐れています。
MSDNには、SSEコンパイラビルトイン(およびこれらのビルトインは事実上の標準であり、clang/XCodeでも機能します)についての説明がかなりあります。
その参照のいいところは、同等の擬似コードを表示することです。 [〜#〜] addpd [〜#〜] 命令は次のようになります。
r0 := a0 + b0
r1 := a1 + b1
そして、ここに不可解なシャッフル命令の良い説明があります: http://www.songho.ca/misc/sse/sse.html
簡単なチュートリアルですか?私が知っていることではありません。
ただし、MMCまたはSSEの任意のバージョンの使用に関する情報は、GCCでもICCやVCでも学習に役立ちます。
GCCのベクター拡張機能について学習するには、「info gcc」と入力し、「ノード:ベクター拡張機能」に移動します。