HD64180Compact(その6)16bit乗算処理 [Z80]
今回使用している HD64180 では Z80 には無かった 8bit x 8bit の乗算命令が追加されています。参考としてデータシートの乗算命令に関する部分の抜粋を貼っておきます。8bit の乗算を 17 ステートで実行できるのでかなり高速です。
Z80 における 16bit の乗算の高速化検討に関しては「Z80での高速な乗算処理(その3)2バイト乗算への適用検討」の記事(以降、乗算高速化ページと記す)で書きましたが、HD64180 の 8bit 乗算命令を使った場合、どれくらい速くなるものか実験してみました。
HD64180 の 8bit 乗算命令を使って 16bit の乗算を実行するために乗算高速化ページにも書いている下記式のようなバイト分割法(と勝手に呼称)で行いました。
作成したソースコードを以下に示します。あまり最適化はしていませんが高速化のために固定のワークエリアは使用せずスタックを使用するようにしました。最適化してみました。
実機で測定した乗算時間の結果を下表にまとめました。HD64180 は 6MHz で評価に時間がかかりそうだったので乗算高速化ページの時よりループ回数を 1/4 に削減しています。表中の Minus aquare method(マイナス二乗法)等の乗算方式についての詳細は乗算高速化ページを参照してください。表中の比率(ratio)は速度比率なので実行時間比率の逆数で同一色内での比率になっています。中段の Z80 6Mhz の部分は上段の Z80 20MHz での測定値からクロック反比例で算出した推定値です。また、Z80 と HD64180 は両者ともメモリ wait は無い状態です。
★追記 2024/03/10 {
今までの乗算処理時間の計測は乗算処理以外に乗算処理に渡す引数の設定や引数によるループ処理の部分の処理時間も含めた時間を計測していました。しかし、HD64180 の MLT を使用した 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 の乗算命令をもエミュれることが判りました。
最後に上記の速度比較表の元データとなる画面キャプチャーを貼っておきます。
★追記 2024/03/11
HD64180 の MLT を使った 16bit 乗算を変更し再測定
★追記 2024/03/21
6MHz 動作の HD64180 でアセンブラで記述したASCIIARTの実行時間が通常の乗算処理の7.3秒から3.5秒に短縮されました。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
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アセンブラ) |
|
※2024/03/11 最適化で高速化 |
実機で測定した乗算時間の結果を下表にまとめました。HD64180 は 6MHz で評価に時間がかかりそうだったので乗算高速化ページの時よりループ回数を 1/4 に削減しています。表中の Minus aquare 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秒に短縮されました。
HD64180と20ピンのPICを使った3チップ構成のボードで遊び中
— skyriver (@wcinp) March 13, 2024
64180で追加の8bit乗算を使った16bit乗算処理は最適化の結果、通常の乗算処理の4.56倍高速なり
64180 6MHzでアセンブラで記述したASCIIARTの実行時間は通常の乗算処理の7.3秒から3.5秒に短縮されたhttps://t.co/4U1k1Af2m3#HD64180Compact pic.twitter.com/9veKW5d2aN
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]