開発ブログ

EC2のGCC最適化

2016-09-23 19:43 - saito

こんにちは。エンジニアの齋藤です。今回は、前回メモした、

メモ:gccの最適化オプション。今後コンパイルする時にテスト。

についてちょっと書いてみようかと思います。
まずGCCですが、これはGnu Compiler Collection(Gnu C Compiler)の略です。
GNUというプロジェクトが作った、色々な言語のソースコードを、CPUが実行できるようにコンパイルしてくれるものです。
ソースからインストールする時のmakeコマンドで動いてるヤツです。

そして、このGCCの最適化オプションを使うとどうなるかですが、CPUに合わせてコンパイルするので、できあがったバイナリの実行速度が速くなります。

実際には、configureの前に、

というコマンドを実行しています。

この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と指定した時でもエラーにはならなかったので、おそらく大丈夫だとは思います…多分…
もし試す方がいたら自己責任でお願いします…