FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

NVDLAの内部構成調査(8. CaffeのprotobufからVirtual Platformのログを解析する)

f:id:msyksphinz:20180911011312p:plain
図は http://nvdla.org/vp.html より抜粋。

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のツールを作ってみた。 非常に適当に作ったので非常に遅いけど。。。

github.com

./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