megaAVR |
●megaAVR
megaAVR163入手しました.パッケージは少し味気ないですが下の写真のようなテスト基盤で試してみました.シリアルプログラミング端子,RS232C,LCD用ピン,確認用LEDだけです.
買ったのは40pinDIPのパッケージで,pin配置は8535とまったく同じです.8535からの移行は楽だと思います.とりあえずat90s8535とのおもな違いは
・flash-16K,ram-1k,eeprom-512byteに増量
・SPIの追加
・内部1MHzクロック
・new core
ぐらいです.以前はクロック6Mといわれていましたが8MHzでした.あまり8535とは変わりませんが,私が個人的に興味あるのがnew coreの採用です.これはmovw命令による16bit移動がありますのでgccのint型の16bit移動と合いそうな気がしました.そこで以前のようにDhrystone benchmarkで実測してみました.
Dhrystone benchmark再び |
●今回の測定について
さて,以前も8515でベンチを取りました.以前ベンチをとったときのページはこれです.今回再びやってみますが,以前と比べてコンパイラは進化していると考えられます.またDhrystoneを実行するためには10Kbyte以上のメモリが必要になりますが,今回はこのメモリを消費するセクションであるProc8セクションを行っていません.よってこれも含めて比較してみます.使用したプログラムはDhrystone2.1です.
以前の測定の後に質問されたことがあります.プログラムの最適化は行っているのかというものです.ソースのプログラムは確かに少し乱雑で,いろいろ同じ処理をさせるのに変更はできそうです.同じ処理ならアセンブラですべて記述した特化されたコードも書くことができるでしょう.
しかし,このような汚いプログラムでもコンパイラは最適化してくれると思われます.よってソースプログラムを尊重して,あえて計算測定部のプログラムにはまったく手を加えないことにしています.これでコンパイラの進化も測定できます.雑誌とかのものは最適化してしまってるのでしょうか?それではせっかくのベンチマークの意味が少なくなってしまうような気もします.
●コンパイラの進化?
今回使用したコンパイラは新しくセットアップしたものです.そこで以前とまったく同じProc8を含む元のソースと同じプログラムと前回と同じ8515+extRAMボードで実験してみるとコンパイラの具合がわかります.実験してみた結果は次のようになりました.数値はDhrystone-MIPS値になります.下のカッコはプログラムサイズです.コンパイラスイッチごとに測定してみました.
(ProgramSize Byte) |
|
|
(-Os) |
|
binutils-000806 egcs-core-20000731 avr-libc-20000730 |
|
|
|
|
binutils-011106 gcc-core-20011001 avr-libc-20011029 |
(7098) |
(4252) |
(4308) |
(4360) |
遅くなってます.うーん.結構あの時期のコンパイラはおかしな動きもあったので,そのあたりの調整があったんでしょうか.外部メモリアクセスも同じだし.うーん.今年にはいってからの傾向として-O1オプションが調子がよさそうです.
●Dhrystoneの一部変更
上にも述べましたようにDhrystone中のProc8の配列位置変え処理がメモリを必要としますので,これを飛ばすようにだけプログラムの変更をしました.環境はその8515+nowait外部メモリでコンパイラも同じ新しいものです.これを比較することで,Proc8を除いたプログラムでのDhrystone相当係数を計算します.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
というわけでオプション間のばらつきはそれほどでもなく,その比の平均値は1.253となりました.よってProc8を除いた場合はD-Mips値が1.253倍になることになります.少し乱暴ですが,以降は出てきたMIPS値をこの値で割って相当D-MIPS値で表記します.
●チップ間の速度差
さて準備ができたところでチップ間の速度差を出してみます.比較対象は
(1) AT90S8515+externalRAM-nowait
(2) AT90S8535
(3) ATmega163
このなかで(1)と(2)の比較は遅い外部RAMを使ったときとの差を調べるためです.同じようにコードサイズも比較してみました.プログラムに関しては8535とmega163は今回はシリアル関連のポートのラベル名の変更のみで大丈夫でした.例としてmega163のプログラムはこれです.以前と同じようにシリアル57600bpsで出力しています.
(ProgramSize Byte) |
|
|
|
|
|
(6620) |
(3982) |
(4066) |
(4108) |
|
(6628) |
(3990) |
(4075) |
(4116) |
|
(6526) |
(3740) |
(3850) |
(3888) |
という具合になりました.表を見ると(1)と(2)はコードサイズはほとんど変わりませんが,速度は-O1オプションで見てみると1.22倍となっています.内部RAMの方が速いわけです.さらに今回のメイン比較である(2)と(3)を見ると速度で1.05倍となっておりnew coreの移動命令で少し速くなっています.今回はあまりありませんでしたがどうやらポインタを使う時には早くなりそうです.さらにコードサイズで6.27%小さくなっています.
megaAVRは速度で5.61%早くなりサイズで6.27%少なくなることになります.
おわりに |
なかなか動かないなあと思っていたら出荷状態では内部1MHzクロックになっているんですね.これですこしはまりました.1200のクロック設定はISPでは行えませんでしたが,ATmega163に関しては外部クロックへの設定やブートセクションなどの設定はAVR910-Ver2.3ファームとアトメルのAVRprog-Ver1.31のISPの組み合わせで可能でした.どちらもフリーです.クロック設定変更はアトメルフリー書き込みソフトで行い,書き込みもこれでできますが,今回はuispをつかいました.
このページではmegaAVR163の効果を中心に見てみました.速度とコードサイズの2重の効果があるのでこれはよさそうです.あとは安くそして安定して供給されたらいいんですけど.このmegaAVRシリーズはflashが32K,64K,128Kと増えていっていますが,速度のほうもこの調子でがんばってもらいたいです.