« ZYBOで射影変換をやってみた | トップページ | ZyboでSobelフィルタ »

2016年5月 3日 (火)

作成した浮動小数点演算ライブラリの整理

作成した浮動小数点演算ライブラリを整理してみました。

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」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 作成した浮動小数点演算ライブラリの整理:

« ZYBOで射影変換をやってみた | トップページ | ZyboでSobelフィルタ »