EC2のGCC最適化
2016-09-23 19:43
こんにちは。エンジニアの齋藤です。今回は、前回メモした、
メモ:gccの最適化オプション。今後コンパイルする時にテスト。
についてちょっと書いてみようかと思います。
まずGCCですが、これはGnu Compiler Collection(Gnu C Compiler)の略です。
GNUというプロジェクトが作った、色々な言語のソースコードを、CPUが実行できるようにコンパイルしてくれるものです。
ソースからインストールする時のmakeコマンドで動いてるヤツです。
そして、このGCCの最適化オプションを使うとどうなるかですが、CPUに合わせてコンパイルするので、できあがったバイナリの実行速度が速くなります。
実際には、configureの前に、
1 2 3 |
export CFLAGS="-O2 -march=native -pipe" export CXXFLAGS="${CFLAGS}" |
というコマンドを実行しています。
この2つのコマンドですが、それぞれ
CFLAGS → Cコンパイラの引数
CXXFLAGS → C++コンパイラの引数
さらにそのオプションで、
-O2 → 最適化レベル。7段階ありますが、2が推奨のレベルです。
-march=native → micro architecture。CPUに合わせたものを指定します。nativeだと自動的にそのCPUに合わせたものにしてくれます。
-pipe → コンパイル時間を短縮してくれます。作成されるバイナリには特に影響ありません。
という感じです。
ここらへんはGCCの最適化 – Gentoo Wikiが詳しく解説してくれています。
問題は、CPUに合わせて最適化させるので、他のCPUが違うサーバにバイナリを持って行った時に動かなくなったりします。
Amazon EC2では、インスタンスタイプが違えばCPUも違うので、インスタンスを変更したりした時に動かなくなりそうな懸念があります。
なので少し調べてみました。
t1.micro | Xeon E5-2670 v2 | march=core-avx-i |
t2.nano | Xeon E5-2676 v3 | march=core2 |
t2.micro | Xeon E5-2676 v3 | march=core-avx2 |
t2.small | Xeon E5-2676 v3 | march=core-avx2 |
t2.small (昔に作ったもの) | Xeon E5-2670 v2 | march=core-avx-i |
t2.medium | Xeon E5-2676 v3 | march=core-avx2 |
m1.small | Xeon E5-2651 v2 | march=core-avx-i |
m1.small (昔に作ったもの) | Xeon E5-2650 0 | march=corei7-avx |
m3.medium | Xeon E5-2670 v2 | march=core-avx-i |
m3.large | Xeon E5-2670 v2 | march=core-avx-i |
m4.large | Xeon E5-2676 v3 | march=core-avx2 |
c4.large | Xeon E5-2666 v3 | march=core2 |
と、どれもバラバラな結果ですが、とりあえず最新世代はHaswellになっていました。
ただ、それでもmarchはnativeでcore-avx2にはならないようです。
一応、最新世代ならGCCコマンドで-march=core-avx2
と指定した時でもエラーにはならなかったので、おそらく大丈夫だとは思います…多分…
もし試す方がいたら自己責任でお願いします…