« Cosmo-Kの新基板が出来てきた | トップページ | 応用物理学会と日本物理学会の付設展示会に出展します »

2017.02.20

FPGAにおける浮動小数点の計算速度

FPGAの固定小数点の乗算であれば1クロックで動きますが、浮動小数点はどのくらいかかるのでしょうか?

以前、HLSで演算回路を作ろうとしたら、加算に11クロックかかるとかいうレポートが出てきて唖然としました。HDLで書いて、その実力を探ってみたいと思います。

sun

実験に用いた回路は下の図のようなものです。

Float_1

使ったLogiCoreは、Floating-point 5.0というもの。デバイスは、Kintex-7のXC7K160-1。浮動小数点のフォーマットは単精度です。

Float_7

設定次第で、いろいろな演算回路になります。

Float_8


作る回路は、固定小数点で入ってきたIとQを浮動小数に直して、二乗して和を取って、固定小数点に戻すというものです。これらの回路をISE14.7とCoreGenで作ります。まずはfixed→floatからです。

Float_2Float_3Float_4


レイテンシの部分を変えて、どのくらいリソース使用量が変わるかを試してみました。

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	173	58	0
6	204	78	0

fixed2floatはレイテンシを増やしてもLUTやSLICEの使用量が増えるだけで、あまり意味はありませんでした。レイテンシ1でも250MHzで動くようなので、これは1クロックでやるべきだと思います。

sun

次は浮動小数点の乗算です。この場合は同じ値の二乗を取る回路になります。結果は、

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	194	139	6    8.2ns 100MHz OK
2	152	81	6    4.4ns 200MHz OK
3	154	76	6    3.6ns 250MHz OK
6 162 64 6    3.6ns

となって、レイテンシ1以上であれば使用量はそれほど変化しないことがわかります。クロックを250MHzにしてImplementすると、タイミングエラーが出て、

   Source:               inst_fix2floatQ/blk00000065 (FF) 
   Destination:          inst_Qsq/blk00000030 (FF) 
   Requirement:          4.000ns 
   Data Path Delay:      8.165ns (Levels of Logic = 5)(Component delays alone exceeds constraint) 
   Clock Path Skew:      -0.022ns (0.702 - 0.724) 
   Source Clock:         adcclk_i_BUFGP rising at 0.000ns 
   Destination Clock:    adcclk_i_BUFGP rising at 4.000ns 
   Clock Uncertainty:    0.035ns 

となるので、レイテンシ1の回路の遅延は頑張っても8.2ns程度かかるということがわかります。

100MHzならレイテンシ1で計算できるのですが、125MHz以上ならばレイテンシ2は欲しいところです。

sun

浮動小数点で一番難しいのは、加減算だと思います。これもCoreGeneratorで作ります。

Float_5Float_6

条件をいろいろ変えて実験してみると、下のような結果となりました。

latency	LUT	SLICE	DSP  WorstTime
----------------------------------
1	183	74	2    15ns
2	213	105	2    7.8ns 100MHzOK
3	234	100	2    5.1ns
4 - - 2    4.7ns 200MHzOK
5 - - 2    3.9ns 6 215 90 2    4.8ns 250MHzOK 11 210 94 2    2.7ns

レイテンシ1では100MHzも通りません。100MHzで動作させるならレイテンシ2、200MHzで動作させるならレイテンシ4。250MHzで動作させるならレイテンシ6は必要です。

sun

回路全体の動作は下の図ようになりました。

Float_9

判明した結果をまとめると、以下のようになります。

one リソース使用量はレイテンシによってあまり変化しない。したがって、クロック速度が間に合えば、レイテンシを遅くする必要はない。

two 浮動小数点数の乗算には8.5nsほど。加算には14~15nsかかる。

three クロック100MHzならば乗算器のレイテンシは1でよく、200MHzならばレイテンシ2にする必要がある。

four 加算は遅く、14~15nsかかる。100MHzならばレイテンシ2、200MHzならばレイテンシ4、250MHzならばレイテンシ6は必要である。

five クロックを速くしてもレイテンシがかさむし、消費電力が増えるので、クロックは100~200MHzくらいがちょうどよい。

sun

なお、積和計算を行う場合は、加算の結果が出ないと積算もできないので、レイテンシが2ならばインターバルは2になります。加算の性能がシステム全体の性能に影響します。

今回はISEでやりましたが、HLSで作る場合でもツールにすべて任せるのではなく、どの程度のリソースと計算時間を使うかを頭の中で把握できていれば、高位合成でももっと良い回路が作れるようになると思います。

この成果をもとに、ある種の無線の回路を作ってみたところ、HLSだとインターバルに41クロックかかっていたのが、8クロックでできました。「この結果はここでは使わない」みたいなことが人間の頭ではわかるので、そういったことも含めての最適化なので、単純に5倍とは言えないのですが、最短のクロック数が何クロックであるかというゴールがわかるようになるので、HLSのディレクティブを指定するときにもやりがいが出るのではないかと思います。

これで、私も浮動小数点デビューできそうです。

|

« Cosmo-Kの新基板が出来てきた | トップページ | 応用物理学会と日本物理学会の付設展示会に出展します »

コメント

コメントを書く



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


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



« Cosmo-Kの新基板が出来てきた | トップページ | 応用物理学会と日本物理学会の付設展示会に出展します »