雑多な趣味の記録帳

tom01h.exblog.jp

<   2018年 12月 ( 19 )   > この月の画像一覧

今頃、なぜか SystemC

tiny-dnn アクセラレータを作っていて、やっぱりサンプルコントローラ部(畳み込みのためのインデックス生成部)は C言語で書けたらいいなと思っています。
でも、コア部分はまだまだ Verilog で書きたいし、全体的な動作も紙に書いた通りのサイクル数で動いてほしい。
そんなわけで、畳み込みの 5重くらいのループで配列のインデックスだけを計算して出力するモジュールを C言語で書きたいんです。
今回は Verilog で書いて結構大変な目にあいましたし…

HLS で色々考えてみたんだけど、そもそも C言語で毎サイクル変数(インデックス)の値を出力って記述が出来るわけないし…
そんな中で検索に引っかかってきた懐かしいキーワードが SystemC です。
Vivado HLS でもサポートしているみたいだし、試してみる価値はあるかな? 解説本とか軒並み廃刊だな…
でも、多分 ここ に知りたいことのほとんどが書かれていると思われる。もう一個

ちなみにソフトなら
for(i=0;i<10;i++)
って書いちゃうところ、Verilog に書き換えるときには
for(i=0;i!=10;i++)
と似たような機能に書き換えているんですが、これくらいのことは HLS が自動でやってくれるのかな?

by tom01h | 2018-12-28 20:42 | Trackback | Comments(0)

スキーウェア

新しいクラブウェアです。新しい道具を買うと気持ちも盛り上がってきます。
f0054075_19493105.jpg

by tom01h | 2018-12-26 20:49 | スキー | Trackback | Comments(0)

USB メモリ

16GB × 8本組がとっても安かったので買っておきました。
Ultra96 の Petalinux ディレクトリはそのまま保存すると 23GB 必要ですが、いくつかファイルを削ると 16GB に入りました。
あまりに安かったので、ちゃんと保存できているか不安ですが…

Petalinux は全然理解できないので、どれが必要なファイルなのか全く分かりません。
BSP から作った時のように、延々何かをダウンロードする事態だけは避けたいと思っています。
f0054075_13590883.jpg

by tom01h | 2018-12-22 18:56 | PCとか | Trackback | Comments(0)

tiny-dnn アクセラレータの pooling が遅い

tiny-dnn アクセラレータが Ultra96 でまともに動くようになったので、CORA にも変更を反映しました。

話は変わって、tiny-dnn を Arm で動かすと Pooling の順伝搬が非常に遅いように見えます。
ソースコード を眺めてみると、カーネル毎のデータにアクセスするためにデータ配列の Index の配列を作って、何度もメモリを読みながらデータアクセスをしている模様。
Intel の場合はこのほうが速いのですかね?

by tom01h | 2018-12-21 22:40 | Trackback | Comments(0)

tiny-dnn アクセラレータを Ultra96 で動かしたい5

Ultra96 でキャッシュ有りの DMA 転送を使った tiny-dnn アクセラレータは、学習結果の認識精度が安定しない問題に直面しています。
今までも制御回路のバグで転送バッファを読み出し前に書きつぶしていたり、DMA の転送終了判定を間違っていたりしました。
結局は、どちらも DMA のキャッシュコヒーレンシとは関係ないのですが、キャッシュ有で DMA を使った時だけ問題が見えてきます。
今回もキャッシュコヒーレンシを疑いつつ解析を始めたのですが…

手詰まりなので、DMA 単体からキャッシュコヒーレンシのテストを始めました。
DMA 単体だとうまく動いたので、少しづつ tiny-dnn アクセラレータの構成に近づけていこうと RTL を眺めていたらバグ発見。
AXI ストリームマスタが M_AXIS_TREADY のネゲートを受けるタイミングが、転送開始の直前、もしくは終了の直前だと M_AXIS_TVALID のアサート期間が開始前だと1個多く、終了前だと1個少なくなる。
修正してみましたが… 不発。ここじゃない模様。

今までは udmabuf を大きく確保して分割して使っていましたが、用途別に4個の udmabuf を確保してみました。
なんかちょっと良くなった気がするけどまだ…

で、アクセラレータ行きのバッファの1個を O_SYNC 付きで開くと直った。
こいつが犯人みたいです。
さらに試してみると、今まではバッファ1からアクセラレータにDMAしつつ、ユーザメモリからバッファ2にコピーをする場面がありましたが、これを同じ時間に実行しないようにプログラムを変更したら直りました。原因は不明。
f0054075_00120791.png
github 更新しました。

by tom01h | 2018-12-20 23:42 | Trackback | Comments(0)

Ultra96 で キャッシュ有り DMA 転送を試す

AXI DMA の AXI ストリームを自己ループするようにつないで DMA のテストをしました。
1000 個のランダムデータを生成して DMA 転送して転送元のデータと比較するテスト。

udmabuf を使って O_SYNC 有り無しの比較でどちらもちゃんと動きました。
実行時間もちゃんと違う。

root@xilinx-ultra96-reva-2018_2:~# ./vfiotest
test success
102 us
root@xilinx-ultra96-reva-2018_2:~# ./vfiotest
test success
162 us

DMA 単体では動いているみたいなので、tiny-dnn アクセラレータは何が悪いのか比べてみたいと思います。

by tom01h | 2018-12-18 23:59 | Trackback | Comments(0)

初すべり@志賀高原

1泊2日で、毎年恒例の初滑りで志賀高原に行ってきました。
積雪量は年々少なくなっている気がして心配です。

今シーズンは検定を受けてみようかなってことで、プルーク何とかをいろいろと教えてもらいました。
ずるして回しているようにも見えるので、ブロックするつもりくらいでも良いとのこと。

なんだかいろいろとつながってきた気がします。

by tom01h | 2018-12-16 23:59 | スキー | Trackback | Comments(0)

tiny-dnn アクセラレータを Ultra96 で動かしたい4

キャッシュ付き DMA をいったんあきらめて、キャッシュなしで DMA 転送をしてみました。
こんな感じ で、転送と演算を並列動作しているプログラムは認識率は 97.41% で安定。
並列化していないプログラムは不安定。

プログラムを見比べて思いつく疑惑。

DMA の終了判定を間違っているっぽい。
DMA の転送が終わっていないのに、DMA リセットをかけているのか、IP 側の受け取り状態を解除しているのが原因じゃないかと思う。

よく見る終了判定
while ((dma_addr[0x04/4] & 0x1000)!=0x1000); // Wait for the tx to finish
最初のうちに起きていたハングアップを避けるために今まで使っていた終了判定
while ((dma_addr[0x04/4] & 0x3)==0); // Wait for the tx to finish

よく見る終了判定に変更したら、並列化していないプログラムも 97.41% で安定しました。

シミュレーション結果と一致しないのは、コンパイラのバージョン違いってことにしておきます。

DMA でキャッシュを使う設定(AxCACHE=0xf,AxPROT=0x2,FF41A040=0x3)にしたら…
やはり認識率が一定しません。

この設定で udmabuf を O_SYNC 付きで開くと期待通りの動きです。
やっぱりキャッシュ付き転送になっていないのかな?

残念ながら時間切れ。来週は DMA 単体でテストするかな…

by tom01h | 2018-12-13 23:59 | Trackback | Comments(0)

Oracle VM VirtualBox Extension Pack も一緒に入れると良いよ

VirtualBox を入れるなら、Extention Pack も一緒に入れた方が良いみたいです。
入れる前は USB が 1.1 にしか対応していない模様。
USB カードリーダが古いから遅いのかと思っていたけど…

USB 3 のカードリーダを買ったのに使えない… って感じでググってみたらわかりました。
しかも、PC 内蔵の SD カードリーダも使えるようになりました。

コンピューターには詳しいつもりだったのに…

大陸から遠路はるばる届いた SD カードリーダです。リーダって言っても書き込みもできます。
f0054075_22121606.jpg


by tom01h | 2018-12-12 21:28 | Trackback | Comments(0)

tiny-dnn アクセラレータを Ultra96 で動かしたい3

tiny-dnn アクセラレータがいまだ Ultra96 上では安定して動きません。
実行時間的にはだいたい期待通りなんだけど、実行結果(認識率)に再現性がないです。
いやなことに、正解だと思っている認識率 96.95% よりも高いことが多いのですが…

Interface の 2019年1月号 の読み返したけど、やり忘れていることはなさそう。
udmabuf の説明 を読んでみると、デバイスツリーに登録して dma-coherent を設定しないといけない気もしますが、試してみたけど変わりません。
DMA の設定の相性問題 で Petalinux ツールがうまく動かないのも疑ってみたけど違うようです。
しかも、いつからか Wifi が使えなくなっています。
DMA のデバイスツリーから dma-coherent を外すと Wifi 復活しました。→ 単に dd の書き損じの可能性もあります。

しかし、Ultra96 は何をやるにも時間がかかります。
だいたいの原因は、ルートファイルシステムが 1.5GB もある事かと…
しかも、Petalinux ツールはルートファイルシステムのコピーを何種類も作って、あっちで作ってこっちにコピーとかもしています。
あと、dd もすごく時間かかるし、たまにうまく書けていないこともある感じです。
ちなみに、VirtualBox が PC 内蔵の SD カードリーダを認識してくれないので、古い USB カードリーダを持ち出しています。
それが原因で dd が遅いのもあると思います。
また、形が悪くて隣りのポートもつぶしたりするので USB カードリーダを買ったのですがまだ届きません。
ついでに、机のわきに固定する形の USB ハブ を買いました。
f0054075_20030769.jpg
悪いのは DMA の使い方じゃないのかなぁ?
CORA はちゃんと動いているみたいだけど…

by tom01h | 2018-12-11 23:46 | Trackback | Comments(0)