Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

GUINNESSが出力するCコードとビルド時間




実際にGUINNESSを動かして、生成されたXilinx社のSDSoC用のCコードを眺めてみました。

Cコードを生成するのは、gen_cpp_code_v3.pyというファイルです。
このファイル内で template_cpp_r7_bcnn.cpp をテンプレートファイルにして、Cコードを生成しています。

template_cpp_r7_bcnn.cpp ファイルの BinCNN が BinaryCNN を処理する関数です。
引数 init の値によって、setup 関数と kernel 関数を変えています。
init が 1の時は、setup 関数が呼ばれて、パラメータ(t_bin_convW, t_BNFb)を内部RAMに設定し、
init が 0の時は、setup 関数で設定したパラメータを利用して、イメージ画像(t_in_img)を識別し、結果を fc_resultに返します。

引用
void BinCNN(
#ifdef __SDSCC__
        int *t_bin_convW,
        int *t_BNFb,
        ap_int<64> t_in_img[(IMGSIZ)*(IMGSIZ)],
        int fc_result[(OUT_DENSE_SIZ)],
        int init
#else 
        int t_bin_convW[(WEIGHT_SIZ)],
        int t_BNFb[(BIAS_SIZ)],
        ap_int<64> t_in_img[(IMGSIZ)*(IMGSIZ)],
        int fc_result[(OUT_DENSE_SIZ)],
        int init
#endif
)
{
	if( init == 1)
		setup( t_bin_convW, t_BNFb);
	else
		kernel( t_in_img, fc_result);
}

kernel 関数内で、各レイヤに対応した関数 ( bin_conv2d_pipeline, int_conv2d_layer, max_pooling_layer, fc_layer )を呼び出します。

生成されたコードをSDSoCにてFPGAのBitStreamやデバイスドライバを含めたプログラムをビルドしています。
そのため非常に時間がかかっています。

そこを何とかしたいですね。


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