PPC-gccのコンパイラ性能比較

gccをppcクロスでコンパイルしたppcgccのバージョン間のコンパイラ 性能測定(というほど正確なものではありませんが)結果です。
ppcsim上で実行した結果なので、実プロセッサでの実行時間 を完全に予測できるものではありませんが、使用命令数の変化を 見ることで、どのような点に着目してコンパイラチューニングを 行っているか判る「かも」知れません。

  1. 実行条件
  2. 実行結果
  3. 見どころ?
  4. その他
  5. 履歴


実行条件


実行条件は以下です。

シミュレータ/バージョン
PPC Simulator for Cygwin Ver 0.86 1999-2002 TANE (テストバージョン)

実行アプリケーション/実行時オプション
Persistence of Vision(tm) Ray Tracer Version 3.1g.mp.0.7.mcp.0.1 (MegaPov MCP 0.7.0.1 )ppc-cross

megapov -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png

実行スクリプト
date

sum reset
exec megapov.010729 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.010802 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.010916 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.011104 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.011230 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.020329 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.020423 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum
sum reset
exec megapov.020622 -i povray31/scenes/incdemo/colors.pov +W320 +H240 +A -o colors_megapov.png
sum

date

使用したコンパイラバージョン
megapov.010729  : GCC: (GNU) 3.1 20010714 (experimental)
megapov.010802  : GCC: (GNU) 3.1 20010714 (experimental)
megapov.010916  : GCC: (GNU) 3.1 20010915 (experimental)
megapov.011104  : GCC: (GNU) 3.0.2
megapov.011230  : GCC: (GNU) 3.0.3 20011217 (prerelease)
megapov.020329  : GCC: (GNU) 3.2 20020323 (experimental)
megapov.020423  : GCC: (GNU) 3.2 20020417 (experimental)
megapov.011104  : GCC: (GNU) 3.1
※megapov.010729とmegapov.010802の差は失念。他、各モジュールともコンパイラオプション 指定がまちまちです(測定条件として致命的では.......)。ほぼ全て「-O2 -ffast-math」の ハズ。


実行結果


実行結果のサマリは以下です。

megapov.010729 Total_count  =     2136752931
megapov.010802 Total_count  =     2136775870
megapov.010916 Total_count  =     2137790565
megapov.011104 Total_count  =     2126913140
megapov.011230 Total_count  =     2126905644
megapov.020329 Total_count  =     2135549896
megapov.020423 Total_count  =     2133073046
megapov.020622 Total_count  =     2201057666

実行時に出力される結果をリダイレクトしたものはこちら。

result_020622.txt

見どころ?


コンパイル条件がいまいち統一されていないとか、つっこみ所満載の比較なので この結果だけで一概にコンパイラ性能を語る事はできませんが、使用された命令 の変化を見ていると模様があるようです。

次のような簡単なawkスクリプトを使用して様子を見てみました。

child_test> cat count.awk
#!/usr/bin/gawk -f
{
  if( /^Total/ ){
    printf(".......%d\n",sum) ;
    sum=0 ;
  }else{
    sum+=$3 ;
  }
  print $0 ;
}

このスクリプトを使用して、例えばロード命令群の数を調べてみるのに

egrep '^l|Total_' result_020426.txt | gawk -f count.awk | less

などとやってみました。以下色々命令をひっかけてみた感じ。

●ロード命令の使用数は新しいバージョンの方が少ない
egrep '^l|Total_' result_020622.txt | gawk -f count.awk | grep '^\.'
.......416742010
.......416746208
.......416744848
.......419022022
.......419022022
.......406729070
.......408168961
.......403799227

ムダなメモリアクセスを減らしているように思えます。しかし、普通は 減らせるものなのかどうか疑問があるかも。

●でもストア命令の使用数は新しいバージョンの方が多い
egrep '^st|Total_' result_020622.txt | gawk -f count.awk | grep '^\.'
.......281391135
.......281394127
.......284158988
.......282682955
.......282682955
.......286550914
.......287847080
.......312553871

ハードウェア設計的にロードよりストアは遅くても最悪良いと されます。理由は、単純な二項演算を考えた場合、ロードは 2回必要ですが、ストアは1回で良いと言えるからです。 n項演算だと途中の演算結果をレジスタ保存しますので、ロード がnに対してストアは1という場面は多く存在するでしょう。 また、単純なループカウンタに使用する変数の場合、レジスタ から追い出されなければストアは必要ありません。
逆説的に、実際にストア命令が遅いかどうかを考えないとするならば、n項演算や ループカウンタの使用に着目すると、レジスタの使用効率が良いほど ストア命令の使用は少ないとも言えると思います。
バージョンアップ毎に増えていると言う事は、ストアを減らす ように考えていると言うよりは、 配列の添え字計算に必要な値の一部を保持するようにした方が 効率が良いなどの理由によりループカウンタのような変数は積極的に ストアしているのかも知れません。この辺ストアが増えるような 具体的なコードというのを見てみたいかも。

●ブランチ命令はバージョンアップ毎に減っている
egrep '^b|Total_' result_020622.txt | gawk -f count.awk | grep '^\.'
.......299444238
.......299449560
.......297512835
.......297010738
.......297008671
.......293533360
.......293297823
.......273694393

パイプライン効率的にブランチ命令は減らせるなら少ない方が良いと 思われます。こちらはバージョンアップを重ねるごとに減っているようです。


全体的な傾向として megapov.011104,megapov.011230の命令数が命令毎に 見たときに平均して一番少なくなっているようです (だからそれがTotalに見えているのでしょう(^^;)が、 ロード命令やブランチ命令などのように実行時間に効くと思われる項目 を個別に見るとバージョンアップを重ねる毎に改善されているように見えます。 条件コードのオプティマイズの ように、命令数と最終的に速いコードとは別という例がありますので、 実プロセッサで実行する分には最新のコンパイラの吐いたコードの方が 常に良いのかも知れません。

その他


今までの所、コンパイラバグと思われるものには突き当たっていないため、 (コンパイラ性能は別にして)品質の高さには毎度驚くばかりです。
今後の課題としては、コンパイラオプションによる違いやバージョンのメモを きちんと残しておくべきですね(^^;
だんだんパイプライン効率のレベルでチューニングされている予感がしなくも ありませんので、関数毎の増減と各関数のプログラム的な特徴を踏まえた上で コンパイル結果を見てみないと、良くなっているのかどうかが判らなくなって きた気がしなくもありません。
AltiVec対応も始まっているようですので、今後はそちらのチューニングにも 注目したい所です(が、ppcsimでAltiVec命令をサポートされる日は来るのか?(-_-;)。

履歴

  2002/04/27 : 初版
  2002/06/22 : gcc-3.1のデータを追加した。全体の傾向の線上に乗っているので、コメント文章はそのまま。


TOP PREV