SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
- 4. 今回使用したデータ転送にかかわる
プラグマ
● #pragma SDS data zero_copy(cam_fb[0:ALL_PIXEL_VALUE])
● #pragma SDS data zero_copy(lap_fb[0:ALL_PIXEL_VALUE])
● #pragma SDS data copy(cam_fb[0:ALL_PIXEL_VALUE])
● #pragma SDS data copy(lap_fb[0:ALL_PIXEL_VALUE])
● #pragma SDS data access_pattern(cam_fb:RANDOM, lap_fb:RANDOM)
● #pragma SDS data access_pattern(cam_fb:SEQUENTIAL, lap_fb:SEQUENTIAL)
● #pragma SDS data sys_port(cam_fb:AFI, lap_fb:AFI)
● int lap_filter_axim(int cam_fb[ALL_PIXEL_VALUE], int
lap_fb[ALL_PIXEL_VALUE])
● {
– ハードウェア関数の引数が配列(要素数をどこかで明示しておかないとエラー)
– 配列がメモリの領域を示している
- 5. プラグマによる外部メモリとの
転送方法(copy, zero_copy)
● #pragma SDS data copy(<ポート名>…)
– データはブロックRAMに一時コピーされる?
– 呼び出し側関数からはmalloc()で取得したメモリの先頭アド
レスを配列のアドレスとして渡される
– スキャッタ・ギャザー用DMA
● 4kバイトごとにアドレスが不連続の可能性
● #pragma SDS data zero_copy(<ポート名>…)
– データはDDRから転送されたそのままを使用
– 呼び出し側関数からはsds_alloc()で取得した連続領域のメ
モリを配列のアドレスとして渡される
– シンプルDMAでもOK
- 6. プラグマによる外部メモリとの
転送方法(data access_pattern)
● #pragma SDS data access_pattern(cam_fb:RANDOM,
lap_fb:RANDOM)
– RANDOM ー RAMインターフェースが生成される
– デフォルトのアクセスパターン
● #pragma SDS data access_pattern(cam_fb:SEQUENTIAL,
lap_fb:SEQUENTIAL)
– SEQUNTIAL ー ストリーミング・インターフェースが生成される
– 配列のエレメントの順番は守る必要がある(ストリーミングだから)
● zero_copyプラグマが無い引数にのみ適用できる
- 7. 使用するPSのポートの指定
(data sys_port)
● #pragma SDS data sys_port(cam_fb:AFI,
lap_fb:AFI)
– portはACP、AFI(HP)、MIGのいずれか
– sds_alloc_non_cacheable()かsds_register_dmabuf()で
メモリをアロケートした場合はAFI(HP)ポートを使ったほう
が良い
– SDSoCでは自動的にデータ・ムーバーが適切なポートに
接続する
– ラプラシアンフィルタではデフォルトではACPポートが使わ
れる(malloc(), sds_alloc()使用)
- 22. Vivado HLSのAXI4-Streamのコード
● Vivado HLSのAXI4-Streamのコードは果たして動く
のか?
● @ryosさんの記事を参考にSDSoC 2016.3でサイド
チャネル付きAXI4-Streamを実装しようとしたが失敗
●
でも、今までもストリームにしてきた
● data access_pattern(SEQUENTIAL)のプラグマを付
けて、シーケンシャルに実行するコードだったらOKで
は?(AXI4-Streamではないけど)
● AXI4-Streamのコードでやってみたらどうなんだろう?
- 23. AXI4-Stream向きのコード1
● AXI4-Streamのコードを使用した
– サイドチャネルを使っているので、それを外した
● SDSoCで使うので、Xilinxのビデオ用IPのことは考えない
– 入力のストリームと出力のストリームにはif文がない
�� data access_pattern(SEQUENTIAL)プラグマ
●
結果
– ソフトウェアの実行時間は、約 47.7 ms
– ハードウエアの実行時間は、約 5.54 ms
– SW実行時間/HW実行時間≒8.61倍
● 驚異的。。。ハードウエアの実行時間はReadもWriteも重なり合ったフル
バーストしないと実現できない
● なぜならば、800ピクセルx600行x10 ns(クロック周期)= 4.8 ms
– 1ピクセルは1クロックで転送(1ピクセルはint型、クロック周波数は100MHz)
● http://marsee101.blog19.fc2.com/blog-entry-3690.html
- 24. AXI4-Stream向きのコード2
● AXI4-Stream向きのコード1と同様
● ただし、data access_pattern(SEQUENTIAL)プラグマの代
わりにdata zero_copyプラグマ
● つまり、Vivado HLSでのメモリ・アクセスをAXI4 Masterに
●
結果
– ソフトウェアの実行時間は、約 47.7 ms
– ハードウエアの実行時間は、約 6.04 ms
– SW実行時間/HW実行時間≒7.90倍
● AXI4-Stream向きのコード1よりも少し遅くなっている
が、ReadとWriteが重なり合ってDMAされているはず
● http://marsee101.blog19.fc2.com/blog-entry-3691.html
- 25. Vivado HLSで最速コードを確かめる
● 最速の結果が出たSDSoCのコードをVivado HLSで
INTERFACE m_axi指示子を入れて確かめた(つま
り、AXI4 Master )
● 確かに16バーストのReadとWriteが重なり合ったDMA(見
事なものだった。。。)
● if文無しでReadし、if文無しでWriteすれば最高性能(来たま
まの順番でフィルタして出力)
● http://marsee101.blog19.fc2.com/blog-entry-3692.html
● http://marsee101.blog19.fc2.com/blog-entry-3694.html
● http://marsee101.blog19.fc2.com/blog-entry-3695.html