FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages/

C++で記述された軽量CNN実装 mojo-cnn 試行 (2. RISC-V 向けにリコンパイルとシミュレーション)

f:id:msyksphinz:20180515001039j:plain
※ 画像はイメージです。

前回はmojo-cnnをx86上で動作させてみたのだが、最終的にはRISC-Vプロセッサ上で動作させてみたいので、RISC-V向けにリコンパイルしてみよう。

やることはMakefileのg++の部分を書き換えるだけだ。

diff --git a/examples/makefile b/examples/makefile
index 75ca26c..d8485f5 100644
--- a/examples/makefile
+++ b/examples/makefile
@@ -1,4 +1,4 @@
-CC=g++
+CC=riscv64-unknown-elf-g++
 # CFLAGS_OMP= -I../mojo/ -std=c++11 -fopenmp -O3 -DMOJO_OPM -DMOJO_AVX -msse4 -mavx

さらに、usleepが定義されていないのでその部分はとりあえず削除した。

diff --git a/mojo/network.h b/mojo/network.h
index 413400a..481a282 100644
--- a/mojo/network.h
+++ b/mojo/network.h
@@ -94,8 +94,9 @@ mojo::matrix transform(const mojo::matrix in, const int x_center, const int y_ce
 #include <windows.h>
        void mojo_sleep(unsigned milliseconds) { Sleep(milliseconds); }
 #else
-#include <unistd.h>
-       void mojo_sleep(unsigned milliseconds) { usleep(milliseconds * 1000); }
+//#include <unistd.h>
+//     void mojo_sleep(unsigned milliseconds) { usleep(milliseconds * 1000); }
+       void mojo_sleep(unsigned milliseconds) { return; }
 #endif

 #ifdef MOJO_PROFILE_LAYERS

これでリコンパイルした。

$ make
riscv64-unknown-elf-g++ -I../mojo/ -std=c++11 test.cpp -o test
riscv64-unknown-elf-g++ -I../mojo/ -std=c++11 train_mnist.cpp -o train_mnist
riscv64-unknown-elf-g++ -I../mojo/ -std=c++11 train_cifar.cpp -o train_cifar

まずはspikeを使って実行してみよう。QEMUを使えばもっと早いのかもしれないが使い方がまだよく分かっていない。

$ spike pk test
Mojo CNN Configuration:
  0 : I1 : input 32 32 3 identity
  1 : Lc1 : convolution 3 50 1 elu
  2 : Lp1 : max_pool 2 2
  3 : Lc2 : deepcnet 100 elu
  4 : Lc3 : deepcnet 150 elu
  5 : R3 : concatenate 7 zero
  6 : Lc4 : deepcnet 200 elu
  7 : Lc5 : deepcnet 250 elu
  8 : FC1 : fully_connected 10 tanh

  I1-Lc1, Lc1-Lp1, Lp1-Lc2
  Lc2-Lc3, Lc3-R3, R3-Lc4
  Lc4-Lc5, Lc5-FC1

Testing CIFAR-10:
  testing : 10% (2035sec remaining)

とりあえず最後まで完走した!(キャプチャ取り忘れた...)とりあえず最後まで動くRISC-Vバイナリが作れたようだ。

Zynq FPGAで動かしてみようかな。