sdsoc でストリーム

67
SDSoC でででででで ででででででででででで ( で ) でででで

Upload: ryos36

Post on 07-Feb-2017

224 views

Category:

Software


0 download

TRANSCRIPT

Page 1: SDSoC でストリーム

SDSoC でストリームまだ俺は本気出してない

( 有 ) シンビー

Page 2: SDSoC でストリーム

SDSoC のどこを学びたいと思いますか?• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

Page 3: SDSoC でストリーム

SDSoC のどこを学びたいと思いますか?• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

他の人が話す?ここを知りたい人は自分で頑張る!!

Page 4: SDSoC でストリーム

SDSoC のどこを学びたいと思いますか?• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

Pragma の理解Vivado HLS の理解

Page 5: SDSoC でストリーム

SDSoC のどこを学びたいと思いますか?• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

Stream が使えるとハッピー?(後述 )

Page 6: SDSoC でストリーム

SDSoC のどこを学びたいと思いますか?• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

お金の回し方?

おそらく、セミナーが違います。

Page 7: SDSoC でストリーム

ということで“やっと”本題• LLVM を含めた SDSoC の仕組み• 高位合成としての SDSoC• SDSoC の使い方– 画像処理?– DeepLearning ?

• SDSoC を使ったビジネス展開

ここにフォーカス

Page 8: SDSoC でストリーム

本題の流れ• AXIS と VDMA の基礎知識• Vivado HLS における AXIS の書き方• SDSoC における AXIS の書き方• SDSoC でプラットフォームをつくった(結果報告)

Page 9: SDSoC でストリーム

画像処理でやりたいこと

フィルター処理が多い

Page 10: SDSoC でストリーム

AXI4 Stream を使うことが多いようだ

Vivado の IP カタログから引用。AXIS という記述も。

Page 11: SDSoC でストリーム

どんな感じに使うか?

ここが AXI Stream

独自インタフェース

Page 12: SDSoC でストリーム

Xilinx の VDMA を使うとメモリーに展開できる(その逆も可能 )

S2MM:AXIStream からメモリ

MM2S:AXIStream からメモリ

HP ポートへ

VDMA は Xilinx が提供する AXIS をつかった便利な IP コア

Page 13: SDSoC でストリーム

概念的にはこんな感じメモリ

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

AXI Stream

Page 14: SDSoC でストリーム

参考資料• AMBA® AXI™ and ACE™ Protocol Specification– IHI0022D

• AMBA® 4 AXI4-Stream Protocol– IHI0051A

• AXI Video Direct Memory Access v6.2– VDMA の IP コアについて書かれている ( 使い方 )

• Vivado AXI Reference GUIDE(ug1037)– VDMA の信号線の仕様についても書かれている

ARM の資料は ARM のウェブサイトに登録して入手

Page 15: SDSoC でストリーム

AXIS(AXI Stream)

• tvalid • tready• tdata

オプションを No や 0 にしている

Page 16: SDSoC でストリーム

簡単な AXIS

• tvalid • tready• tdata

Stream だからアドレスはない

Page 17: SDSoC でストリーム

参考 :AXI4 Lite

アドレスなどがある

Page 18: SDSoC でストリーム

TLAST と TUSER を有効に

Page 19: SDSoC でストリーム

AXIS の信号線

正確な意味付けをするのは使用者

Page 20: SDSoC でストリーム

VDMA 内の AXIS

VDMA : TLAST と TUSER に特別な意味付けがある。

Page 21: SDSoC でストリーム

VDMA の信号線詳細

TLAST はラインごと TUSER はスクリーンごと

Page 22: SDSoC でストリーム

AXIS(VDMA) と画像USER:スクリーン毎VSYNC の代わり LAST:ライン毎

HSYNC の代わり

Page 23: SDSoC でストリーム

AXIS(VDMA) 対応の IP コアを作るには?• Vivado HLS で簡単に作れる• じゃ SDSoC では?

Page 24: SDSoC でストリーム

Vivado HLS で AXIS

メモリ

ここを C/C++ で開発

VDMA

VDMA

Filter

変換用IP

変換用IP

出力 I/F はAXIS

入力 I/F はAXIS

Filter

Page 25: SDSoC でストリーム

Vivado HLS での例出力 I/F は

AXIS

入力 I/F はAXIS

ap_axis というのもある。unsigned と signed の違い。stream の s ではないInterface の指定

Page 26: SDSoC でストリーム

参考資料• UG902

– 「ハードウェア効率の良い C コード」より抜粋

template を用いた複雑なコード!!!!

Page 27: SDSoC でストリーム

SDSoC での ( 画像 ) 処理

回路図が出てこないのでソフトウェア技術者にとってらくちん!!

Page 28: SDSoC でストリーム

単純に SDSoC を使うとメモリ

SDSoC のフィルタ

ここを C/C++ で開発

メモリアクセスが余計?(便利な場合もある)AXIS や VDMA と無縁な世界

Page 29: SDSoC でストリーム

メモリ

メモリさっきのと比較

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

SDSoC のフィルタ

単純に作ると AXIS は用いられない

Page 30: SDSoC でストリーム

SDSoC で AXIS を使うモチベーション• ラインの最後を正確に把握してプログラミング• 画像の先頭を正確に把握してプログラミング• メモリを使わないフィルターの設計– これはケース・バイ・ケース

• VDMA や Vivado HLS の資産を有効活用

Page 31: SDSoC でストリーム

SDSoC で AXIS を扱う方法• ug1146(V2016.2)– 例 : SDSoC プラットフォームのダイレクト

I/O• FPGA マガジン No.16• ug1028 (v2016.2)– チュートリアル : プラットフォーム I/O ストリームとの通信

• ug1027(v2016.2)– 外部 I/O の使用 たぶんこの順で読むとわかりやすい

Page 32: SDSoC でストリーム

ug1146 のデザインを見てみよう

Page 33: SDSoC でストリーム

AXIS の部分、拡大

tlast がない、垂れ流し。

Page 34: SDSoC でストリーム

C で書くとこんな感じ

フィルター垂れ流し

IP コアに対応Interface の指定

Page 35: SDSoC でストリーム

プラットフォームとの対応

SDSoC でつくった IP コア

ダミーの関数が既存の IP コアへ

変数がインタフェースへ

関数が HW化されIP が生成される

Page 36: SDSoC でストリーム

SDSoC ではパケットを使っている• じつは last を使ってパケット化している

話は前後します

UG1146 の P46 から転載

Page 37: SDSoC でストリーム

ug1146 からさらに抜粋

フィルター垂れ流しだといっている

話は前後します

Page 38: SDSoC でストリーム

脱線:資料から順序良く学べます• 資料の行間を読む必要があります。

この辺

私の価値は勇気をもって行間を語ることじゃ

Page 39: SDSoC でストリーム

ug1146 の方向性は• SDSoC はビデオ処理に向いている。– そのためには IO が必要

• IO を付け加えるにはプラットフォームをつくる• プラットフォームを作る過程で sdslib を使う– sdslib で IP コアとの関連性と IP コアのカスタマイズができる(詳しくは ug1027/ug1028 に飛ぶのだ )

• フィルターのハードウェア化を指定すると、勝手に関連性を見てハードを作ってくれる。• 関連性は変数を引き渡すことでコンパイラに知らせる。 といいつつ行間ではなく ug1146 そのままやんか

Page 40: SDSoC でストリーム

プラットフォームとの対応(再掲 )

SDSoC でつくった IP コア

ダミーの関数が既存の IP コアへ

変数がインタフェースへ

関数が HW化されIP が生成される

Page 41: SDSoC でストリーム

関連性を示す変数

例では wrapper 関数を使っているがその必要はない。Rbuf0[1] の 1 に意味はなさそう。

C 言語を逸脱している点に注意

Page 42: SDSoC でストリーム

ug1146 の続きを別の資料で読む• ug1027: 外部 I/O の使用• ug1028: チュートリアル : プラットフォーム I/O ストリームとの通信

– パケット化して– 損失のないデータ取り込み

チュートリアルでこの2つが学べるぞ

Page 43: SDSoC でストリーム

ug1028 のパケット化 (packatize)

入力は垂れ流し 出力は AXISサイドチャネル付き垂れ流しからAXIS へ変換。情報の付加

ん?なんじゃこりゃ

Page 44: SDSoC でストリーム

2つのソースが!!!

普通の C のソース

Vivado HLS 用のソース

Page 45: SDSoC でストリーム

つまりC/C++ のソース sds のコンパイラ

Vivado HLS 用

ただの C ソース

もともと SDSoC がそういうものだから驚くことないのか、、、、

Page 46: SDSoC でストリーム

注意:パケット化 ≠ AXIS(VDMA)

• VDMA の規約にのっとるためには user を設定する必要あり

よくみると user には適当に 0 を入れているこれじゃ VDMA の規約を満たせない

static も気持ち悪い (美しくない )BUF_SIZE も決め打ちだ

Page 47: SDSoC でストリーム

脱線• ./hls_if/hls_stream/bytestrm_dwordproc.cppも参考になります。(複雑ですが、、、 )

C の記述を大胆にも丸々オミット!!100% Vivado HLS 依存。

Page 48: SDSoC でストリーム

AXIS(VDMA) 対応にするには• はじめから last と user を意識する• vdma に対応したプラットフォームを作る• AXIS (サイドチャネル付き)に対応した

Vivado HLS の関数を作る

Page 49: SDSoC でストリーム

AXIS 対応のプラットフォームを作る

VDMA を追加してみた

Page 50: SDSoC でストリーム

プラットフォームの作り方• ug1146 にある手順そのままです– tcl で hpfm をつくる– src を example からコピー– sdslib でライブラリを作る

ここが一番重要なんじゃないのか?かなり手抜き感がにじみ出ている

Page 51: SDSoC でストリーム

サンプルを改造

入力がついに AXIS サイドチャネル付きに!!

Page 52: SDSoC でストリーム

ここから先は Vivado HLS の話になってしまう• 参考資料 : ug902: ハードウェア効率の良い C コード

– 必読!!ではありますが、、、、

うわ!!template だ

hls::streamって?!

Page 53: SDSoC でストリーム

Vivado HLS では hls::stream を推奨• hls::stream を使う意義– ap_axiu<32, 1, 1, 1> だけでは時間順が表現できない。• 実際に書くとわかります。 ( 書いて破綻することを推奨します)

– ということで、、、

ソースはこんな感じで書き直します。

Page 54: SDSoC でストリーム

脱線 hls::stream の中身

あれ? C のスレッド?

Page 55: SDSoC でストリーム

どうやらコンパイラが意識しているようだ !!

• hls_stream.h には HLS 的な記述はない (C の記述のみ )• Vivado HLS で csim で実行するとスレッドが実行されて処理が同時に動く– SDSoC にその機能はない、、、(と思う)

これって特定企業の独自技術であることに注意

Page 56: SDSoC でストリーム

そもそも hls::stream の使い方は?(ug903 から学ぶ)

ug903 のソースは省略されているので注意。本物のソースを見た方がよい

Page 57: SDSoC でストリーム

もうちょい分かりやすくすると

Page 58: SDSoC でストリーム

各ループのつなぎは stream入力

出力

それぞれ

のループ

は並列に動作

する。

Page 59: SDSoC でストリーム

それを踏まえて、 SDSoC では、、、• Ifdef __SDSVHLS__ を使い Vivado HLS のソースを埋め込む• 必要なら C でシミュレーションを書く必要がある• C側は書けないこともある

普通の C のソース

Vivado HLS 用のソース

Page 60: SDSoC でストリーム

こんな感じに書いてみる

まだ動いてないぞ。これから本気出す

Page 61: SDSoC でストリーム

結果としてこうなった

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

SDSoC のフィルタ

オー素晴らしい!!SDSoC の世界と AXIS/VDMA の世界が融合

Page 62: SDSoC でストリーム

(うそつきました)ほんとはこう

VDMA

VDMA

SDSoC のフィルタ

メモリ

なんだよ、本物の IO がないじゃねぇか

Page 63: SDSoC でストリーム

(またうそつきました)ほんとはこう

VDMA

VDMA

SDSoC のフィルタ

メモリ

まだためしてないだけ。オレが本気出せばすぐにできる、、、はずだから問題なし、、、のはず なんだできてねぇじゃないか

Page 64: SDSoC でストリーム

SDSoC で AXIS と hls::stream を使うと• たぶんシステム構成の選択肢が広がる• 余計なメモリアクセスしないで済むかも• ソフトの介入を抑えることが出来るかも• Vivado HLS/AXIS/VDMA の世界と融合できるはず– Vivado HLS のライブラリが使えると強力かも• ラインバッファとかもある• 私は作りかけた(車輪の再発明)間違えて

Page 65: SDSoC でストリーム

実際問題、 SDSoC ってどうでしょう?• Vivado HLS を知る必要がある– 最初から Vivado HLS にすればいい気も、、、

• C++ のテンプレートをバリバリつかう !?– メンテナンス性はいいのだろうか?

• SDSoC クエスト /Vivado HLS クエスト–地図のない(資料がない)旅– 特定の技術に捕まっている

面白い技術で、まなぶべきだというのが前提にあるけどね。あえての苦言。

Page 66: SDSoC でストリーム

致命的なエラーが発生するぞ

存在しない IP を間違えて書いてもtcl ではエラーにならないばかりかSDSoC (2016.2 および SDx2016.3) でコンパイルすると右のように opt.exe がエラーになります。対処方法は正しく書くだけ (目視確認 ) 。

Page 67: SDSoC でストリーム

力尽きたのでこの辺で終わり