Xilinx の FINN を利用した量子化ニューラルネットワーク(QNN)のハードウェア・アクセラレーション用のHLSライブラリが finn-hlslib のようだ。 finn-hlslib をやってみようと思う。

最初に finn-hlslib を git clone をして、 finn-hls/tb ディレクトリに cd する。
git clone https://github.com/Xilinx/finn-hlslib.git
cd finn-hls
cd tb

0d87b238.png


gen_weights.py を起動して、 config.h と memdata.h を生成した。
python3 gen_weights.py
3265229d.png


FINN_HLS_ROOT 環境変数に finn-hlslib のルートディレクトリを設定した。
export FINN_HLS_ROOT=/media/masaaki/Ubuntu_Disk/Xilinx_github/finn-hlslib

試しに test_add.tcl を起動した。
vivado_hls test_add.tcl
4f48d141.png

120749ef.png


C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーションを行った。
hls-syn-add ディレクトリが生成されて、Vivado HLS のプロジェクトが生成されていた。
c1215868.png


vivado_hls &
で Vivado HLS 2019.2 を起動して、hls-syn-add ディレクトリのプロジェクトを読み込んだ。
86121282.png


波形を見るために C/RTL 協調シミュレーション時に Dump Trace を all に変更して、実行した。
e427699a.png


Latency は 10 クロックだった。

波形を見てみよう。
380ef7bc.png


4 つの出力をしているようだ。

hls-syn-add プロジェクトは何をしているのか?だが、 add_top.cpp を見ると AddStreams_Batch() 関数が実行されている。
AddStreams_Batch() 関数は Resnet-50 でストリームを加算する関数のようだ。
これからソースコードのキャプチャ画面を引用します。
1cf76c30.png


AddStreams_Batch() 関数は streamtools.h に記述されている。
7b5b9578.png


typename で型を定義しているようだ。このように型を定義できるの良いな。。。知らなかった。使おう。。。

AddStreams_Batch() 関数からは、 Add_Streams() 関数が呼ばれている。
7b5b9578.png


AddStreams() 関数では、ビット・フィールド毎(チャネル毎)に offset を加えて加算しているようだ。offset は 2 になっている。
d9c1034c.png


最後に C コードの合成結果を貼っておく。
8ec82a77.png