FC2カウンター FPGAの部屋 2018年05月16日

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

FPGAの部屋

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

テンプレートで書いた畳み込みニューラルネットワーク2(C シミュレーションとC コードの合成)

テンプレートで書いた畳み込みニューラルネットワーク1(ソースコード)”の続き。

前回は、テンプレートで書いた各層をつないで、畳み込みニューラルネットワーク(CNN)を構築するためのソースコードを貼った。今回は、そのソースコードを使用して、Vivado HLSのプロジェクト all_layers_template を作成して、C シミュレーションと C コードの合成を行う。

やはり、C シミュレーションがうまく行かないので、OS をWindows 10 から Ubuntu 16.04 に変更して、Vivado HLS 2017.3 (Ubuntu 16.04 のマシンにVivado 2017.4 がインストールされていなかったので) のプロジェクト all_layers_template を作成した。なお、float で演算する soft の関数は、以前と同じだ。
template_cnn_31_180515.png

テストベンチのファイルを示す。
template_cnn_32_180515.png

次に C シミュレーションを行うが、同じ精度のCNN のC シミュレーションは”AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”でやっているので、これを参考にする。

最初に#include

"curve_data_0_100.h"

つまり、0 番目から 300 番目の白線画像でやってみた。
template_cnn_33_180515.png

hw_err_cnt = 8 sw_err_cnt = 20

の内の hw_err_cnt がハードウェア化関数でのエラーの数を表す。sw_err_cnt が float で実装したソフトウェアのエラーの数を示す。今回はハードウェアのエラーが 8 個で、ソフトウェアのエラーが 20 個だった。これは、”AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”でのエラー数と同じだ。

次に、

#include "curve_data_2500_2600.h"

の 2500 番目から 2800 番目の白線画像でやってみた。結果を示す。
template_cnn_34_180515.png

hw_err_cnt = 14 sw_err_cnt = 11

で、ハードウェアが 14 個、ソフトウェアが 11 個間違った。これも”AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”でのエラー数と同じだ。

最後に、

#include "curve_data_5000_5100.h"

で C シミュレーションを行った。結果を示す。
template_cnn_35_180515.png

hw_err_cnt = 46 sw_err_cnt = 15

で、エラー数はハードウェアが 37 個、ソフトウェアが 15 個だった。やはり、ハードウェアのエラー数が多くなっている。これも”AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”でのエラー数と同じで、すべての C シミュレーションにおいてエラー数が同一なので、同じCNN と言えると思う。

AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”と同様だが精度の計算を載せておく。
まずは、ハードウェアで、300 + 300 + 300 = 900 個の画像をテストして、8 + 14 + 46 = 68 個エラーがあったので、
(900 - 68) / 900 * 100 ≒ 92.4 % となった。

ソフトウェアは、300 + 300 + 300 = 900 個の画像をテストして、20 + 11 + 15 = 46 個エラーがあったので、
(900 - 46) / 900 * 100 ≒ 94.9 % となった。

C コードの合成を行った。結果を示す。
template_cnn_36_180515.png
template_cnn_37_180515.png

Estmated は9.40 ns だが、Uncertainty を 3 ns に指定している。
Latency は min が 8538 クロックで、max が 8696 クロックだった。Interval は min が 8507 クロックで、max が 8663 クロックだった。
リソース使用量は、BRAM_18K が 15 個、DSP48E が 29 個、FF が 4813 個、LUT が 7306 個だった。

AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)”の最後の合成結果を示す。
all_layers_11_180316.png

今回の C コードの合成結果と比較してみよう。
Latency は 9627 クロックなので、今回の結果の方が短かった。一方、Interval は 8427 クロックで、今回よりも少ないクロックとなっている。
リソース使用量は、いずれも今回よりも少ないリソース使用量となっている。
  1. 2018年05月16日 04:30 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0