FC2カウンター FPGAの部屋 AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)
FC2ブログ

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

FPGAの部屋

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

AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)

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

(2018/04/22 : 修正、max_pooling.cpp のコードにバグがあったのでバグフィックスし、精度に影響を与えたため修正した)
(2018/04/26 : 修正、バグフィックス)

前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークの C シミュレーションと C/RTL 協調シミュレーションを行う。

まずは、C シミュレーションから行こう。
まずは、最初の

#include "curve_data_0_100.h"

つまり、0 番目から 300 番目の白線画像でやってみた。結果はエラーになった。
all_layers_20_180317.png

エラー内容は、

cc1plus.exe: out of memory allocating 16008 bytes

なので、Linux のVivado HLS 2017.3 でやってみることにした。
もう一度、Linux 版のVivado HLS 2017.3 で C シミュレーションを行った。
今度は成功した。結果を示す。
all_layers_17_180316.png

hw_err_cnt = 8 sw_err_cnt = 20

の内の hw_err_cnt がハードウェア化関数でのエラーの数を表す。sw_err_cnt が float で実装したソフトウェアのエラーの数を示す。今回はハードウェアのエラーが 8 個で、ソフトウェアのエラーが 20 個だった。思いがけなくソフトウェアのエラー数が多かった。

次に、

#include "curve_data_2500_2600.h"

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

hw_err_cnt = 29 sw_err_cnt = 11

hw_err_cnt = 14 sw_err_cnt = 11

で、ハードウェアが 14 個、ソフトウェアが 11 個間違った。

今度は、

#include "curve_data_5000_5100.h"

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

hw_err_cnt = 37 sw_err_cnt = 15

hw_err_cnt = 46 sw_err_cnt = 15

で、エラー数はハードウェアが 37 個、ソフトウェアが 15 個だった。やはり、ハードウェアのエラー数が多くなっている。

ここまでの精度を計算してみよう。
まずは、ハードウェアで、300 + 300 + 300 = 900 個の画像をテストして、12 + 29 + 37 = 78 個エラーがあったので、
(900 - 78) / 900 * 100 ≒ 91.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/RTL 協調シミュレーションを行うのだが、300 個のデータを実行するのは大変だ。と言う訳で、テストベンチの C ソースコードの

#define NUM_ITERATIONS 300

をコメントアウトして、

#define NUM_ITERATIONS 2

を生かした。
all_layers_16_180316.png

これで、C/RTL 協調シミュレーションを行った。結果を示す。
all_layers_13_180316.png

Latency は min が 9016 クロックで、avg が 9035 クロック、max が 9054 クロックだった。Interval は 8979 クロックだった。この結果は、C コードの合成と異なる結果になっている。合成では、Latency は 9626 クロックとなっていたので、C/RTL 協調シミュレーションでは短くなっている。

C/RTL 協調シミュレーションの波形を示す。
まずは、全体波形から。
all_layers_14_180316.png

2番目の処理の実行時間は89.54 us だった。

2番目の初めの処理を拡大してみよう。
all_layers_15_180316.png

初めは、順調にAXI4-Stream でデータを受け取れているが、定常状態になった後は、転送の間隔は 1.08 us となった。転送時間は 0.2 us だったので、転送の効率は 1/54 だった。
  1. 2018年03月17日 07:17 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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