作成した浮動小数点演算ライブラリの整理
作成した浮動小数点演算ライブラリを整理してみました。
XILINXのIP使えば済む話ではあるのですが、
・低精度でいいけど高速な逆数計算が欲しかった(本命)
・非正規化数とか例外とか不要なのでコンパクトにしたい
・IPコア使うと veritak とかでのシミュレーションが面倒
とかしょうも無い理由で、ある程度必要なものを書いて見ました。
デバッグ目的の投影変換もまあまあ動いているのでまずは良しとしましょう。
xc7z010-1clg400 指定で、デフォルトオプション ISE14.7 で合成のみ実行しています。
ここだけ合成のみで周波数見積もりしてくれて便利なISEを利用しています。
[reciprocal 64点補間] (Distributed RAM)
latency:6 throughput:1
Maximum Frequency 479.157MHz
Number of Slice Registers 315
Number of Slice LUTs 133
Number of DSP48E1s 1
[reciprocal 1024点補間] (Block RAM)
latency:6 throughput:1
Maximum Frequency 479.157MHz
Number of Slice Registers 225
Number of Slice LUTs 92
Number of Block RAM/FIFO 2
Number of DSP48E1s 1
[multiply 指数部:8bit 仮数部:23bit (単精度相当)]
latency:6 throughput:1
Maximum Frequency 394.633MHz
Number of Slice Registers 201
Number of Slice LUTs 110
Number of DSP48E1s 2
[add 指数部:8bit 仮数部:23bit (単精度相当)]
latency:7 throughput:1
Maximum Frequency 397.456MHz
Number of Slice Registers 386
Number of Slice LUTs 399
[fixed_to_float 32bit整数 => 単精度]
latency:4 throughput:1
Maximum Frequency 397.456MHz
Number of Slice Registers 221
Number of Slice LUTs 583
[float_to_fixed 単精度 => 32bit整数]
latency:4 throughput:1
Maximum Frequency 430.293MHz
Number of Slice Registers 177
Number of Slice LUTs 215
簡易逆数計算の reciprocal 以外あまりメリット無い気もしますが、いい勉強にはなりました。
やはり、加減算や整数変換などバレルシフタの必要な系がレイテンシ長くなりがちです。
valid ready のハンドシェークで、バブル埋め出来るようにしたりとかしょうも無い機構で1段余分に食っていたりもします。
ただ、例外処理や非正規化数の扱いをまじめにやるとそこが段数増える要因にもなるので今回そこを省いたのは効果大きかった気がします。
もともとGPU的なものを考えるときに、ラスタライザの中の投影補正は毎サイクルなのでスループットさえ1なら、レイテンシ長くていいのですが、頂点シェーダー部分となるとピイ九セル処理より稼働率低いので、演算器の共有がやりたくなるのでレイテンシ短くしたいわけです。
一応、次のステップ狙って、周波数は高めに合成できるように作ったつもりですが、次はいつになるやら。
例によって、コードはgithubにて
https://github.com/ryuz/jelly/
[2016.05.04追記]
XILINX の IP の reciprocal で 半精度浮動小数点の逆数が max latency 4 cycle ですね。
前からありましたっけ? (^^;; 完全に見落としていました。
ちょっと別件でアンインストールせずに残していた Vivado2014.4.1 (Floating-point 7.0)では Single と Double しか選べない(Customも無し)なので、ここ数年の間に増えた機能みたいですね。
ディープラーニングでGPUなどの半精度浮動小数の需要が増えているらしいですが、FPGAでもこのあたり引き続き充実してくると嬉しいですね。
そういえば確か GRAPE-1 でも 64k×8bit のROM をいくつか使って、8bit 精度の演算をLUT方式で巧みに計算されていたと何かの本で読んだ記憶があります。
用途と精度をあわせることは重要ですね。
« ZYBOで射影変換をやってみた | トップページ | ZyboでSobelフィルタ »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント