Collection(グヌーコンパイラコレクション)の略で、GNUプロジェクトのコンパイラの集まりです。GNU(グヌー)とは全てフリーソフトウェアからなるOS(オペレーティングシステム)およびコンピュータ用ソフトウェアの集まり(コレクション)のことです。ソースコードをコンパイルするときにgccを利用していることも多いと思いますので、おすすめの最適化オプションをご紹介したいと思います。最適化オプション-O2または-O3O2は広くコンパイル時に指定されることが多く、ほとんどの環境で効果のある基本的な最適化に加えてコードサイズが増加してしまう各種最適化を行います。O3はO2の最適化に加えてベクトライズ化(-ftree-vectorizeなど)やインライン展開(-finline-functionsなど)などのさらなる積極的な最適化が行われ、環境やコードの作りによっては実行効率がよくなりますが、逆に遅くなったり不具合がでたりすることもありますので注意が必要です。GCCのバージョンによってO2とO3を指定したときに適用される最適化は以下のコマンドで調べることができます。--help=optimizeO2とO3で適用される最適化の差分は上記コマンドの結果をdiffコマンドなどで比較すると分かりやすいかもしれません。o3.txt最適化処理に詳しくてカリカリにチューニングを施したい場合を除いて、ほとんどの環境でO2を指定しておくのが無難です。gccなどで参照して下さい)しないといけませんが、nativeを指定すると現在のCPUに合った指定を自動でしてくれます。バイナリを他の環境で使用する予定であるならば特定のCPUに最適化してはいけませんが、コンパイルした環境でしか使用しないのであれば最適化の効果が期待できます。-march=nativeで指定されるオプションは以下のスクリプトで調べることができます。-march=nativeが生成する最適化オプション※複数バージョンのgccが混在している環境などでは、変数CCにCC="gcc-6.5.0′′などで調べたいgccコマンドを設定して下さい。-mfpmath=sseSSE有効化のオプションと演算にSSEを使用するようにするオプションです。-mssse3はCPUによって-msse2,-msse3,-mssse3,-msse4.1,-msse4.2,-msse4など変わりますので注意して下さい。gccなどを参照)x64(64bit)環境だと自動的に-msse2と-mfpmath=sseは有効になっており演算はSSEを使用するようになっているのですが、x86(32bit)環境だとFPU(i387)を使用するようになっています。FPUを使用する演算はSSEを使用しての演算に比べて遅いですので、x86環境でSSE2以降が使用できるCPUであれば演算速度が向上します。i387とのやりとりで発生する計算精度(ビット数)の違いによる丸め誤差もおきなくなります。-fexcess-precision=fast計算手順を古いgccに合わせて簡略化するオプションです。最近のgccはデフォルトだと計算手順を仕様どおり厳密に行うようになっており、手順が省略できない分旧仕様のgccに比べてパフォーマンスが落ちています。このオプションをしていすると計算手順が旧gcc仕様の簡略化されたものになり、結果として全体的にパフォーマンスが向上します。厳密な計算結果を要する科学技術計算ようなコードに適用する場合は注意が必要です。-ffast-mathこのオプションを指定するとgccは演算の誤差を全く気にせず最適化を行うようになります。演算が高速化する代わりに不具合が起きやすくなりますので、使用できるコードは限定的です。汎用的に使用できる最適化ではありませんが、実験を繰り返して不具合が出ないことを確かめてカリカリにチューンする際には試してもよい最適化オプションになります。-funroll-loopsループ展開を行うオプションです。ループ展開とは簡単に言うとループ中の処理を繰り返し回数分ならべて実行するように変更するということです。このオプションは効果がある場合もありますが、コードサイズが大きくなるだけで効果がないかパフォーマンスが低下することもありますので、実験して効果を確かめて指定する必要があります。Optimization)を行うようにするオプションです。通常ソースファイル単位で行っている最適化をリンク時に全体を見て最適化をかけることで、さらなるパフォーマンスアップが期待できます。莫大なリンク時間がかかる割に効果が薄く、リンク時にエラーが起きることもおおくて、通常このオプションを使うのは時間的余裕がないと困難かもしれません。チューニングの可能性を追い求める人には指定する価値のあるオプションの一つだと思います。-fopenmpこのオプションを指定するとOpenMPが有効になり、コード次第ですが処理が並列化されます。並列処理で複数コアを効率よく使い切ればパフォーマンスアップが期待できますが、完全にコード次第です。OpenMPに対応したコードや対応できそうなコードであれば有効化する価値があります。最適化オプションというよりは並列化技術ですので、興味を持たれた方はOpenMP関連を調べて詳しく調べてみるとよいと思います。関連する主な環境変数CC使用するCコンパイラのコマンドを指定できます。CXX使用するC++コンパイラのコマンドを指定できます。LD使用するリンカのコマンドを指定できます。AR使用するarコマンドを指定できます。NM使用するnmコマンドを指定できます。RANLIB使用するranlibコマンドを指定できます。ranlibはarの別名です。CFLAGSCコンパイラに渡すオプションを指定できます。CXXFLAGSC++コンパイラに渡すオプションを指定できます。LDFLAGSリンカに渡すオプションを指定できます。CPPFLAGSプリプロセッサに渡すオプションを指定できます。環境変数指定の例souceコマンドを使用して以下の内容が記述されたファイルを読み込んで使用しています。GCC_OP_TYPEラッパースクリプト最適化オプションを指定してコンパイルしたいにも関わらず、CFLAGSを見てくれない場合などに使用する自前で作成して使用しているラッパースクリプトです。自己責任において自由に使用して頂いて構いません。/usr/local/bin/gccなどに作成して実行権を付け、CCに指定して使用します。GCC_NAMEは環境によって調整して下さい。/usr/local/binにパスが通っていて優先順位が高いのであればCCに指定する必要はない場合があります。環境変数GCC_OP_TYPE=xxxの内容に応じて/etc/gcc.option.xxxのオプションが指定されます。>>gcc_cmd.log-Oオプションが指定されていないとO2指定となりますが、他のレベルが指定されていた場合は指定されたレベルに従います。O_LV=の部分を書き換えれば強制的にレベルを指定可能です。march指定は捨てて最終的にgcc.optionが適用されます。-fexcess-precision=fast'O_LV=2はO2指定となります。まとめgccの最適化オプションの一部をご紹介しましたがいかがでしたでしょうか?最適化やチューニングは奥が深く時間がかかりますが、深く追求していくと結構楽しいものです。Linuxディストリビューションなどで、コンパイルされたパッケージでソフトウェアを入れるのはサーバの管理上楽でありメンテナンス性に優れますが、パフォーマンスでは自前で最適化オプションを付けてコンパイルしたものに劣ります。自分の環境にあった最適化オプションを探してみて下さい。...転職や就職するとき履歴書や面接で気を付けるポイント私は会社の創業期~成長期に技術系の面接官として多くの人を見てきました。...【5000円~】WordPress開設作業や保守業務等のサーバ関連作業を代行致します※現在は新規依頼を受付けておりません。受付再開時期は未定です。...このアカスブログは全てリンクフリーです。無断リンクして頂いて全く問題ございません。(※転載は禁止)相互リンク希望の方は「お問合せ」かTwitterのDMにご連絡ください。