前回のブログの最後で、

固定小数点を使うと、浮動小数点演算に比べてFPGA上で消費するリソース数が少なくなります。結果として他のロジックを追加したり、さらなる最適化を適用してスループットを上げることができます。

というコメントを書きました。

お陰様で前回のブログ記事に対していくつか質問をいただくことがあり、その中に「固定小数点を使ったらどれぐらい効果があるのですか?」という質問がありました。そこで今回は、対象となるアルゴリズムを固定小数点に変えた場合、リソースの占有率(Utilization)がどのように変化するか見てみましょう。

前回同様、Halide で記述された3×3 のconvolutionのコードを用意し、3×3 カーネルの変数を、

  1. 32bit 浮動小数点(Float)
  2. 32bit 固定小数点(Fixed32bit)
  3. 16bit 固定小数点(Fixed16bit)

の3つのバージョンに分けて、Genesis + Xilinx HLS でビルドしました。Xilinx HLS コンパイラの合成結果(C Synthesis) のレポートをまとめたものが下図です。

Utilization Estimates

FPGAのリソースには、BRAM_18K(18Kbit ブロックRAM), DSP48E(48bit アキュムレータを持つデジタル信号処理ユニット), FF(フリップフロップ), LUT(ルックアップテーブル) があります。BRAM に関してはどのバージョンでもほとんど使用していなかったので、省略しています。FPGAを構成する各リソースについては、National Instruments のこちらの記事が詳しいです。

ご覧の通り、FFとLUT は、固定小数点化により使用率を劇的に下げることができています。和積演算そのものをになうDSPに関しては、同じbit数(32bit) では使用率にそれほどの差はありませんが、もし精度を半分(16bit) にできるのであれば、使用率を16%まで下げることができます。

対象としている小型の開発用ボードであるAvnet Zedboard (Xilinx Zynq XC7Z020-CLG484-1) では、浮動小数点演算を使っている限り、Convolution 関数のみを載せるので精一杯です。。。
しかし、もし固定小数点演算に変えられるのであれば、リソースに余裕が生まれ、Convolution 演算の前後に色変換や拡大・縮小など、別の処理をつなぐことで、より高機能な画像処理エンジンを作ることが可能です。このサイトでは、2次元画像処理でよく使われる基本的なアルゴリズムをライブラリとして公開しています。固定小数点演算を上手くつかって、これらの画像処理ライブラリを組み合わせ、自分だけの専用画処理チップを完成させて下さい!

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です