雑多な趣味の記録帳

tom01h.exblog.jp

Zynq で DMA を試す

数日前から書いているように、tiny-dnn アクセラレータを高速化するには、自らデータを取りに行くように変更するのが良いと思っています。
そのためには PL 上に作る回路が tiny-dnn の動くユーザ空間にアクセスする必要があり、先日も参考にした ここ にあるように IOMMU(SMMU) が必要になります。そして、IOMMU は 7世代の Zynq には載っていなくて、UltraScale+ 世代には載っているようです。
とりあえず今持っている 7世代の Zynq でも真似事だけは試してみたく、DDR の一部を PS-PL 間の転送用バッファとして使ってみようと思います。

まずは、先ほどの SMMU のページの真似をして AXI DMA の ブロックデザインを作成します。
f0054075_15515727.png
DMA のアドレスマップは PS-PL 間転送用バッファだけが見えるように変更します。
f0054075_15520915.png
なんか、どうやっても AXI DMA 付きの PetaLinux が作れなかったので、同じアドレスに AXI BRAM を置いて作った PetaLinux で bitファイルだけ差し替えて使います。
そして、PetaLinux が使うアドレスを減らして、PS-PL 間の転送用バッファを確保します。
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi に追加。
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
dma_reserved: dma@0x1c000000 {
reg = <0x1c000000 0x04000000>;
};
};

さらに、SMMUのページのテストプログラムを変更します。
- 転送元、転送先を mmap した PS-PL 間転送用バッファに変更
- SMMU の設定をがっつり削除
こんな感じ になりました。ファイル名が…
大雑把に言うと、バッファ上に /dev/mem 経由で書いた値を DMA で別のアドレスにコピーして、/dev/mem 経由で確認します。
一応、動いているように見えます。

[PR]
# by tom01h | 2018-10-20 23:39 | Trackback | Comments(0)

tiny-dnn アクセラレータを高速化したい

今までの tiny-dnn アクセラレータは、CPUと密結合されることを前提として作っていました。
そして、出力チャンネル分だけ並列に計算しますが、せいぜいその程度の並列性しかありません。
でも Zynq は特に PS から PL への転送は遅く、最初の試行ではアクセラレータを使うとかえって遅くなりました。
もっと大きな塊でアクセラレータに仕事を投げないといけないと思うのですが、その前にもう少し実験をしておきたいと思います。

まずは、PL にAXI BRAM をインスタンスして時間を計ってみました。
計算機能がないのでパスするわけはないのですが、今まで使ってきた MNIST 学習プログラムを流してみます。
アクセラレータ無しよりも数割だけ速くなりました。たったのこれだけじゃ… 疎結合アクセラレータへの移行は決定です。

ついでに、AXI BRAM 用に作った Linux を使って、tiny-dnn アクセラレータの乗ったシステムで流してみます。
tinu-dnn 用 Linux と tiny-dnn回路の組み合わせ時と同じ時間になりました。ちゃんと学習もできます。
Linux のデバイスツリーの問題ではないのですかね。

というわけで、疎結合用のアクセラレータの仕様を考えることにします…

[PR]
# by tom01h | 2018-10-18 21:02 | Trackback | Comments(0)

Zynq と IOMMU について

現状の tiny-dnn アクセラレータは、CPU と アクセラレータが密結合されていることを前提に作っています。
が、実際の Zynq では結構遠くて性能が出ていません。Linux のデバイスツリーの書き方が悪いのかも調べてみたいとも思っていますが、根本的にはもっと通信を減らさないといけないと思います。
どう減らすのかといえば、現状はデータを随時 CPU からくべているのですが、アクセラレータが自発的にとりに行くようにするのが良いのかと…

そうなってくると問題が一つ、
tiny-dnn は Linux 上で動くユーザアプリケーションだし、データの置いてある物理メモリアドレス分からないじゃん!

世の中にはそれを解決するために IOMMU なるものがあるらしいです。
CPU は MMU を使ってユーザ空間と物理空間のアドレス変換をしているのですが、CPU 以外がアドレス変換に使うのが IOMMU です。
まぁ、どこを調べてもユーザアプリ用とは書いてなくて、仮想マシン上で動くゲスト OS 用と書いていますが…

で、Zynq で使っている Arm の場合は、(システム) SMMU という名前で呼ぶのが普通らしい。
そして Zynq にも入っていないか調べてみると、どうやら 7 世代には入っていないみたい。
でも UltraScale+ 世代には入っているみたいです。新しいのを買えば原理的にはできそうな感じですが、スキル的には難しそうな予感です…
ここ の真似でもすればよいのかなぁ?

[PR]
# by tom01h | 2018-10-17 20:55 | Trackback | Comments(0)

tiny-dnn アクセラレータを Zynq で動かす

tyny-dnn アクセラレータを作成中です。
今回は、今まで Verilator 上で検証していたアクセラレータに AXI Lite インタフェースを付けて、Zynq で動かしてみました。
動きはしたのですが… ソフトだけで計算した時よりも遅い…
(cov forward 72249ms → 179729ms elapsed)
f0054075_21504290.png

[PR]
# by tom01h | 2018-10-13 23:43 | Trackback | Comments(0)

トラ技

自作ニューラルネットアクセラレータの特集です。
あまりにピンポイントな特集なので買ってみました。
f0054075_22025184.jpg

[PR]
# by tom01h | 2018-10-12 22:05 | 本・映画など | Trackback | Comments(0)