※ 画像はイメージです。
前回はmojo-cnnをx86上で動作させてみたのだが、最終的にはRISC-Vプロセッサ上で動作させてみたいので、RISC-V向けにリコンパイルしてみよう。
やることはMakefileのg++の部分を書き換えるだけだ。
- examples/makefile
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で動かしてみようかな。