SSブログ
English Version

HD64180Compact(その6)16bit乗算処理 [Z80]

 今回使用している HD64180 では Z80 には無かった 8bit x 8bit の乗算命令が追加されています。参考としてデータシートの乗算命令に関する部分の抜粋を貼っておきます。8bit の乗算を 17 ステートで実行できるのでかなり高速です。

HD64180 の8ビット乗算命令


 Z80 における 16bit の乗算の高速化検討に関しては「Z80での高速な乗算処理(その3)2バイト乗算への適用検討」の記事(以降、乗算高速化ページと記す)で書きましたが、HD64180 の 8bit 乗算命令を使った場合、どれくらい速くなるものか実験してみました。
 HD64180 の 8bit 乗算命令を使って 16bit の乗算を実行するために乗算高速化ページにも書いている下記式のようなバイト分割法(と勝手に呼称)で行いました。


    (28*x1 + x0)*(28*y1 + y0) 
  = 216*x1*y1 + 28*(x0*y1 + x1*y0) + x0*y0 
 


 作成したソースコードを以下に示します。あまり最適化はしていませんが高速化のために固定のワークエリアは使用せずスタックを使用するようにしました。最適化してみました。

HD64180 15bit 乗算処理(Z80アセンブラ)
; unsigned 15 bits mul(HD64180) ; DE <- val1(X) ; HL <- val2(Y) ; HLBC -> val1 * val2 ; ; (256*x1 + x0)*(256*y1 + y0) ; = 2^16x1y1 + 2^8(x0*y1 + x1*y0) + x0*y0 ; ; | . | . | . | . | ; <--- x1y1 ---> ; <--- x0y1 ---> ; <--- x1y0 ---> ; <--- x0y0 ---> 036B FMul18: 036B 4B LD C,E 036C 45 LD B,L ; BC:X0Y0 036D 5C LD E,H 036E D5 PUSH DE 036F 58 LD E,B ; DE:X1Y0 0370 69 LD L,C ; HL:Y1X0 MLT BCreg 0371 ED 4C + DB 0EDH,4CH + ((BCreg - RegPairO) SHL 4) MLT DEreg 0373 ED 5C + DB 0EDH,4CH + ((DEreg - RegPairO) SHL 4) MLT HLreg 0375 ED 6C + DB 0EDH,4CH + ((HLreg - RegPairO) SHL 4) if MULTI16 ; if 16bit multi XOR A endif 0377 19 ADD HL,DE 0378 D1 POP DE MLT DEreg ; DE: X1*Y1 0379 ED 5C + DB 0EDH,4CH + ((DEreg - RegPairO) SHL 4) if MULTI16 ; if 16bit multi ADC A,D LD D,A endif 037B 78 LD A,B 037C 85 ADD A,L 037D 47 LD B,A 037E 7C LD A,H 037F 8B ADC A,E 0380 6F LD L,A 0381 8A ADC A,D 0382 95 SUB L 0383 67 LD H,A 0384 C9 RET
※2024/03/11 最適化で高速化

 実機で測定した乗算時間の結果を下表にまとめました。HD64180 は 6MHz で評価に時間がかかりそうだったので乗算高速化ページの時よりループ回数を 1/4 に削減しています。表中の Minus square method(マイナス二乗法)等の乗算方式についての詳細は乗算高速化ページを参照してください。表中の比率(ratio)は速度比率なので実行時間比率の逆数で同一色内での比率になっています。中段の Z80 6Mhz の部分は上段の Z80 20MHz での測定値からクロック反比例で算出した推定値です。また、Z80 と HD64180 は両者ともメモリ wait は無い状態です。

★追記 2024/03/10 {
 今までの乗算処理時間の計測は乗算処理以外に乗算処理に渡す引数の設定や引数によるループ処理の部分の処理時間も含めた時間を計測していました。しかし、HD64180 の MLT を使用した 16bit 乗算処理がかなりコンパクトになったことから乗算処理以外の処理の時間分を測定し、従来計測していた乗算処理時間から減算することで純粋に乗算処理にかかる時間で比較するようにしました。
}

16bit 乗算処理の速度比較表


 意外だったのは Z80 ではノーマルな乗算法より速かった1バイトのマイナス二乗法を使ったバイト分割法による乗算が、ノーマルな乗算法より遅くなったことです。2byte 版のマイナス二乗法のデータを見ると Z80 での高速化は 1.35 倍 だったものが HD64180 では 1.24 倍に低下していますが、ノーマル手法よりは速いという結果でした。
 また、Z80 と HD64180 の速度差としては HD64180 の方が 1.10 ~ 1.26 倍速いという結果でした。
 元々の目的である MLT による高速化については「MLT を使用した 16bit の乗算処理はノーマル処理の 4.56 倍速い」という結果になりました。流石にハードウェアによる高速化なので速いですね。

 それから今回の評価に直接的な関係はありませんが、Windows の DOS 窓で動作する CPM エミュレータがなんと HD64180 の乗算命令をもエミュれることが判りました。

 最後に上記の速度比較表の元データとなる画面キャプチャーを貼っておきます。

16bit 乗算処理の時間計測画面(Z80 20MHz)

16bit 乗算処理以外の処理の時間計測画面(Z80 20MHz)



16bit 乗算処理の時間計測画面(HD64180 6MHz)

16bit 乗算処理以外の処理の時間計測画面(HD64180 6MHz)


★追記 2024/03/11
 HD64180 の MLT を使った 16bit 乗算を変更し再測定

MLT 使用の 16bit 乗算処理の時間計測画面(HD64180 6MHz)



★追記 2024/03/21
 6MHz 動作の HD64180 でアセンブラで記述したASCIIARTの実行時間が通常の乗算処理の7.3秒から3.5秒に短縮されました。



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。