高位合成について思ったこと
最近、高位合成が流行っているようなので、自社でも取り入れてみたいと思い、Vivado HLSなどを少し試していました。
物理学の計算に出てくるような式をお客様サイドでFPGAに落とし込めるように・・と思っていたからです。
でも、いくつかサンプル回路を作ってみてもなかなか思いどおりの回路になりません。
いろいろ実験してわかってきたことは、
- C言語で書いた回路は、原則として1行(あるいは1つの処理)を1クロックで実行する
- 入力Aを出力Bに出すだけでも3クロックかかったりする
- pragma文を書くことでループが展開されたり少しだけマシになったりする
高位合成って使えないなーと思っていたのですが、FPGAマガジンを読んでようやくわかりました。
つまるところ、高位合成というのは、C言語で書いたプログラムを効率のよい回路に落とし込んでくれる魔法のツールじゃないということです。
効率の良い回路(速くてコンパクトな回路)になるかどうかは、人間が最適化しなければならない。いや、最適化というよりは粒度の大きな設計は人間がやらなければならない。このことは20年前から何も変わっていない、というわけです。
FPGAマガジンではJPEGデコードの例が書かれていましたが、データの全体を読んでからじゃないと処理が始められないもの(逐次処理でないもの)はソフトウェアをそのままFPGAにしても速くならないよということでした。
ハードウェア化するということは、各部が並列に動くから早そうだけど、メモリがあまり使えないから全体の設計を見直さなければならない。設計の一番根幹になる部分を自動的にツールが考えてくれるわけじゃないので、全部、人間が作り直して(そして全部テストをやりなおして)という羽目になります。
これが高位合成が今まで流行らなかった一番の原因のようです。
ただ、最近は事情が変わってきて、
- CPUの拡張命令をFPGA部分で実装する
- シーケンサのように遅くてもよい部分を作る
という需要が出てきたようです。JPEGのデコードとは違いデータの処理順序や全体設計を大きく変えるようなことはなく、与えられた入力を逐次処理すればいいから、高位合成の使いどころとなるということです。
なるほど、Vivado HLSはシステム全体をC言語で書くのではなく、こういう部分を書くために使えばよいのですね。
Vivado HLSが吐き出した回路は遅いのですが、クロックサイクルを隠ぺいするといって、ユーザは何クロックかかって出てくるかを気にしてはいけないそうなので、遅いことを責められません。
私はRTLで書くのが好きです。HLSに移行しなければならないのか・・と思っていましたが、FPGAマガジンを読んだ結果、RTLがなくなることは永遠にないだろう、と安心することができました。
1クロック単位で最適化されたパイプラインな回路はRTLじゃなきゃ書けないし、システム全体の構成を決めるのは人間がやらなければならないので、しばらくは仕事がなくなることはないでしょう。
最近のコメント