実際にGUINNESSを動かして、生成されたXilinx社のSDSoC用のCコードを眺めてみました。
Cコードを生成するのは、gen_cpp_code_v3.pyというファイルです。
このファイル内で template_cpp_r7_bcnn.cpp をテンプレートファイルにして、Cコードを生成しています。
このファイル内で 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に返します。
引数 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 )を呼び出します。
そこを何とかしたいですね。
本日(2017.11.25)発売のインターフェース、2018年1月号に中原先生ご自身によるGUINNESSについての記事(8頁もの)が掲載されています。
なんとラズパイ3の800倍! リアルタイムPython①...高速ディープ・ラーニングに挑戦 <= クリックすると、見本の最初のページのPDFがダウンロードされます。
なんとラズパイ3の800倍! リアルタイムPython①...高速ディープ・ラーニングに挑戦 <= クリックすると、見本の最初のページのPDFがダウンロードされます。