ベンチマークを走らせる

   ベンチマークによる速さ測定

●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は完全にシングルタスクなので単純に比較はできませんが、一昔前のワークステーションなみといったところでしょうか。


戻る