この記事は 半導体・ハードウェア開発 Advent Calendar 2017 - Qiita の16日目の記事です。
Advent-Calendarを埋めてくれるかた、今からでも募集中です!是非参加してください! 私一人では、クオリティのある記事を続けられそうにありません。。。(弱音)
目次
- NVIDIAのディープラーニングアクセラレータNVDLAをVivadoでシミュレーションする
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ハードウェア編)
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ソフトウェア編)>
- NVDLA 1.0 がVerilatorに対応している(が、ビルドできるのは潤沢な資源を持つ金持ちだけ)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(1. NVDLAのビルドとシミュレーション環境構築)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(3. NVDLAの内部ブロック)>
- NVDLA Virtual Platformの試行 (1. ビルド試行 → 失敗)>
- NVDLA Virtual Platformの試行 (2. ビルド成功 → ログイン)>
前回の続き。前回はNVDLAをビルドしようとして、Python C APIのところで失敗したのだった。
$ make ... [ 75%] Completed 'qbox' [ 75%] Built target qbox Scanning dependencies of target greenscript [ 75%] Building CXX object libs/greenlib/greenscript/lib/CMakeFiles/greenscript.dir/__/src/greenscript.cpp.o /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In constructor ‘gs::script::GreenScriptModule::GreenScriptModule(sc_core::sc_module_name, const char*)’: /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:178:39: error: ‘PyString_FromString’ was not declared in this scope name_py = PyString_FromString(name()); // new ref ^ /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘void gs::script::GreenScriptModule::load(const char*)’: /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:221:46: error: ‘PyString_AsString’ was not declared in this scope std::string s(PyString_AsString(path_py)); ^ /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘void gs::script::GreenScriptModule::add_to_pythonpath(const char*)’: /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:262:47: error: ‘PyString_FromString’ was not declared in this scope PyObject *path_py = PyString_FromString(path); // new ref ^ /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘bool gs::script::GreenScriptModule::private_load(const char*)’: /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:278:68: error: ‘PyFile_FromString’ was not declared in this scope PyObject* PyFileObject = PyFile_FromString((char *)fullname, mode); ^ In file included from /usr/include/python3.7m/Python.h:116:0, from /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:38: /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:279:56: error: ‘PyFile_AsFile’ was not declared in this scope PyObject *ret = PyRun_File(PyFile_AsFile(PyFileObject), ^ /usr/include/python3.7m/pythonrun.h:146:23: note: in definition of macro ‘PyRun_File’ PyRun_FileExFlags(fp, p, s, g, l, 0, NULL)
どうもPython2.7とPython3系でこのあたりのAPIが異なっているらしい。ソースコードを書き換えることも考えたが、Python 2.7で存在している関数を、Python 3.5のどの関数に置き換えていいのかわからなかったためとりあえずあきらめて、システム上からPython 3.5のパッケージを削除することで対応することにした。
sudo apt purge libpython3-dev libpython3
これで再度リポジトリをクリーンにして、再ビルドした。
cd nvdla_vp git clean -fdx CXX=/usr/bin/g++-5 cmake -DCMAKE_INSTALL_PREFIX=build -DSYSTEMC_PREFIX=/usr/local/systemc-2.3.0/ -DNVDLA_HW_PREFIX=/home/msyksphinz/work/nvdla_hw -DNVDLA_HW_PROJECT=nv_full make
Linuxカーネルのビルド
QEMU上で動作するARMで動く、Linuxカーネルを用意しなければならない。この方法もすべてNVDLA Virtual Platformのページに解説されているのでこのまま実行する。
Buildrootのダウンロードでは、LTSパッケージではなく、Latest Stable Releaseの方をダウンロードする方が確実だ。
ダウンロードして、ビルドを行う。make menuconfig
の実行の際は指示書の通りに設定を行うこと。
wget https://buildroot.org/downloads/buildroot-2017.11.tar.bz2 tar jxf buildroot-2017.11.tar.bz2 make qemu_aarch64_virt_defconfig make menuconfig make -j4
make menuconfig
の設定は以下の通り。
* Target Options -> Target Architecture -> AArch64 (little endian) * Target Options -> Target Architecture Variant -> cortex-A57 * Toolchain -> Custom kernel headers series -> 4.13.x * Toolchain -> Toolchain type -> External toolchain * Toolchain -> Toolchain -> Linaro AArch64 2017.08 * Toolchain -> Toolchain origin -> Toolchain to be downloaded and installed * Kernel -> () Kernel version -> 4.13.3 * Kernel -> Kernel configuration -> Use the architecture default configuration * System configuration -> Enable root login with password -> Y * System configuration -> Root password -> nvdla * Target Packages -> Show packages that are also provided by busybox -> Y * Target Packages -> Networking applications -> openssh -> Y
make
を実行すると、約10~15分程度でビルドが完了した。
カーネルイメージの実行
QEMUでビルドしたLinuxカーネルを実行しなければならない。 conf/aarch64_nvdla.lua
を書き換えて、イメージファイルを正しくロードできるようにする。
現在、NVDLA-VPと先ほどビルドしたLinuxカーネルのリポジトリの位置関係は以下のようになっている。
nvdla_vp/ ├── buildroot-2017.11 # buildrootのパッケージ ...
conf/aarch64_nvdla.lua
を以下のように書き換える。
diff --git a/conf/aarch64_nvdla.lua b/conf/aarch64_nvdla.lua index 203f504..d19c331 100644 --- a/conf/aarch64_nvdla.lua +++ b/conf/aarch64_nvdla.lua @@ -1,6 +1,6 @@ CPU = { library = "libqbox-nvdla.so", - extra_arguments = "-machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 1024 -kernel images/linux-4.13.3/Image --append \"root=/dev/vda\" -drive file=images/linux-4.13.3/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r -netdev user,id=user0,hostfwd=tcp::6666-:6666,hostfwd=tcp::6667-:22 -device virtio-net-device,netdev=user0" + extra_arguments = "-machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 1024 -kernel /home/msyksphinz/work/nvdla_vp/buildroot-2017.11/output/images/Image --append \"root=/dev/vda\" -drive file=/home/msyksphinz/work/nvdla_vp/buildroot-2017.11/output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r -netdev user,id=user0,hostfwd=tcp::6666-:6666,hostfwd=tcp::6667-:22 -device virtio-net-device,netdev=user0" } ram = {
これでQEMUの立ち上げを実行する。
$ export SC_SIGNAL_WRITE_CHECK=DISABLE $ ./build/bin/aarch64_toplevel -c conf/aarch64_nvdla.lua
ログイン画面が出てきた! User名: root
, Password: nvdla
としてログインする。
テストがいくつか入っている。実行してみる。
# mount -t 9p -o trans=virtio r /mnt # # cd /mnt/tests/hello/ # ls -lt total 20 -rw-rw-r-- 1 sshd sshd 115 Dec 13 17:32 Makefile -rwxrwxr-x 1 sshd sshd 9646 Dec 13 17:32 aarch64_hello -rw-rw-r-- 1 sshd sshd 472 Dec 13 17:32 hello.c # ./aarch64_hello Hello World!
ちゃんと動いたね。
# cd ../nvdla_bdma_mmio # ./aarch64_nvdla_bdma_mmio Start programming... Write reg 0x00004004, value 0x00000000 Write reg 0x00004000, value 0xc0000000 Write reg 0x0000400c, value 0x00000000 Write reg 0x00004008, value 0xc00017c0 Write reg 0x0000402c, value 0x00000800 Write reg 0x00004020, value 0x00000100 Write reg 0x00004028, value 0x00000800 Write reg 0x0000401c, value 0x00000100 Write reg 0x00004024, value 0x00000000 Write reg 0x00004018, value 0x00000007 Write reg 0x00004010, value 0x00000007 Write reg 0x00004014, value 0x00000003 Write reg 0x00004030, value 0x00000001 Write reg 0x00004034, value 0x00000001 Finish programming... Get BDMA interrupt ...