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
gen_weights.py を起動して、 config.h と memdata.h を生成した。
python3 gen_weights.py
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
C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーションを行った。
hls-syn-add ディレクトリが生成されて、Vivado HLS のプロジェクトが生成されていた。
vivado_hls &
で Vivado HLS 2019.2 を起動して、hls-syn-add ディレクトリのプロジェクトを読み込んだ。
波形を見るために C/RTL 協調シミュレーション時に Dump Trace を all に変更して、実行した。
Latency は 10 クロックだった。
波形を見てみよう。
4 つの出力をしているようだ。
hls-syn-add プロジェクトは何をしているのか?だが、 add_top.cpp を見ると AddStreams_Batch() 関数が実行されている。
AddStreams_Batch() 関数は Resnet-50 でストリームを加算する関数のようだ。
これからソースコードのキャプチャ画面を引用します。
AddStreams_Batch() 関数は streamtools.h に記述されている。
typename で型を定義しているようだ。このように型を定義できるの良いな。。。知らなかった。使おう。。。
AddStreams_Batch() 関数からは、 Add_Streams() 関数が呼ばれている。
AddStreams() 関数では、ビット・フィールド毎(チャネル毎)に offset を加えて加算しているようだ。offset は 2 になっている。
最後に C コードの合成結果を貼っておく。
最初に finn-hlslib を git clone をして、 finn-hls/tb ディレクトリに cd する。
git clone https://github.com/Xilinx/finn-hlslib.git
cd finn-hls
cd tb
gen_weights.py を起動して、 config.h と memdata.h を生成した。
python3 gen_weights.py
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
C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーションを行った。
hls-syn-add ディレクトリが生成されて、Vivado HLS のプロジェクトが生成されていた。
vivado_hls &
で Vivado HLS 2019.2 を起動して、hls-syn-add ディレクトリのプロジェクトを読み込んだ。
波形を見るために C/RTL 協調シミュレーション時に Dump Trace を all に変更して、実行した。
Latency は 10 クロックだった。
波形を見てみよう。
4 つの出力をしているようだ。
hls-syn-add プロジェクトは何をしているのか?だが、 add_top.cpp を見ると AddStreams_Batch() 関数が実行されている。
AddStreams_Batch() 関数は Resnet-50 でストリームを加算する関数のようだ。
これからソースコードのキャプチャ画面を引用します。
AddStreams_Batch() 関数は streamtools.h に記述されている。
typename で型を定義しているようだ。このように型を定義できるの良いな。。。知らなかった。使おう。。。
AddStreams_Batch() 関数からは、 Add_Streams() 関数が呼ばれている。
AddStreams() 関数では、ビット・フィールド毎(チャネル毎)に offset を加えて加算しているようだ。offset は 2 になっている。
最後に C コードの合成結果を貼っておく。
コメント