人気ブログランキング | 話題のタグを見る

雑多な趣味の記録帳

tom01h.exblog.jp

tiny-dnn アクセラレータのシミュレータを C++ モードに戻す

畳み込み用の配列インデックス生成回路を SystemC 記述に変更するに先立ち、Verilator を C++ モードから SystemC モードに変更しました。
続いて畳み込み用の配列インデックス生成回路を SystemC 記述に変更しましたが、シミュレーション速度がとっても遅くなりました。
そんなわけで、Verilator を C++ モードに戻してみたいと思います。

Verilator で C++ に変換されたモジュールと SystemC で記述した回路を連結して検証するには、クロック同期化の工夫が必要になります。
SystemC でクロックを生成するのは

sc_clock clk ("clk", 10, SC_NS);
sc_start(5, SC_NS);
sc_start(5, SC_NS);

こんな感じ。
この clk を Verilog モジュール側でも使いたいと思います。
じゃあ、1個目の sc_start で何が起きるのか?
クロックを立ち上げて、回路を評価して、5ns 進める。
ここまでで、クロックの立ち下げはしないようです。
クロックのトグルの後に時間を進められては、Verilog モジュールとの同期が不便です。
そんなわけで、Verilogモジュール側を先行して評価するのがやりやすい模様。

verilator_top->clk = !clk;
verilator_top->eval();
sc_start(5, SC_NS);
データ交換
波形取得
main_time += 5;

これがクロック半サイクルの動作になります。

他に、ビルドの方法を試行錯誤したり、たくさんの地道な修正を入れたりでやっと動くようになりました。
では、シミュレーション実行時間を計ってみたいと思います。
学習サンプルは 1600 個、ミニバッチ=2、エポック=1 での結果です。

全 Verilog & C++ モード (SystemC にする前の環境) 64秒
クロックだけ SystemC に変更 (参考) 115秒
インデックス回路を SystemC 化 & C++ モード (今日からの環境) 155秒
インデックス回路を SystemC 化 & SystemC モード (昨日までの環境) 214秒

微妙だ…
SystemC を使うととにかく遅くなるって事らしい。
ついでに、今日からの環境を sim_lv1 ブランチで偽物の FPU を使って高速化すると 100秒になります。

ちなみに IN2OUT のパスがあると、この検証環境ではちゃんと動かない気がします。

by tom01h | 2019-03-28 17:16