結論
手持ちの PC では CFLAGS="-O2" で良いということになった。
ベンチマーク概要
Phoronix test suites で list-recommended-tests とされている物のうち、System Tests の中からさらに CFLAGS をきちんと拾ってくれるものを選択した。コンパイラは CPU の仕事に関わるんだから CPU テストで見るべきという意見もありそうだけど、システム全体で効果が出ないなら、わざわざ危険を犯す必要はないと思い、システムテストとした。
検証したフラグは -march={native,x86-64}, -mtune=generic だ。なぜなら Arch の makepkg.conf が -march=x86-64 -mtune=generic となっているからだ。
マシン情報
Apache テスト
-mtune=generic がなぜか突出。多少差が出てる。
PostgreSQL テスト
非常に僅差。
WavPack テスト
とても僅差。
GnuPG テスト
すごい僅差。
Redis テスト
僅差ながら -O2 が優勝。多少差が出たか。
Stress-NG テスト
CPU ストレスを選んだので CPU を直撃する -march=native がすごいんじゃないかと思ったけど、全然だった。多少差がでた。
まとめ
自分の PC ではアーキテクチャ固有の最適化を使っても、あまりパフォーマンスに差が見えない。危険を犯して得られる見返りが小さい。
また、ある程度差が出た Apache, Redis, Stress-NG では、無印が 3位、1位、2位と表彰台を外さない大活躍。
つまり、自分の PC では -O2 無印で何も危険を犯す必要が無いという結果となった。
おまけ: なぜ -march, -mtune で速くならないのか、勝手に想像してみた。
自分は素人なので、考えただけで本当かどうかは知らないので悪しからず。
一つ目の理由は、ハードつまり CPU が、固有機能は持っているが、別に汎用機能と比べて効率良く動くようにはできていない、ということが考えられる。まあこれはどんな製品にもあることだろう。
二つ目の理由はソフトウェア側、つまり gcc の問題だ。良く知らないけど、-march, -mtune は元のコードを書き換えて、その機能を使うようにする、またはその機能に適したコードに書き換えると言うものだと思っている。あくまでも CPU の要件に沿ったコードに書き換えるもので、コードそのものを -O2 のように効率化するものではないため、変換したコードが元のコードよりも効率的になっていない、ということが考えられる。
もちろん本当かどうかは知らない。
コメント