NVDLA Virtual Platformを使ってMNISTやCIFAR-10を動作させた。 おおむね動作するようになったのだが、詳細をきちんと解析しなければ単純にアプリケーションを使って遊んだだけになってしまう。 具体的にNVDLAの内部でどのようなことが起きているのか、もう少し見てみたいと思う。
で、NVDLAのログを出力できれば良いのだが、どうやらNVDLA Virtual Platformでは環境変数を使ってログの出力制御を行うことができるらしい。
以下のマニュアルを参考にした。
- Debbuging the Virtual Simulator
Virtual Platform — NVDLA Documentation
環境変数を使ってログの出力を制御する。
$ export SC_LOG="outfile:sc.log;verbosity_level:sc_debug;csb_adaptor:enable" -- print the register access transaction from QEMU to NVDLA $ export SC_LOG="outfile:sc.log;verbosity_level:sc_debug;dbb_adaptor:enable;sram_adaptor:enable" -- print the memory access from NVDLA to external memory
この場合、1行目の指定をした場合はCSRの値をロギングすることができ、2行目の指定を行った場合にはメモリアクセスのログを生成できるわけだ。
今回はなるべく多くのログを採取したいので、両方指定するために、aarch64_toplevel
を指定する前に以下のような環境変数を設定した。
export SC_LOG="outfile:sc.log;verbosity_level:sc_debug;csb_adaptor:enable;dbb_adaptor:enable;sram_adaptor:enable"
この後aarch64_toplevel
を立ち上げる。今回はnvdla/vp
ディレクトリ以下でQEMUを立ち上げているので、そのディレクトリにsc.logが生成される。
早速lenetを実行して、どのようなログが生成されるのか観察してみよう。
# mount -t 9p -o trans=virtio r /mnt # cd /mnt/ # cd tests/linux/ # insmod drm.ko # insmod opendla.ko # ./nvdla_runtime --loadable ../lenet/basic.nvdla --rawdump --image ../lenet/conv_0.pgm
実行が終了すると、なんと2.7GBに及ぶログが生成された。なんだこりゃ!
$ ls -lt 合計 4197944 -rw-rw-r--. 1 msyksphinz msyksphinz 2787880942 9月 10 22:21 sc.log drwxrwxr-x. 8 msyksphinz msyksphinz 91 9月 7 19:13 tests ... -rw-rw-r--. 1 msyksphinz msyksphinz 148249 9月 4 12:20 install_manifest.txt drwxrwxr-x. 2 msyksphinz msyksphinz 63 9月 3 18:24 conf drwxrwxr-x. 2 msyksphinz msyksphinz 63 9月 3 18:24 docker drwxrwxr-x. 3 msyksphinz msyksphinz 21 9月 3 18:24 fpga -rw-rw-r--. 1 msyksphinz msyksphinz 10503 9月 3 18:24 LICENSE -rw-rw-r--. 1 msyksphinz msyksphinz 3004 9月 3 18:24 README.md $
非常に長いログなので、これを解析するツールを作ろうと思った。
とりあえず簡単なツールを作って解析してみる。
システムレジスタの一覧があるので、リストをインポートしてPythonのツールを作ってみた。 非常に適当に作ったので非常に遅いけど。。。
./nvdla_vp_logger.py sc.log > sc2.dmp.log
とりあえずCSRへの設定の部分だけ抽出してみる。 メモリのLoad/Storeのログ抽出は後回し。
<Start Reading sc.log...> CSB[9004(CACC.S_POINTER )] => 0x00000000 CSB[9004(CACC.S_POINTER )] <= 0x00000000 CSB[7004(CMAC_A.S_POINTER )] <= 0x00000000 CSB[8004(CMAC_B.S_POINTER )] <= 0x00000000 CSB[6004(CSC.S_POINTER )] <= 0x00000000 CSB[5004(CDMA.S_POINTER )] <= 0x00000000 CSB[9000(CACC.S_STATUS )] => 0x00000000 CSB[7000(CMAC_A.S_STATUS )] => 0x00000000 CSB[8000(CMAC_B.S_STATUS )] => 0x00000000 CSB[6000(CSC.S_STATUS )] => 0x00000000 CSB[5000(CDMA.S_STATUS )] => 0x00000000 CSB[900c(CACC.D_MISC_CFG )] <= 0x00002000 CSB[9010(CACC.D_DATAOUT_SIZE_0 )] <= 0x00170017