« H20年度春 情報処理技術者試験 | トップページ | DCモータ制御実験用の回路設計 »

2008年4月22日 (火)

H8における浮動小数点演算の速度

先日、母校の研究室に顔を出した際、学生さんがH8マイコンを使って浮動所数点演算をしておきながら「処理速度が遅い」などと言っていて「あたりまえじゃ、ボケェ!」と言いたくなりました。組み込み系のプログラミングでは浮動小数点演算を使わないという定石があるのですが、では使ったらどれだけ遅くなるのか、私自身が知らなかったのでちょっと試してみました。

実験の目的。int同士の掛け算、割り算と、double同士の掛け算、割り算でどれくらい処理速度に差が出るのか感覚を得ること。ザックリと分かればいいので厳密さは求めない。

実験方法。int同士の掛け算、割り算についてはH8プログラミングマニュアルから実行ステート数を求める。double同士の掛け算、割り算についてはHEWのシミュレータデバッガ(のプロファイラ)で$MULD、$DIVDの実行ステート数を取得する。

実験結果。int * int (MULXS)とint / int (DIVXS)はそれぞれ24ステート。double * double ($MULD)は680ステート、double / double ($DIVD)は1016ステートでした。浮動小数点を使うと、整数を使う場合に比べて掛け算なら 28倍、割り算なら42倍くらい計算時間がかかることがわかりました。

考察。int同士の掛算、割り算に使用された MULXS、DIVXSはH8/300HのCPUコアが持っている命令なのでそれなりの速度で実行できますが、浮動小数点の掛け算、割り算で使用された$MULD、$DIVDはアセンブリ言語で組まれた関数で内部にはループ処理が入っています。ですので、値の取り方によってはもう少し計算時間がかかる場合もあります。

やってみた感想です。先ほど出てきた学生さんと話をした時に「軽トラックとダンプカーぐらい重さが違う」という喩えたのは、非常に正確な例えだったなぁと驚きました。

« H20年度春 情報処理技術者試験 | トップページ | DCモータ制御実験用の回路設計 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/40964964

この記事へのトラックバック一覧です: H8における浮動小数点演算の速度:

« H20年度春 情報処理技術者試験 | トップページ | DCモータ制御実験用の回路設計 »

最近の写真