« Cosmo-Zが32chで安定して動作するようになった | トップページ | 超高速のFFT回路 »

2015.09.27

高位合成について思ったこと

最近、高位合成が流行っているようなので、自社でも取り入れてみたいと思い、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じゃなきゃ書けないし、システム全体の構成を決めるのは人間がやらなければならないので、しばらくは仕事がなくなることはないでしょう。

|

« Cosmo-Zが32chで安定して動作するようになった | トップページ | 超高速のFFT回路 »

コメント

私もHDLが無くなることはないと思います。
Vivado HLSは新しいハードウェア言語として使っています。
Vivado HLSではアルゴリズムをAXI4-Stream IPに落として、DMAはXilinxのDMA IPを使ったほうが良いと思います。性能を追求するならば。

また、気楽にAXI4-Master IPも書けるので、楽です。性能はCの書き方やディレクティブでなんとでもなります。
ラプラシアンフィルタでの性能のまとめです。
http://marsee101.blog19.fc2.com/blog-entry-3120.html

Vivado HLSではクロックの周期を設定しますが、デフォルトでは10nsです。これを2.5nsにしても合成できた時はびっくりしました。Vivadoで実際にインプリできるかどうかは怪しいですけど。

投稿: marsee | 2015.09.28 09:36

ディレクティブで性能が変わるのはわかりますが、作りたいのは1クロック単位でキリキリ動くパイプラインです。

高速ADCからのデータをサンプリングレートで連続して65536ポイントFFTするという案件があって、BRAMに入らないからDDR3にデータをいれなければならない。160MHz以上で休む間もなくバタフライ演算をすれば間に合う計算になるのですが、結局は手作業でタイミングチャートを考えてRTLでDSP48Eに落とし込んでいます。

別の案件では、1000行1000列の行列を10us以内で計算する回路をVivado HLSでつくろうとしたけど、合成できませんでした。頭の中ではできるのですが。

やはりこういった仕事は手作業とRTLでやるしかないな、と。

投稿: なひたふ | 2015.09.29 09:17

>高速ADCからのデータをサンプリングレートで連続して65536ポイントFFTするという案件があって、BRAMに入らないからDDR3にデータをいれなければならない。160MHz以上で休む間もなくバタフライ演算をすれば間に合う計算になるのですが、結局は手作業でタイミングチャートを考えてRTLでDSP48Eに落とし込んでいます。

これはVivado HLSで行ける気がしますが、今のところツールの挙動がわからないところがあるので、不確定です。Vivado HLS 2015.2よりも2014.4の方が良いかもしれません。

>別の案件では、1000行1000列の行列を10us以内で計算する回路をVivado HLSでつくろうとしたけど、合成できませんでした。頭の中ではできるのですが。

こっちは厳しいですね。100MHzで演算しても1要素の演算が10msですね。
並列に演算する必要がありますね。1000並列となると厳しい気がします。

投稿: marsee | 2015.09.29 10:18

HDL はなくならないけど、高位合成は”はやる”と思います。分野が違う気がします。よくソフトウェアとの対比で今どきアセンブラでプログラムを書く人はいないといいますが、その対比にはうそがあります。HDL はアセンブラではない。本質的に必要な情報が高位合成(Cライクな高級言語)では抜けているのでどうやっても正確に HDL には落ちません。
その上、アセンブラがわからないプログラマはだめだめなので、HDL をわからない高位合成プログラマはFPGAのデバッグができないと思います。
ただ、アセンブラを知らなくても OpenCV などで結果を出している人も出始めているのを見ると、高位合成を使って ハードもHDL も知らない人が結果を出すのではないかと思っていて、侮れないとは思っています。
なんとなく分野が違うのかなという感じです。
高速信号線を調べていたらここに行きついたとおりすがりの者でした。

投稿: りょうす | 2015.10.22 11:34

私も、いずれは高級言語による開発が流行ると思いますし、そういうツールを使えるようになりたい。

それに、当社のお客様は電気電子系ではない分野の研究者であることが多いので、そのアルゴリズムの実現にC言語でFPGAが作れたらとても良いんです。
だから、そういう環境が整うことを待ち望んでいます。

投稿: なひたふ | 2015.10.23 12:03

まだESのESのESくらいのレベルですが Python から Verilog を作るプログラムを作ってみました(手前味噌ですいません)。この程度ならすぐに誰にでも追いつかれそうですが、デバッグ環境が充実してくると違うかもしれません。本当は Lisp(Scheme) で実現したい、、、

投稿: りょうす | 2015.10.23 12:35

コメントを書く



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




« Cosmo-Zが32chで安定して動作するようになった | トップページ | 超高速のFFT回路 »