マイコンベンチ

先日書いたユークリッドの互除法でベンチを取ってみました。

測定方法

1.各マイコンユークリッドの互除法によって最大公約数を求めさせる。
2.1回求まるごとに出力ポートを反転させる。
3.出力ポートの信号の周波数を計測する。
4.周波数を2倍して1秒間あたりの実行回数を求める。

測定結果

マイコンを20[MHz]で動作させた場合の結果です。
(数値は1763と1927で、解は41)
AVR Tiny2313:12万5000[回/秒]
自作CPU:7万1600[回/秒]
PIC 16F88:1万7700[回/秒]

考察

AVRに負けたのは単純に1命令あたりのクロック数が反映された結果だと思います。
AVRは1クロック1命令なのに対して、3クロック1命令の自作CPUの結果が
1/3の実行回数になっていないのは、16bitで計算を行ったからだと考えられます。
AVRでは2命令かけて計算しますからね。>16bit演算

さて、PICには勝利しました。
これは16bit演算であったことと、1命令4クロックでの実行であることに加えて、PICのアーキテクチャと命令セットに原因があると思われます。
今回の処理では16bit演算をしているのは何度も書いていますが、8bitずつに分けて計算する場合、
下位バイトの最上位bitの繰り上がり、繰り下がりを何処かに置いておいて、それを上位バイトの計算に反映させる必要があります。
加算で例を示しますと、

;16bit加算の例
;テストしてないけど多分合ってます。


;AVRの場合 (R3,R2)←(R3,R2)+(R1,R0)
ADD R2,R0 ;通常の加算
ADC R3,R1 ;キャリ付き加算


;自作CPUの場合 R1←R1+R0
ADD R1,R0 ;16bitCPUなので1回でおしまい


;PICの場合 (23h,22h)←(23h,22h)+(21h,20h)
MOVF 20h,w ;まずWレジスタにコピー
ADDWF 22h,f ;普通に加算
BTFSC STATUS,C ;キャリフラグが立ってなかったらスキップ
INCF 23h,f ;キャリが発生していたら上位バイトに1を足しておく
MOVF 21h,w ;Wレジスタにコピー
ADDWF 23h,f 普通に加算

こんな感じになると思います。
ご覧いただければ分かるとは思いますが、
PICで16bitの演算を書くと非常に長くなることがおわかりいただけると思います。
ユークリッドの互除法では、剰余を求める処理がありますが、
今回比較した3つのCPUはどれも除算命令がないので、
割られる数から割る数を引き続けて、負の数になったら割る数を1回足すという方法で
剰余を求めています。このときに引き算がかなり行われるので、
それが反映されたものと思います。

まあ、PICの基本設計は非常に古い(80年代)ので、
当時の水準からすれば、性能と価格の妥協点として、
この程度のアーキテクチャが優秀であったというのはあると思います。

とまあそんな感じで考察してみました。

久しぶりにまともな記事を書いた気がします(笑)
ではではっ。