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 がエラーになります。対処方法は正しく書くだけ (目視確認 ) 。
力尽きたのでこの辺で終わり