GNU C ++のSSE、SSE2、SSE3を理解するための簡単なチュートリアルはありますか?SSEでコードの最適化をどのように行うことができますか?
5 に答える
申し訳ありませんが、チュートリアルを知りません。
あなたの最善の策(IMHO)は、Intelが提供する「組み込み」関数を介してSSEを使用して、(一般に)単一のSSE命令をラップすることです。これらは、*mmintrin.h という名前の一連のインクルード ファイルを介して利用できます。たとえば、xmmintrin.h はオリジナルの SSE 命令セットです。
Intel の最適化リファレンス マニュアルの内容に慣れておくことをお勧めします (組み込み関数の例については、セクション 4.3.1.2 を参照してください)。SIMD セクションは必読です。各命令のドキュメントには、対応する「組み込み」関数が含まれているという点で、命令セットのリファレンス マニュアルも非常に役立ちます。
組み込み関数からコンパイラーによって生成されたアセンブラーの検査 (多くのことを学ぶことができます) と、プロファイリング/パフォーマンス測定 (努力に対するほとんど見返りがない SSE コードの無駄な時間を避けることができます) に時間を費やしてください。
2011 年5 月 31 日更新: Agner Fog の最適化 PDFには、組み込み関数とベクトル化に関する非常に優れた記述があります(感謝) 。これらは正確にはチュートリアルの資料ではありません (実際、「これらのマニュアルは初心者向けではありません」という警告があります) が、SIMD (asm、組み込み関数、またはコンパイラーのベクトル化を介して使用されるかどうか) をより大きな最適化ツールボックスの一部として正しく扱います。
2012 年 10 月 4 日更新: gcc ベクトル組み込み関数に関するLinux Journal の小さな記事は、ここで言及する価値があります。SSE よりも一般的です (PPC および ARM 拡張機能もカバーします)。最後のページには参考文献の良いコレクションがあり、 Intel の「intrinsics guide」に注目しました。
使用する最も簡単な最適化は、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-Optionsを参照してください。より正確には特定のコンパイラ バージョンのドキュメントがあります: 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 でも動作します)。
- https://docs.microsoft.com/en-us/cpp/intrinsics/compiler-intrinsics
- https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/kcwz153a(v=vs.100)
そのリファレンスの良い点は、同等の疑似コードを示していることです。たとえば、ADDPD命令が次のようになっていることを知ることができます。
r0 := a0 + b0
r1 := a1 + b1
そして、これは不可解なシャッフル命令の良い説明です: http://www.songho.ca/misc/sse/sse.html
簡単なチュートリアル?私が知っていることではありません。
ただし、MMXまたはSSEの任意のバージョンの使用に関する情報は、GCC、ICC、VCのいずれの場合でも、学習に役立ちます。
GCCのベクター拡張機能については、「info gcc」と入力し、「ノード:ベクター拡張機能」に移動してください。