FC2カウンター FPGAの部屋 AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)

AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)”の続き。

(2018/04/26 : 修正、バグフィックス)

前回は、AXI4-Stream インターフェースの各層をつないだ AXI4-Stream インターフェースの畳み込みニューラルネットワークの概要を説明した。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。

最初に、”AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)”で示したAXI4-Stream インターフェースの畳み込みニューラルネットワークのハードウェア化関数が書かれている all_layers.cpp は最終形なので、そこから DATAFLOW 指示子をコメントアウトする。これで C コードの合成を行ったが、エラーになった。
all_layers_7_180316.png

エラー内容の最初の 1 個を示す。

ERROR: [XFORM 203-733] An internal stream 'outs_conv_layer.V.data.data0.V' (all_layers/all_layers.cpp:42) with default size is used in a non-dataflow region, which may result in deadlock. Please consider to resize the stream using the directive 'set_directive_stream' or the 'HLS stream' pragma.


結局、各層の実行が1つの関数が実行を終了するまでブロックされるので、ストリームのバッファサイズを指定する必要があるようだ。そこで、コメントアウトされていた STREAM 指示子を生かそう。これらは、その層で出力されるデータのサイズを指定してある。
all_layers_8_180316.png

これで、C コードの合成を行った。今度はエラー無しでコンパイルすることができた。結果を示す。
all_layers_9_180316.png

Estmated は 9.40 ns だった。ただし、Uncertainty は 3.00 ns にしてある。これは、Estmated がタイミング制約をオーバーしてしまったからである。
Latency は 10065 クロックで、100 MHz で動作した場合には、100.66 us となる。
リソース使用量は、BRAM_18K は 28 個、DSP48E も 28 個となった。FF は 5235 個、LUT は 9215 個となった。

さて、この状態では、各層がオーバーラップしていないので、DATAFLOW 指示子を生かしてみよう。各層がオーバーラップ動作するので、STREAM 指示子は無くても動作できるためコメントアウトした。
all_layers_10_180316.png

これで、C コードの合成を行った。結果を示す。
all_layers_11_180316.png

Latency は 9626 クロックで、100 MHz で動作した場合には、96.27 us となる。Interval は 8427 クロックで、これは affine_layer1 とほぼ同じクロック数となる。
現在、白線間を走行するロボットカーで使用している畳み込みニューラルネットワークのLatency は 194433 クロックだったので、100 MHz で動作しているためレイテンシは約 1.94 ms だった。今回の AXI4-Stream インターフェースの畳み込みニューラルネットワークの Latency は 9627 クロックだったので、194433 / 9627 ≒ 20.2 倍の性能向上となった。ただし、現在使用している畳み込みニューラルネットワークは、最初に画像を切り取る機能があるので、AXI4-Stream インターフェースの畳み込みニューラルネットワークをそれに対応させると多少の性能低下はあると思う。
リソース使用量は、STREAM 指示子をコメントアウトして、DATAFLOW 指示子を付ける前よりもBRAM_18K の使用量が半分になった。これは、STREAM 指示子でのバッファが無くなったためだと思われる。FF は 4613 個、LUT は 6999 個でいずれも減っているのが分かる。

Export RTL を行った。結果を示す。
なお、Vivado synthesis, place and route にチェックを入れてある。
all_layers_12_180316.png

LUT は 1874 個、FF は 2280 個使用している。DSP は 28 個、BRAM は 14 個で合成の時と同じ数になった。
CP achieved post-implementation は、8.661 ns で問題無さそうだ。
  1. 2018年03月16日 04:20 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/4108-7c2de307
この記事にトラックバックする(FC2ブログユーザー)