Vengineerの妄想

人生を妄想しています。

GUINNESSの出力コードをSDSoCからVivado HLSへ



GUINNESSが吐き出すCコードとビルド時間の続き、
Vivado HLS用のコードを吐き出すようにすれば、合成時間はかなり短くなると思います。

そうなると、FPGA部のデバイスドライバが必要になりますが、@ikwzm さんの udmabuf を使えばいいのです。


そうすれば、SDSoCのライセンスは必要ありません。
また、ボードに対するSDSoC用のプラットフォームも用意する必要はありません。


パラメータを設定する setup 関数部のモジュールと kernel 関数部を 下記の図のような構成にして、
それぞれ、Vivado HLS用のコードを出力すればいいと思うんですが、いかがでしょうか?

イメージ 1


こうすることで、SDSoCが不要になり、ビルド時間も短くなります。

GUINNESSは吐き出すコードの各レイヤーはVivado HLSコードなので、
最上位部をSDSoCでなく、Vivado HLS用コードにすればできると思います。

追記)2017.11.25

本日(2017.11.25)発売のインターフェース、2018年1月号に中原先生ご自身によるGUINNESSについての記事(8頁もの)が掲載されています。
なんとラズパイ3の800倍! リアルタイムPython①...高速ディープ・ラーニングに挑戦 <= クリックすると、見本の最初のページのPDFがダウンロードされます。

また、Vivado HLS用コードについては、中原先生から直接、そのようなコードにはなっていることをを教えてもらいました。
サンプルコードのTinyCNNでは、sdsoc/cnn.cppのBinCNN関数は、下記のようになっていますが、
#pragma HLSの部分をコメントアウトして、Vivado HLSで合成すればいいようです。
{
//--------------------------------------------------------------------
// Top Function for a Binarized CNN
//--------------------------------------------------------------------
#ifdef __SDSCC__
#pragma SDS data access_pattern(t_bin_convW: SEQUENTIAL)
#pragma SDS data access_pattern(t_BNFb: SEQUENTIAL)
#pragma SDS data access_pattern(t_in_img: SEQUENTIAL)
#pragma SDS data zero_copy(t_bin_convW[0:224192])
#pragma SDS data zero_copy(t_BNFb[0:330])
#pragma SDS data zero_copy(t_in_img[0:32*32])
#endif
void BinCNN(
#ifdef __SDSCC__
        int *t_bin_convW,
        int *t_BNFb,
        ap_int<64> t_in_img[32*32],
        int fc_result[10],
        int init
#else 
        int t_bin_convW[224192],
        int t_BNFb[330],
        ap_int<64> t_in_img[32*32],
        int fc_result[10],
        int init
#endif
)
{
/*
#pragma HLS INTERFACE s_axilite register port=t_bin_convW bundle=slv0
#pragma HLS INTERFACE s_axilite register port=t_BNFb bundle=slv0
#pragma HLS INTERFACE s_axilite register port=t_in_img bundle=slv0
#pragma HLS INTERFACE s_axilite register port=fc_result bundle=slv0
#pragma HLS INTERFACE s_axilite register port=init bundle=slv0
#pragma HLS INTERFACE s_axilite register port=return bundle=slv0
*/
	if( init == 1)
		setup( t_bin_convW, t_BNFb);
	else
		kernel( t_in_img, fc_result);
}