浅談Gcc 4.4.4最適化
12157 ワード
Intel Compilerのコンパイラのデフォルトでは、プログラムの実行効率に役立つスイッチがロードされます.これも、Intelのコンパイラが他のコンパイラのデフォルトスイッチより先にリードしている理由の一つです.実際には、プラットフォームにまたがるコンパイラとして、Gccは適切な最適化オプションを選択した後、実行効率はいくつかの点でIntel Compilerに匹敵します.
以下では、Gccでよく使用される最適化オプションのみを列挙します.説明しない意味がある場合は、ヘルプドキュメントを参照してください.
1、-Oシリーズ
(1)-Oと-O 1
次のオプションがあります.
(2)-O2
-O 1をロードするオプションに加えて、
(3)-O3
-O 2のロードに加えて、
(4)-Os
コードサイズの最適化コード.
-O 2を含むスイッチに加えて、-OSは次のスイッチを無効にします.
また、複数の-Oオプションの場合、最後のロードは有効です.例えばgcc-O 1-Os-O 3-o test test.c,有効な最適化スイッチは−O 3である.
一般的に、最も多く使われているのは-O 3と-OSですが、プログラムの動作が正常でないという問題が発生した場合は、-O 3を-O 2に変更するなどの最適化レベルを下げてください(珍しい).
2、対象機器
(1)-march=cpu-type
cpu-typeのマシンに必要なコマンドセットをオンにします.
cpu-typeはpentium 4、core 2、athlon-4など(具体的にはドキュメント参照)であり、例えば-march=core 2の場合、core 2がサポートするMMX、SSE、SSE 2、SSE 3、SSSE 3コマンドセットがオンになる.
またnativeタイプもサポートされ、コンパイラが存在する現在のCPUタイプ最適化命令セットに-march=nativeを指定します.
(2)-mfpmath=unit
浮動小数点演算ユニットを選択します.
unitは387およびsseであってもよい.
387はx 86シリーズのデフォルト値で、標準の387浮動小数点コプロセッサを使用します.
sseはx 64のデフォルト値であり、sseコマンドセットを使用します.
一般的にあなたのプログラムは大量の浮動小数点演算があれば、P 4とK 8以上のプロセッサで-mfpmath=sseをオンにすることをお勧めします.
(3)指定命令セットをロードする.
-msse 2、-msse 4を使用できます.1指定したコマンドセットをロードします.
3、その他有効なオプション
(1)-ftracer
テールコピーを実行してスーパーブロックのサイズを拡大し、関数制御フローを簡素化し、他の最適化措置をよりよくすることができます.単独で使う意味はなく、他の最適化オプションと一緒に使うと効果的です.
(2)-ffast-math
IEEE/ANSI規格に違反して浮動小数点数の計算速度を向上させるのは危険なオプションであり、コンパイルにIEEE仕様を厳格に遵守する必要がなく、浮動小数点計算が密集しているプログラムを考慮して採用するだけである.精度を考慮せずにこのオプションを使用すると、速度が速くなります.
(3)-fivopts
trees上で帰納変数最適化を実行します.
(4)-ftree-parallelize-loops=n
ループを並列化します.マルチコアCPUでの使用は、ループにデータ依存がない場合にのみ有利である.
(5)-ftree-loop-linear
trees上で線形ループ変換を行います.これにより、バッファ性能が向上し、さらなるサイクル最適化が可能になります.
(6)-fforce-addr
演算するには、アドレスをレジスタにコピーする必要があります.必要なアドレスは通常、前にレジスタにロードされているため、このオプションはコードを改善することができます.
(7)-floop-interchange
循環変数を交換します.
たとえば
に変わる
変更後、Nがバッファより大きいと、より効率的になります.これはFortranの配列が列の主元を配列しているからです.もちろんこのオプションはFortranだけでなく、Gccファミリーのコンパイラにも有効です.
(8)-fvisibility=hidden
デフォルトのELFミラーのシンボルの可視性を非表示に設定します.この機能を使用すると、共有ライブラリの接続とロードのパフォーマンスを非常に十分に向上させ、より最適化されたコードを生成し、完璧なAPI出力とシンボル衝突を防止することができます.共有ライブラリ(Dll)をコンパイルするときにこのオプションを使用することを強くお勧めします.
-fvisibility-inlines-hidden
デフォルトでは、すべてのインライン関数を非表示にして、エクスポートシンボルテーブルのサイズを小さくします.ファイルのサイズを縮小したり、実行性能を向上させたりすることができます.共有ライブラリをコンパイルするときにこのオプションを使用することを強くお勧めします.
(9)-minline-all-stringops
デフォルトでは、GCCは、宛先が少なくとも4バイトの境界に整列すると判断した文字列操作のみをプログラムコードに組み込む.このオプションは、より多くのインラインを有効にし、バイナリファイルのボリュームを増やしますが、高速memcpy、strlen、memset操作に依存するプログラムのパフォーマンスを向上させることができます.
(10)-m64
64ビット環境に特化したコードを生成し、32ビット環境では実行できません.x 86_にのみ使用されます.64[EMT 64を含む]環境.
(11)-fprefetch-loop-arrays
配列プリフェッチ命令を生成し,巨大な配列を用いたプログラムに対してコード実行速度を速めることができ,データベース関連の大型ソフトウェアなどに適している.具体的な効果はコードによって異なります.-OSと一緒に使用できません.
(12)-pipe
コンパイルプロセスの異なるフェーズ間で一時ファイルではなくパイプを使用して通信することで、コンパイル速度を速めることができます.使用を推奨します.
4、推奨オプションスイッチ
以上、比較的安全なスイッチは
GUIフレームなどの高精度を必要としない場合は、
コンパイルされた共有ライブラリ(.dll,.a)が追加された場合
以下では、Gccでよく使用される最適化オプションのみを列挙します.説明しない意味がある場合は、ヘルプドキュメントを参照してください.
1、-Oシリーズ
(1)-Oと-O 1
次のオプションがあります.
-fauto-inc-dec
-fcprop-registers
-fdce
-fdefer-pop
-fdelayed-branch
-fdse
-fguess-branch-probability
-fif-conversion2
-fif-conversion
-finline-small-functions
-fipa-pure-const
-fipa-reference
-fmerge-constants -fsplit-wide-types
-ftree-builtin-call-dce
-ftree-ccp
-ftree-ch
-ftree-copyrename
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-fre
-ftree-sra
-ftree-ter
-funit-at-a-time
-fomit-frame-pointer
(2)-O2
-O 1をロードするオプションに加えて、
-fthread-jumps
-falign-functions -falign-jumps
-falign-loops -falign-labels
-fcaller-saves
-fcrossjumping
-fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks
-fexpensive-optimizations
-fgcse -fgcse-lm
-findirect-inlining
-foptimize-sibling-calls
-fpeephole2
-fregmove
-freorder-blocks -freorder-functions
-frerun-cse-after-loop
-fsched-interblock -fsched-spec
-fschedule-insns -fschedule-insns2
-fstrict-aliasing -fstrict-overflow
-ftree-switch-conversion
-ftree-pre
-ftree-vrp
(3)-O3
-O 2のロードに加えて、
-finline-functions
-funswitch-loops’?
-fpredictive-commoning
-fgcse-after-reload
-ftree-vectorize
(4)-Os
コードサイズの最適化コード.
-O 2を含むスイッチに加えて、-OSは次のスイッチを無効にします.
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-and-partition
-fprefetch-loop-arrays
-ftree-vect-loop-version
また、複数の-Oオプションの場合、最後のロードは有効です.例えばgcc-O 1-Os-O 3-o test test.c,有効な最適化スイッチは−O 3である.
一般的に、最も多く使われているのは-O 3と-OSですが、プログラムの動作が正常でないという問題が発生した場合は、-O 3を-O 2に変更するなどの最適化レベルを下げてください(珍しい).
2、対象機器
(1)-march=cpu-type
cpu-typeのマシンに必要なコマンドセットをオンにします.
cpu-typeはpentium 4、core 2、athlon-4など(具体的にはドキュメント参照)であり、例えば-march=core 2の場合、core 2がサポートするMMX、SSE、SSE 2、SSE 3、SSSE 3コマンドセットがオンになる.
またnativeタイプもサポートされ、コンパイラが存在する現在のCPUタイプ最適化命令セットに-march=nativeを指定します.
(2)-mfpmath=unit
浮動小数点演算ユニットを選択します.
unitは387およびsseであってもよい.
387はx 86シリーズのデフォルト値で、標準の387浮動小数点コプロセッサを使用します.
sseはx 64のデフォルト値であり、sseコマンドセットを使用します.
一般的にあなたのプログラムは大量の浮動小数点演算があれば、P 4とK 8以上のプロセッサで-mfpmath=sseをオンにすることをお勧めします.
(3)指定命令セットをロードする.
-msse 2、-msse 4を使用できます.1指定したコマンドセットをロードします.
3、その他有効なオプション
(1)-ftracer
テールコピーを実行してスーパーブロックのサイズを拡大し、関数制御フローを簡素化し、他の最適化措置をよりよくすることができます.単独で使う意味はなく、他の最適化オプションと一緒に使うと効果的です.
(2)-ffast-math
IEEE/ANSI規格に違反して浮動小数点数の計算速度を向上させるのは危険なオプションであり、コンパイルにIEEE仕様を厳格に遵守する必要がなく、浮動小数点計算が密集しているプログラムを考慮して採用するだけである.精度を考慮せずにこのオプションを使用すると、速度が速くなります.
(3)-fivopts
trees上で帰納変数最適化を実行します.
(4)-ftree-parallelize-loops=n
ループを並列化します.マルチコアCPUでの使用は、ループにデータ依存がない場合にのみ有利である.
(5)-ftree-loop-linear
trees上で線形ループ変換を行います.これにより、バッファ性能が向上し、さらなるサイクル最適化が可能になります.
(6)-fforce-addr
演算するには、アドレスをレジスタにコピーする必要があります.必要なアドレスは通常、前にレジスタにロードされているため、このオプションはコードを改善することができます.
(7)-floop-interchange
循環変数を交換します.
たとえば
DO J = 1, M
DO I = 1, N
A(J, I) = A(J, I) * C
ENDDO
ENDDO
に変わる
DO I = 1, N
DO J = 1, M
A(J, I) = A(J, I) * C
ENDDO
ENDDO
変更後、Nがバッファより大きいと、より効率的になります.これはFortranの配列が列の主元を配列しているからです.もちろんこのオプションはFortranだけでなく、Gccファミリーのコンパイラにも有効です.
(8)-fvisibility=hidden
デフォルトのELFミラーのシンボルの可視性を非表示に設定します.この機能を使用すると、共有ライブラリの接続とロードのパフォーマンスを非常に十分に向上させ、より最適化されたコードを生成し、完璧なAPI出力とシンボル衝突を防止することができます.共有ライブラリ(Dll)をコンパイルするときにこのオプションを使用することを強くお勧めします.
-fvisibility-inlines-hidden
デフォルトでは、すべてのインライン関数を非表示にして、エクスポートシンボルテーブルのサイズを小さくします.ファイルのサイズを縮小したり、実行性能を向上させたりすることができます.共有ライブラリをコンパイルするときにこのオプションを使用することを強くお勧めします.
(9)-minline-all-stringops
デフォルトでは、GCCは、宛先が少なくとも4バイトの境界に整列すると判断した文字列操作のみをプログラムコードに組み込む.このオプションは、より多くのインラインを有効にし、バイナリファイルのボリュームを増やしますが、高速memcpy、strlen、memset操作に依存するプログラムのパフォーマンスを向上させることができます.
(10)-m64
64ビット環境に特化したコードを生成し、32ビット環境では実行できません.x 86_にのみ使用されます.64[EMT 64を含む]環境.
(11)-fprefetch-loop-arrays
配列プリフェッチ命令を生成し,巨大な配列を用いたプログラムに対してコード実行速度を速めることができ,データベース関連の大型ソフトウェアなどに適している.具体的な効果はコードによって異なります.-OSと一緒に使用できません.
(12)-pipe
コンパイルプロセスの異なるフェーズ間で一時ファイルではなくパイプを使用して通信することで、コンパイル速度を速めることができます.使用を推奨します.
4、推奨オプションスイッチ
以上、比較的安全なスイッチは
-pipe -O3(-Os) -march=native -mfpmath=sse -msse2 -ftracer
-fivopts -ftree-loop-linear -fforce-addr
GUIフレームなどの高精度を必要としない場合は、
-ffast-math
コンパイルされた共有ライブラリ(.dll,.a)が追加された場合
-fvisibility=hidden
-fvisibility-inlines-hidden