gcc3 の最適化オプション(その2)
以前のまま放りっぱなしのままでは何なので、落穂拾い。
結局、現在は
COPTS=-O2 -march=pentium4 -mcpu=pentium4 -fstrength-reduce -fprefetch-loop-arrays -pipe
でカーネル、ports を含むユーザランドを再構築して運用している。
-fprefetch-loop-arrays はなかなか面白いオプションだ。man によると、
-fprefetch-loop-arrays If supported by the target machine, generate instruc- tions to prefetch memory to improve the performance of loops that access large arrays.
抄訳
-fprefetch-loop-arrays ターゲットマシンがサポートしているのならば、 巨大な配列へのアクセスするループに対して パフォーマンスを向上させるためにメモリをプリフェッチする インストラクションを生成します。
vm や物理計算など、 配列をガシガシいじるプログラムに最適らしい。 Pentium なら Pentium III 以降でこのオプションが使えるようになる(デフォルトではおそらくオフ)。 ただし -Os と併用はできない、などの注意点はある。
ベンチマーク。配列計算といえばこれ。姫野ベンチ。 SMALL モード で 3 回連続実行してみた。列は回数、単位は MFLOPS である。
-O3 -DSMALL | -O2 -march=pentium4 -fstrength-reduce -fprefetch-loop-arrays |
---|---|
349.854312 | 375.026538 |
350.596776 | 377.537923 |
349.413404 | 375.862571 |
Pentium M 1.3G は Pentium III 600MHz 比で x4.5 くらいか。 Pentium M の底力を見たような気がする。
実用上は違いがこれほど先鋭に出ることはないだろうが、なかなかおいしい。 ちなみに -mfpmath=sse をつけるとかえって遅くなるようだ。残念である。