FPGAを使った数値演算回路実現の勘所(4) ―― 浮動小数点演算器の構成を考える Part 2

鈴木 昌治

tag: 半導体

技術解説 2010年10月 8日

前回に続いて,浮動小数点演算の実現方法について考えていきます.浮動小数点演算ではIEEE 754のフォーマットが有名ですが,ハードウェアで演算器を実現する場合,必ずしもこれに従う必要はありません.システムが要求する精度やハードウェアの制約をきちんと把握し,生成される回路構成を見通しながら論理合成すれば,効率の良い回路を設計できます.(編集部)

技術解説・連載「FPGAを使った数値演算回路実現の勘所」 バック・ナンバ
第1回  加算器の構成を考える
第2回  乗算器の構成を考える
第3回  浮動小数点演算器の構成を考える Part 1

 

1.IEEE 754をぶちこわせ

 FPGAで浮動小数点をうまく取り扱うための議論に入ります.ご大層な見出しをつけてしまいましたが,IEEE 754のフォーマットに従わなくても,十分浮動小数点の恩恵は受けられるのだ,という話をします.

 

●IEEE 754に従わなくてよい場合とは

 浮動小数点演算を導入する場合,「IEEE 754のフォーマットを使用するのが正しい」,あるいは「それしか使ってはいけない」と信じている人が,以外と多いようです.規格に従えば,ソフトウェア,ハードウェア,および外部システムとの協調がスムーズであることは間違いありません.しかし,作り上げようとしているシステムにとって,例えば「単精度」が精度として不足か,適正か,あるいは過剰か,という吟味を行うことは必要です.

 ソフトウェアでは規格に決められた変数の型を外して使用することはできませんが,ハードウェアは必要十分な精度を自由に表現できるわけです.精度不足は問題外ですが,過剰な精度を求めるのは無用なリソースの消費,消費電力の増加につながるので,決して良いことではありません.

 「ハードウェアとソフトウェアが違う精度で演算するのはまずいでしょ」という声が聞こえてきそうですが,ソフトウェアから与えられた単精度を,ハードウェアは低い精度で理解・演算し,フォーマットだけ単精度に戻してソフトウェアに返す,ということは可能な話です.「ハードウェアから返される値は精度が落ちている」とソフトウェアを含めたシステム全体で合意が得られるならば,このような設計でも何ら問題はないと筆者は考えています.この場合,ハードウェアは適正な精度,ソフトウェアが過剰品質気味に演算している,と理解すればよいでしょう.要は,「システムとして本当に欲しい精度はどれくらいなのか」を正しく把握していることが重要なのです.

 なお,以上の話が有効なのは,システムが有限で閉じている場合の話です.コンピュータで扱うデータのように,どこでどのように使われるか分からない場合,システムは有限であるとは言えず,当然,精度が落ちていることに対してシステムとしての合意が得られるはずはありません.このようなケースでは,今回の話は絶対に参考にしないでください(混ぜるな,危険!).ただし,筆者の経験では,この話が有効なアプリケーションというのは,意外と多いものです.

 

2.FPGAによる実現へのヒント

●浮動小数点演算は必要な部分にのみ適用する

 ここまでの説明で明らかなことですが,基本的に浮動小数点演算は固定小数点演算に比べて,かさばるものだと認識する必要があります.従って,システム上のハードウェアを全て浮動小数点演算で処理する場合,それなりのリスクを覚悟する必要があります.顕著なのは,回路規模とレイテンシの増加でしょう.浮動小数点演算が必要な部分が限られているのであれば,その部分にのみ適用するというのが賢い方法と言えます.

 また,浮動小数点演算モジュールは入出力共に共通フォーマットとなるので,標準部品として設計してしまえば,使い回しが効くことになり,大変便利です.しかし,標準モジュール内部のすべてに正規化,丸め,例外処理など,お決まりの処理が別々に入っているとしたら,無駄な感じは否めません.時にはいくつかの演算を通過してから,お決まりの後処理をまとめて行うなどの工夫も必要です.これは,FPGAに限った話ではありません.

 浮動小数点演算は,誤差を一定の範囲内に収めるための工夫がしっかり行われている分,いろいろと面倒な部分が多いものです.以下の3項目は,そのあたりで手を抜いて,(言葉は悪いが)回路規模の面などで得をしようという考え方です.荒っぽいという批判の声もありますが,けっこうな御利益があります.これも,FPGAに限った話ではないといえます.

●入力変数は正規化数のみとする

 本連載の第3回が示した四則演算の実現例では,正規化数のみを扱う前提で話を進めていますが,不正規化数を扱おうとした場合,面倒なことがいくつか起きます.その面倒さは,ただでさえ面倒な浮動小数点演算に追い打ちをかけることになります.

 システム全体で浮動小数点演算を行うとなれば,あちこちで回路リソースの増加,レイテンシの増加などが頻発するわけで,システムの質にダメージを与えかねません.そこで,正規化数のみを扱うように使用を限定するというのは,ハードウェアではよく用いられる方法です.入力側の処理に効果があるばかりか,最終的な例外処理なども軽くなるので,回路規模にやさしい方法です.

 ただし,0の取り扱いは,ほとんどのアプリケーションで求められることなのでお忘れなく.不正規化数が発生した場合,0とみなす操作が必要となります.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日