雑多な趣味の記録帳

tom01h.exblog.jp

FPGAセミナ AI画処理デザインの作り方

またまた Xilinx の無料のセミナがあったので聞いてきました。
f0054075_21384371.jpg
HSL を使って画像識別の推論 IP を作っているそうです。
デモの時間にいろいろと質問ができました。

ネットワークモデルをべたに回路展開しているわけではなく、回路の使いまわしをしている。
ただし、コントローラも含めてすべて回路化していて、CPUからコントロールする必要はない。
入力データを DRAM から読みだして、推論結果を DRAM に書き出す以外は DRAM へのアクセスはない。
つまり、推論 IP を動かすことだけ考えると CPU と DRAM の性能は必要ない。
だた、デモでは FullHD をいったん DRAM に取り込んで、推論 IP と表示 IP でそれぞれ読み出すといったことをしているので、DRAM の性能は必要みたいでした。
そして、デモは 60FPS、推論 IP は 800FPS 以上とのこと。

なんで ZynqMP 使っているのだろうか?
ちなみに、7世代とUS/US+世代では電力差が結構大きかったとのこと。

# by tom01h | 2019-03-25 21:53 | Trackback | Comments(0)

SystemC で配列インデックス生成 (逆方向)

畳み込み用の配列インデックス生成回路を SystemC 記述に変更中です。
昨日は順方向伝搬に対応したので、今日は逆方向伝搬に対応します。

逆伝搬ではいろいろ工夫をした記憶があるのですが、もはやその工夫を覚えていません。
しかも、Verilog のソースを見てもわかりにくい…
でも、C++ で書いたソースを git が覚えていてくれました。
これ の 200 ~ 230 行あたりがそれです。

github に登録しました。
先のソースと若干違うのは、ウェイトを読み込む際にデータ順を入れ替えているためです。

なんだか、シミュレーション時間がどんどん遅くなっていきます…

# by tom01h | 2019-03-23 19:16 | Trackback | Comments(0)

SystemC で配列インデックス生成 (順方向だけ)

畳み込み用の配列インデックス生成回路を SystemC で記述しようとしています。
SystemC を使うための調査と準備もだいたい終わったので、そろそろ SystemC を使った設計を始めようと思います。

まずは、分かりやすい順方向だけを SystemC 対応します。
逆方向とウェイトの傾きの計算は、一旦 CPU での計算に逆戻りです。
何とかシミュレーションは動くようになったので github に登録しました。
とりあえず VivadoHLS を使って Verilog の生成は出来ているようですが、生成した Verilog でのシミュレーションはまだ確認していません。

将来的にダブルバッファにして、転送と演算をパイプライン動作させることまで視野に入れています。
そのために、SystemC の部分は 4つのスレッドに分割しています。
よく考えてみると、入力データの配列インデックス生成部分以外は Verilog 記述のままの方が良かったかもしれません。
パイプライン化の時に、もっとちゃんと考えてみたいと思います。

Verilog で書いていた時よりも素直な記述にしたのと、ほとんど機能の多重化がなくなっているのもあわせて、SystemC 化でかなり読みやすくなったと思います。
まぁ、逆方向とかに対応するとまた、読みづらくなるかもしれませんが…


# by tom01h | 2019-03-22 16:33 | Trackback | Comments(0)

SystemC でマルチスレッド

引き続き、畳み込み用の配列インデックス生成回路を SystemC で記述しようとトライしています。

SystemC では、複数の always 分を記述するにはスレッド(論理プロセッサの話じゃないよ)を複数使うようです。
調査の時に参考にした ここ に参考にできる記述がありました。
今のところは意味はないのですが、お試しに ia, wa と oa を生成するスレッドを分けて作ってみました(信号の意味は ここ 参照)。
それぞれ、相手が終わったことを確認してから動き出しています。
つまりまぁ、スレッドを分けた意味はないのですが…
f0054075_22481945.png
上半分が Verilog で書いた実際に動いている波形、下半分が SystemC で書いた試行モジュールの出す波形。
信号を1サイクル遅らせたりの操作はまた別に考えようと思っているので、oa は 1サイクルずれたままです。
しかも現状の実装にバグがあるので、本当はもう 1サイクル遅らせる必要があります(ここ の最後の3行)。
github 更新しました。

そろそろ調査は終わりにして、ちゃんと SystemC を使った設計を始めましょうか。

# by tom01h | 2019-03-20 21:02 | Trackback | Comments(0)

Verilator で SystemC ちょっとわかった

Verilator で Verilog モジュールの複数ビット幅のインタフェースが sc_in<uint32_t> とか sc_out<uint32_t> に変換されて困っていた件。
SystemC のモジュールとうまくつながらない原因となっていたのですが、解決方法が Verilator のマニュアルに書いてありました。

こうすると
f0054075_14590507.png
sim/Vtiny_dnn_top.h がこうなります。
sc_in<sc_bv<13> > sc_ia;
sc_in<sc_bv<10> > sc_wa;

ただし、シミュレーション速度はさらに遅くなる模様…

# by tom01h | 2019-03-19 22:58 | Trackback | Comments(0)