”
AXI4-Stream インターフェースの畳み込みニューラルネットワーク4(ビット幅の変更)”の続き。
(2018/04/22 : 修正、max_pooling.cpp のコードにバグがあったのでバグフィックスし、精度に影響を与えたため修正した)(2018/04/27 : 修正、バグフィックス)前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのビット幅を変更したときの変化を確認した。今回は、量子化モード、オーバーフローモードを変更した場合の精度とリソース使用量の違いを見ていこう。
Linux で all_layers3 プロジェクトを作成した。all_layers2 の全ファイルをコピーして、すべての量子化モードとオーバーフローモードをAP_TRN, AP_WARP から AP_TRN_ZERO, AP_SAT に変更した。

最初に、#include
"curve_data_0_100.h"
だけを生かしてC シミュレーションを行った。

エラーの数は、ハードウェア化関数が 12 個、float のソフトウェアが 20 個だった。
hw_err_cnt = 12 sw_err_cnt = 20
エラーの数は、ハードウェア化関数が 5 個、float のソフトウェアが 20 個だった。
hw_err_cnt = 5 sw_err_cnt = 20
#include "curve_data_2500_2600.h"
を生かして、C シミュレーションを行った。

エラーの数は、ハードウェア化関数が 29 個、float のソフトウェアが 11 個だった。
hw_err_cnt = 29 sw_err_cnt = 11
エラーの数は、ハードウェア化関数が 16 個、float のソフトウェアが 11 個だった。
hw_err_cnt = 16 sw_err_cnt = 11
#include "curve_data_5000_5100.h"
を生かして、C シミュレーションを行った。

エラーの数は、ハードウェア化関数が 34 個、float のソフトウェアが 15 個だった。
hw_err_cnt = 34 sw_err_cnt = 15
エラーの数は、ハードウェア化関数が 44 個、float のソフトウェアが 15 個だった。
hw_err_cnt = 44 sw_err_cnt = 15
ハードウェア化関数の推論の精度は (900 - (5 + 16 + 44)) / 900 ≒ 92.8 % だった。少し上がっている。
ソフトウェアでの推論の精度は、(900 - (20 + 11 + 15)) / 900 ≒ 94.9 % だった。
C コードの合成を行った。結果を示す。


Latency は 9799 クロックで、前回は 9627 クロックだったので長くなっている。Interval も 8583 クロックで、前回は 8427 クロックだったので、やはり、長くなっている。
リソース使用量は、BRAM_18K は 14 個で変化なし、DSP48E は 7 個で 28 個から大幅に減少した。FF は 6171 個で、4259 個から増加。LUT は 16947 個で、7046 個の 2.41 倍程度になってしまった。
やはり、オーバーフローモードで飽和を選ぶとリソース使用量が多いようだ。(追記:リソース使用量が多いかどうかは分からないが、飽和演算のためか?演算器がDSPからLUT にアサインされるのではないだろうか?)LUT を消費しないためには、演算がオーバーフローしないようにビット幅を選んで、もし、飽和演算したかったら、最後の1つだけ飽和演算した方が良さそうだ。
- 2018年03月19日 04:10 |
- DNN
-
| トラックバック:0
-
| コメント:0