今まで、ソフトウェアでも動作するCソースコードをハードウェアにオフロードしてアクセラレーションするということをやってきた。
ある程度は、アクセラレーションできたが、まだ 60fps のフレームレートに届かなかった。それは、AXI4 Master のバースト・アクセスをするmemcpy()関数が、後に続くラプラシアンフィルタ処理とオーバーラップできていないのが原因だと考えられる。これが実現できないと、これ以上の性能向上は望めない。
さて、Vivado HLS は60fps でのラプラシアンフィルタ処理はできないのか?と言うとそうではなくて、AXI4-Stream を使用する手段がある。むしろこちらのほうが本命なのだと思う。
なぜ本命なのか?というと、AXI4-Streamでは、DMAエンジンはXilinx社のVDMAやAXI_DMAを使って、AXI4-Stream出力を受けてラプラシアンフィルタ処理を行い、AXI4-Streamで出力してまたDMAでメモリにWriteするという構造になる。今までのAXI4-Master 版では、DMAエンジンごとCソースコードで書いていたが、今度はDMAエンジンは専用IPに任せて、ラプラシアンフィルタのアルゴリズム部分だけVivado HLS の高位合成で行うということになる。つまり、AXI4-Master 版でボトルネックになっていたmemcpy() はなくなるので、すべての処理を(たぶん)PIPELINE化できるということになる。
今までAXI4-Master 版のラプラシアンフィルタでは、メモリ・ベースで入出力を行ってきた(ソフトウェアはそうなので、それをハードウェアにしてもそうなる)が、これは、メモリの帯域をそれだけ使用してしまうことになる。これは、メモリ帯域がきつい4K2Kなどの高解像度の画像ではとっても大変だ。そこで、普通にハードウェアを作ってもそうだが、カメラからの入力ピクセルデータのストリームか、ディスプレイへの出力ピクセルデータのストリーム、どちらかに、ストリームでのフィルタ処理(入れることができれば?だが)を入れるのが一般的である。よって、通常はストリーム入出力 でラプラシアンフィルタ処理IP を作るのが一般的なのだ。これらの処理ではメモリからReadしてメモリにWriteしていないので、メモリ帯域を使用していない。
そこまでわかっているのに、私がなぜAXI4-Master でのラプラシアンフィルタ処理にこだわったかというと、ソフトウェアで動作するそのままで、ハードウェアにして性能向上を図ってみたいという1点に尽きる。残念ながら 60fps での実行は無理だったが、
tu1978 さんに教えて頂いたCソースコードでは、20 ms つまり、50 fps まで行けたのだった。
次からは、AXI4-Stream でのフィルタの作り方を勉強していこう。これからは、Cソースコードというソフトウェアの書き方ではなく、例えば、シフトレジスタになるCやC++の記述を書いていくことになる。つまり、AXI4-Master では、どういう形のハードウェアなるのか?ということに思いを馳せても、ソフトウェアとして書いてきたが、AXI4-Streamでは、クロックによる遅延素子のレジスタを意識して書くことになるので、HDLを書いていることになるはずである。
と、ここまで書いて、1つやり残していることを忘れていた。今までラプラシアンフィルタを1回のみ実行していたのだが、Vivado HLS には連続実行する設定があるので、50 fps で連続してラプラシアンフィルタ処理をすることができるはずなのだ。それをやってからAXI4-Stream に移ろうと思う。
- 2015年04月19日 04:59 |
- Vivado HLS
-
| トラックバック:0
-
| コメント:2
ストリーミングの処理にしても以下の文書を読むと、画像入力 ⇒ 画像処理 ⇒ 画像出力 の流れが
画素ごとに行われさえすれば、あまりクロックタイミングとかにこだわる必要はなさそうです。
(オリジナルのラプラシアンフィルタのCソースが画素ごとではなくラインごとに処理していたというのはありますが)
http://japan.xilinx.com/support/documentation/application_notes/j_xapp793-memory-structures-video-vivado-hls.pdf
"Vivado HLS ツールを使用したビデオ処理用メモリ構造のインプリメント"
http://ens.ewi.tudelft.nl/Education/courses/et4351/index.php
http://ens.ewi.tudelft.nl/Education/courses/et4351/Median.pdf
"Median Filter and Sorting Network for Video Processing with Vivado HLS"
この、サンプルを読むと
画像をStreaming DataとしてLine Buffer[n][横幅]に入力して、溜まったところで
WindowsBuffer(n×n)で処理して、Streaming Dataとして出力するとVivado HLSが
合成してくれるようです。
FIFO(StreamingData)がよくわからないけど、過去のこちらの記事でカメラからの
データ取込みでFIFOの設定をしてましたし、カメラの画素データを直接FIFOに
繋げられれば、メモリ帯域の圧迫もなくなりそうです。
- 2015/04/22(水) 10:05:31 |
- URL |
- おる #mQop/nM.
- [ 編集 ]
おるさん、こんにちは。
その通りだと思います。
1画素を処理するのに画像に合わせたクロックレートで処理出来る必要があると思います。
XAPP793は私も参照しています。
今からVivado HLSでのパイプラインを考えながら、シフトレジスタの記述からやっていこうと思っています。C++のソースコードもできていますが、今のところ横道にそれています。明日からAXI4-Streamに復帰します。
- 2015/04/22(水) 10:22:01 |
- URL |
- marsee #f1oWVgn2
- [ 編集 ]