このチュートリアルで使用される C アプリケーションは、提供されているフィルター係数と RGBA ビデオのセットの 2D たたみ込みを実行します。アプリケーションは ffmpeg を使用して入力および出力ビデオ ストリームを作成します。これが入力ビデオの各フレームを読み込んで該当する処理済フレームに書き出すためのパイプとして使用されます。
この手順では、このアプリケーションをビルドして実行し、アクセラレーション前の元のアプリケーションの基準となるパフォーマンス データを作成します。元のアプリケーションの出力はゴールデン データとしても保存し、ハードウェア アクセラレーションされたアプリケーションの出力と比較して検証するために使用します。
-
元のアプリケーション コードを含む
cpu_src
ディレクトリに移動します。 -
次の
make
コマンドを実行します。cd convolution-tutorial/design/cpu_src make
このコマンドを実行すると、C ソース コードがコンパイルされ、convolve
実行ファイルが作成されます。実行ファイルには、ビデオ ファイル (この場合はプロジェクト ルート ディレクトリにあります) へのパスが必要です。
ヒント: この演習で使用される makefile には、多くの手順と変数が含まれます。makefile の構造および内容については、makefile の理解を参照してください。
この手順では、次のコマンドで元の C アプリケーションを別の形式の指定された入力ビデオ ファイルを使用して実行して、比較目的のゴールデン出力ファイルを生成します。
cd convolution-tutorial/design/cpu_src
make golden
生成された最初の出力ファイル golden_out_full.mp4
は 132 フレームのフル動画で、各フレームは 1980x1080 ピクセルです。このゴールデン出力ファイルは、アプリケーションがハードウェアでかなりすばやく実行できるので、すべてのハードウェア実行に使用されますが、エミュレーションの場合は、よりすばやく結果を出すために、1 つのフレームのみを含む小さなファイルを使用します。
次は、生成されたゴールデン出力ファイルのサマリです。
golden_out_full.mp4
: ハードウェアで実行される場合のアクセラレーションされたアプリケーションのテストに使用。golden_out_small.mp4
: 「手順 5: 順不同キューと複数の計算ユニットの使用」以外のソフトウェアおよびハードウェア エミュレーション実行のテストに使用。golden_out_small_40.mp4
: 「手順 5: 順不同キューと複数の計算ユニットの使用」のテストに使用。
『SDAccel 設計手法ガイド』 (UG1346) で説明するように、gprof
ツールを使用すると、アプリケーションをプロファイリングして、アクセラレーション可能な関数を見つけることができます。
-
gcc コマンド ラインに
-pg
オプションを追加します。これには既にMakefile
に含まれています。 -
ディレクトリを
cpu_src
フォルダーに変更して、make
で実行ファイルを生成します。cd cpu_src
-
実行ファイルを実行します。
./convolve --gray true ../video.mp4
-
プロファイル結果を抽出します。
gprof convolve gmon.out> gprofresult.txt
-
プロファイル サマリ レポートを表示するには、テキスト エディターで
gprofresult.txt
ファイルを開きます。次の表のような結果になるはずです。各サンプルは 0.01 秒でカウントされます。
時間の割合 (%) 累積秒数 それだけの秒数 呼び出し合計 ms/呼び出し ms/呼び出し 名前 95.29 7.28 7.28 132 55.15 55.15 convolve_cpu 4.85 7.65 0.37 132 2.81 2.81 grayscale_cpu 0.00 7.65 0.00 132 0.00 0.00 print_progress(int, int) 0.00 7.65 0.00 1 0.00 0.00 GLOBAL__sub_I_default_output レポートには、convolve_cpu に実行時間の 95% が使用されていることが示されますので、この関数をアクセラレーションすると、パフォーマンス全体がかなり改善することになります。
ほとんどの FPGA アクセラレーション システムで、達成可能な最大スループットは PCIe® バスによって制限されます。PCIe のパフォーマンスは、マザーボード、ドライバー、ターゲット シェル、転送サイズなどのさまざまな要因の影響を受けます。SDAccel 環境に含まれる xbutil
ユーティリティを使用して xbutil dmatest
コマンドを実行すると、達成可能な最大 PCIe 帯域幅を測定できます。デザイン ターゲットのスループットは、この上限を超えることができません。
CPU では、1 つの 1080 p フレームを処理するのに 55.15 ms かかります。これは、つまり毎秒 1000/55.15 = 18.13 フレームのパフォーマンスを達成していることを意味します。目標はアプリケーションが 30fps の最小のリアルタイム パフォーマンスを達成することなので、CPU と比べて ~2x の係数でアクセラレーションする必要があります。
フレームのサイズが 1920 x 1080 x 4 バイト = 8.29 MB だとすると、アクセラレーションされたアプリケーションの最小スループットは 8.29 MB x 30 fps = 249 MB/s になります。
このスループット目標は、Alveo カードの最大の達成可能なスループットの範囲内になります。このチュートリアルでは、この目標を達成するプロセスをお見せします。
ここまでで、元のアプリケーションからアクセラレーションする関数を見つけて、パフォーマンス目標を作成しました。次の演習では、元の convolve
関数のベースラインを作成してハードウェアで実行し、一連のホストおよびカーネル コード最適化を実行して、パフォーマンス目標を満たします。これは、元のアプリケーションから SDAccel アプリケーションを作成するところから開始します。
ハードウェア エミュレーションを使用して、各ステップのパフォーマンスを測定します。最後に、これらすべてをハードウェアで実行して、パフォーマンスが各ステップでどれだけ改善されたかを確認します。
Copyright© 2019 Xilinx