FC2カウンター FPGAの部屋 SDSoCのチュートリアルをやってみた3(タスクのパイプライン処理最適化)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

SDSoCのチュートリアルをやってみた3(タスクのパイプライン処理最適化)

SDSoCのチュートリアルをやってみた2(システム パフォーマンスの見積もり)”の続き。

SDSoC Environment Tutorial: Introduction UG1028 (v2016.3) November 30, 2016”の33ページ”Chapter 5 Accelerator Optimization”をやってみよう。
なお、”SDSoC 環境ユーザー ガイド SDSoC 環境の概要 UG1028 (v2016.2) 2016 年 7 月 13 日”では、63 ページの”第6章 チュートリアル : タスクのパイプライン処
理最適化”となる。

最初にZYBO 用のファイルは無いのだが、zc702 のファイルを加工してみよう。
ZYBO 用の空の async_wait_zybo プロジェクトを作成した。system configuration は Linuxとした。

C:\HDL\Xilinx\SDx\2016.3\samples\mmult_pipelined から mmult.cpp, mmult_accel.cpp, mmult_accel.h を async_wait_zybo プロジェクトの src フォルダにコピー&ペーストした。
SDx_v2016_3_tut_25_170119.png

Active build configuration を Release に設定し、HW function に mmult_accel を指定して、ビルド・ボタンをクリックした。
SDx_v2016_3_tut_26_170119.png

エラーが出た。やはり、Zynq-7010 ではリソースが足りないようだ。
SDx_v2016_3_tut_27_170119.png

mmult_accel.h を開いて #define N 32 を #define N 16 に書き換えた。
SDx_v2016_3_tut_28_170119.png

もう一度、ビルド・ボタンをクリックしてビルドを行ったら成功した。
SDx_v2016_3_tut_29_170119.png

このチュートリアルでは、Figure 2 に示すように通常はシーケンシャルにうハードウェアのアクセラレーションを行う。
SDx_v2016_3_tut_30_170119.png
SDSoC Environment Tutorial: Introduction UG1028 (v2016.3) November 30, 2016”の35ページのFigure 2: Sequential Execution of Matrix Multiply Calls を引用

パイプラインされたアクセレーターの実行のために、async(id), と wait(id) プラグマを使用してコードを書き直す必要があるそうだ。
その記述を示す。
SDx_v2016_3_tut_31_170119.png

pipeline_depth がパイプラインの数を示していて、最初にパイプライン数のmmult_accel() を発行して、その後は1つのパイプラインが終わったら、次のmmult_accel() を発行する。発行が終了したら、SDS wait(1) でパイプライン数だけの完了を待つ。そのようなプログラムになっているようだ。
その概念図は、Figure 3 に示されている。
SDx_v2016_3_tut_32_170119.png
SDSoC Environment Tutorial: Introduction UG1028 (v2016.3) November 30, 2016”の36ページのFigure 3: Pipelined Execution of Matrix Multiply Calls を引用

パイプライン実行のためには、引数の配列をコピーするためのマルチバッファが必要とのことだ。これは、mmult_accel.cpp の float _A[N][N], _B[N][N] のことだろうと思っている。
SDx_v2016_3_tut_33_170119.png

ビルドした SDカードのイメージをZYBO にSFTP して起動した。
./async_wait_zybo 1 を実行した。これは順次実行だ。
SDx_v2016_3_tut_34_170119.png

値が安定しない。SW/HW が 1.05 倍から2.73 倍でばらついている。

./async_wait_zybo 2 を実行した。これは2つのパイプラインによるパイプライン実行だ。
SDx_v2016_3_tut_35_170119.png

やはり、こちらも値が安定しない。

残念な結果になってしまったが、Vivado のレポートを示す。
SDx_v2016_3_tut_36_170119.png

Vivado のブロックデザインを示す。
SDx_v2016_3_tut_37_170119.png

Vivado HLSを示す。
SDx_v2016_3_tut_38_170119.png
  1. 2017年01月19日 12:32 |
  2. SDSoC
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3699-15f15a52
この記事にトラックバックする(FC2ブログユーザー)