56

GNU C ++のSSE、SSE2、SSE3を理解するための簡単なチュートリアルはありますか?SSEでコードの最適化をどのように行うことができますか?

4

5 に答える 5

62

申し訳ありませんが、チュートリアルを知りません。

あなたの最善の策(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」に注目しました。

于 2009-03-19T13:43:18.267 に答える
24

使用する最も簡単な最適化は、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 アセンブリのコーディングに関する多くの情報も提供しています (これは組み込み関数に転写されることがよくあります)。

于 2009-03-24T15:00:54.397 に答える
8

-mtune-marchオプション、、-msse*そして-mfpmathもちろんチェックしてください。これらはすべて、GCCがSSE固有の最適化を実行できるようにします。

それを超えるものはすべてアセンブラーの領域です、私は恐れています。

GCCオンラインマニュアル-i386およびx86_64オプション

于 2009-03-19T07:37:07.773 に答える
4

MSDN には、SSE コンパイラのビルトインについてかなり詳しく説明されています (これらのビルトインは事実上の標準であり、clang/XCode でも動作します)。

そのリファレンスの良い点は、同等の疑似コードを示していることです。たとえば、ADDPD命令が次のようになっていることを知ることができます。

r0 := a0 + b0
r1 := a1 + b1

そして、これは不可解なシャッフル命令の良い説明です: http://www.songho.ca/misc/sse/sse.html

于 2011-08-18T22:23:19.433 に答える
2

簡単なチュートリアル?私が知っていることではありません。

ただし、MMXまたはSSEの任意のバージョンの使用に関する情報は、GCC、ICC、VCのいずれの場合でも、学習に役立ちます。

GCCのベクター拡張機能については、「info gcc」と入力し、「ノード:ベクター拡張機能」に移動してください。

于 2009-03-19T07:37:52.843 に答える