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

雑多な趣味の記録帳

tom01h.exblog.jp

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にコピーをする場面がありましたが、これを同じ時間に実行しないようにプログラムを変更したら直りました。原因は不明。
tiny-dnn アクセラレータを Ultra96 で動かしたい5_f0054075_00120791.png
github 更新しました。

by tom01h | 2018-12-20 23:42