SDSoC でストリーム

Preview:

Citation preview

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

( 有 ) シンビー

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

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

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

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

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

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

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

Pragma の理解Vivado HLS の理解

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

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

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

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

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

お金の回し方?

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

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

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

ここにフォーカス

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

画像処理でやりたいこと

フィルター処理が多い

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

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

どんな感じに使うか?

ここが AXI Stream

独自インタフェース

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

S2MM:AXIStream からメモリ

MM2S:AXIStream からメモリ

HP ポートへ

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

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

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

AXI Stream

参考資料• 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 のウェブサイトに登録して入手

AXIS(AXI Stream)

• tvalid • tready• tdata

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

簡単な AXIS

• tvalid • tready• tdata

Stream だからアドレスはない

参考 :AXI4 Lite

アドレスなどがある

TLAST と TUSER を有効に

AXIS の信号線

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

VDMA 内の AXIS

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

VDMA の信号線詳細

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

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

HSYNC の代わり

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

Vivado HLS で AXIS

メモリ

ここを C/C++ で開発

VDMA

VDMA

Filter

変換用IP

変換用IP

出力 I/F はAXIS

入力 I/F はAXIS

Filter

Vivado HLS での例出力 I/F は

AXIS

入力 I/F はAXIS

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

参考資料• UG902

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

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

SDSoC での ( 画像 ) 処理

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

単純に SDSoC を使うとメモリ

SDSoC のフィルタ

ここを C/C++ で開発

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

メモリ

メモリさっきのと比較

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

SDSoC のフィルタ

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

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

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

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

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

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

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

AXIS の部分、拡大

tlast がない、垂れ流し。

C で書くとこんな感じ

フィルター垂れ流し

IP コアに対応Interface の指定

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

SDSoC でつくった IP コア

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

変数がインタフェースへ

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

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

話は前後します

UG1146 の P46 から転載

ug1146 からさらに抜粋

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

話は前後します

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

この辺

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

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

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

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

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

SDSoC でつくった IP コア

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

変数がインタフェースへ

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

関連性を示す変数

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

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

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

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

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

ug1028 のパケット化 (packatize)

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

ん?なんじゃこりゃ

2つのソースが!!!

普通の C のソース

Vivado HLS 用のソース

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

Vivado HLS 用

ただの C ソース

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

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

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

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

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

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

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

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

Vivado HLS の関数を作る

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

VDMA を追加してみた

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

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

サンプルを改造

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

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

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

うわ!!template だ

hls::streamって?!

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

– ということで、、、

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

脱線 hls::stream の中身

あれ? C のスレッド?

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

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

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

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

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

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

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

出力

それぞれ

のループ

は並列に動作

する。

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

普通の C のソース

Vivado HLS 用のソース

こんな感じに書いてみる

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

結果としてこうなった

VDMA

VDMA

Filter

Filter

変換用IP

変換用IP

SDSoC のフィルタ

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

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

VDMA

VDMA

SDSoC のフィルタ

メモリ

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

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

VDMA

VDMA

SDSoC のフィルタ

メモリ

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

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

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

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

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

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

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

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

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

Recommended