FPGAにおける浮動小数点の計算速度
FPGAの固定小数点の乗算であれば1クロックで動きますが、浮動小数点はどのくらいかかるのでしょうか?
以前、HLSで演算回路を作ろうとしたら、加算に11クロックかかるとかいうレポートが出てきて唖然としました。HDLで書いて、その実力を探ってみたいと思います。
実験に用いた回路は下の図のようなものです。
使ったLogiCoreは、Floating-point 5.0というもの。デバイスは、Kintex-7のXC7K160-1。浮動小数点のフォーマットは単精度です。
作る回路は、固定小数点で入ってきたIとQを浮動小数に直して、二乗して和を取って、固定小数点に戻すというものです。これらの回路をISE14.7とCoreGenで作ります。まずはfixed→floatからです。
レイテンシの部分を変えて、どのくらいリソース使用量が変わるかを試してみました。
latency LUT SLICE DSP WorstTime ---------------------------------- 1 173 58 0 6 204 78 0
fixed2floatはレイテンシを増やしてもLUTやSLICEの使用量が増えるだけで、あまり意味はありませんでした。レイテンシ1でも250MHzで動くようなので、これは1クロックでやるべきだと思います。
次は浮動小数点の乗算です。この場合は同じ値の二乗を取る回路になります。結果は、
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は欲しいところです。
浮動小数点で一番難しいのは、加減算だと思います。これもCoreGeneratorで作ります。
条件をいろいろ変えて実験してみると、下のような結果となりました。
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は必要です。
回路全体の動作は下の図ようになりました。
判明した結果をまとめると、以下のようになります。
リソース使用量はレイテンシによってあまり変化しない。したがって、クロック速度が間に合えば、レイテンシを遅くする必要はない。
浮動小数点数の乗算には8.5nsほど。加算には14~15nsかかる。
クロック100MHzならば乗算器のレイテンシは1でよく、200MHzならばレイテンシ2にする必要がある。
加算は遅く、14~15nsかかる。100MHzならばレイテンシ2、200MHzならばレイテンシ4、250MHzならばレイテンシ6は必要である。
クロックを速くしてもレイテンシがかさむし、消費電力が増えるので、クロックは100~200MHzくらいがちょうどよい。
なお、積和計算を行う場合は、加算の結果が出ないと積算もできないので、レイテンシが2ならばインターバルは2になります。加算の性能がシステム全体の性能に影響します。
今回はISEでやりましたが、HLSで作る場合でもツールにすべて任せるのではなく、どの程度のリソースと計算時間を使うかを頭の中で把握できていれば、高位合成でももっと良い回路が作れるようになると思います。
この成果をもとに、ある種の無線の回路を作ってみたところ、HLSだとインターバルに41クロックかかっていたのが、8クロックでできました。「この結果はここでは使わない」みたいなことが人間の頭ではわかるので、そういったことも含めての最適化なので、単純に5倍とは言えないのですが、最短のクロック数が何クロックであるかというゴールがわかるようになるので、HLSのディレクティブを指定するときにもやりがいが出るのではないかと思います。
これで、私も浮動小数点デビューできそうです。
最近のコメント