実際に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がダウンロードされます。