ベンチマークによる速さ測定 |
●Dhrystoneベンチマーク
AVRの速さは実際のところどんなものでしょうか。実際にMIPS値を計測してみました。
Dhrystoneは整数演算の早さを求めるときによく使用されているようです。このプログラムを走らせるためには2500バイト以上のRAMが必要ですので、at90s8515にRAMを増設してプログラムを移植してみました。適当に(半ば強引に)移植したので恥ずかしいのですがプログラムはこれです。時間計測はRTCがないのでとりあえずタイマーを使用しました。その他いらない機能は取り外してあります。結果はシリアルポートで出力しています。
条件:at90s8515 - 8MHz with 32K external SRAM
プログラム:Dhrystone 2.1
コンパイラ:最新のもの(ここでセットアップしたもの)
●測定結果その1
まず、通常どおりコードサイズで最適化してみた場合は
Dhrystone Benchmark Execution starts, 20000 runs through Dhrystone Execution ends TMR1 = 53594
となりました。ここからMIPS値を計算してみます。
TMR1はCK/1024に設定しましたので
8000000 / 1024 = 7812.5 count/sec
となります。よって
53594 count = 53594 / 7812.5 sec = 6.86 sec
です。1秒あたりのサイクル数は
20000 / 6.86 = 2915.45 Dhrystone/sec
であり、MIPS値は
2915.45 / 1757 = 1.659 MIPS
となります。うーんこんなもんか。gccはint型を16bitとしているためこの数値になると思います。
●測定結果その2
次に、先ほどはメモリサイクルにウェイトを入れていましたので NO WAIT にしてみます。外部RAMへのアクセスが3cycleになります。ウェイトを入れている場合は4cycleです。内装RAMは1cycle accessができるのですが、外部RAMですので仕方ありません。結果は
Dhrystone Benchmark Execution starts, 20000 runs through Dhrystone Execution ends TMR1 = 46017
となりました。
3395.4 Dhrystone/sec
1.933 MIPS
でした。
●測定結果その3
さらに-O9オプションでコードスピードで最適化してみると
Dhrystone Benchmark Execution starts, 20000 runs through Dhrystone Execution ends TMR1 = 45939
3401.2 Dhrystone/sec
1.938 MIPS
でした。(あまり変わりませんね。ちなみにコードサイズもあまり変わりませんでした。)
●まとめ
私のパソコンでは(K6-2 333Mhz)ではだいたい500MIPS位、新しいパソコンでは1700MIPSくらいでてしまいます。1757で割るのは基準となったコンピュータ(VAX11/780) が その速度だったからだそうです。基準コンピュータを1MIPSとした相対値です。
メモリサイクルを早くすると数値が伸びました。今回は70ns品を使いましたが大丈夫でした。
以前H8のMLで玉造さんがH8で同様に走らせたときは、2.3786 MIPSだったそうです。あちらは16bit接続でint型が最初から16bitなのでそうなったのだと思います。AVRは後半の文字列処理で稼いでいる感じでしょうか。
最近ではParmでDhrystoneを測定するベンチマークマニアもいらっしゃるそうで、DragonBallという確か68000系の組み込み用のやつで2380Dhrystone/sec出ているそうです。さらにオーバークロックの測定も。。。
古いsunがあったりするのですが(68020やつ、サーバーとして現役です)そいつは3500Dhrystone程度です。まあAVRは完全にシングルタスクなので単純に比較はできませんが、一昔前のワークステーションなみといったところでしょうか。