RISC-V プロセッサHiFive1を使って、機械学習のチュートリアルとも言えるMNISTのプログラムを動作させたい。 まずはMNISTの推論コード自身から、HiFive1に移植している。
当たり前と言えば当たり前だが、行列演算の途中のデータとか、全部L1データキャッシュでやりくりする訳だから、あまり大きなプログラムをロードすることはできない。 これまで大きなプログラムを動かして途中でクラッシュしてボードが動かなくなっていたのは、これではないかと予想。 そこで、これまでに関数内で確保していた行列演算の途中の変数を、仮にでもいいのでグローバル変数として確保し、あらかじめ使用するすべての変数を確保しておいた。
diff --git a/software/mnist/train_twolayernet_fix16.c b/software/mnist/train_twolayernet_fix16.c index d35e94f..0802eff 100644 --- a/software/mnist/train_twolayernet_fix16.c +++ b/software/mnist/train_twolayernet_fix16.c @@ -25,7 +25,7 @@ #define ALPHA (10) // Coefficient of learning #define SEED (65535) // Seed of random #define MAXINPUTNO (60000) // Max number of learning data -#define BATCH_SIZE (100) +#define BATCH_SIZE (10) #define LEARNING_RATE (0.1) #define WEIGHT_INIT (0.01) @@ -286,6 +286,13 @@ int main () return 0; } +fix16_t af0 [BATCH_SIZE * HIDDENNO]; +fix16_t in_data[BATCH_SIZE][INPUTNO]; +fix16_t af1 [BATCH_SIZE * OUTPUTNO]; +fix16_t rel0[BATCH_SIZE * HIDDENNO]; +fix16_t rel1[BATCH_SIZE * OUTPUTNO]; + + void TestNetwork (const int input_size, const int output_size, const int hidden_size,
するとやはり、L1キャッシュには収まりきらずリンク時にエラーが発生する。とりあえず動作させるためにできることと言えば、バッチサイズを減らしてデータサイズを減らすことなので、バッチサイズを1まで減らすとリンクまで成功した。
一応クラッシュしないようになったが、まだデータを入力していないので、そこは修正していかないといけない。 そしてよく考えると各行列ステージで別々に変数を用意する必要もないわけで、もうちょっとデータサイズ減らせないかなあ。
/home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: mnist セクション `.bss' は領域 `ram' 内に入りません /home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: section .stack VMA [0000000080003800,0000000080003fff] overlaps section .bss VMA [0000000080000a48,0000000080009817] /home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld: 領域 `ram' が 0 バイト溢れました collect2: error: ld returned 1 exit status /home/msyksphinz/work/freedom-e-sdk/bsp/env/common.mk:44: ターゲット 'mnist' のレシピで失敗しました make[1]: *** [mnist] エラー 1 make[1]: ディレクトリ '/home/msyksphinz/work/freedom-e-sdk/software/mnist' から出ます Makefile:199: ターゲット 'software' のレシピで失敗しました make: *** [software] エラー 2