English | 日本語
その他のバージョンを表示
|
このチュートリアルでは、FPGA 上のカーネル インスタンスの数を増やすための柔軟なカーネル リンク プロセスを示します。カーネルの各インスタンスは、計算ユニット (CU) とも呼ばれます。CU 数を増加するこのプロセスを使用すると、統合されたホスト/カーネル システムの並列処理が向上します。
デフォルトでは、SDAccel™ はカーネルごとに CU を 1 つ作成します。ホスト プログラムは、異なるデータ セットに対して同じカーネルを複数回使用できます。この場合、カーネルに対して複数の CU を生成して、これらの CU を同時実行すると、システム全体のパフォーマンスを向上できます。
詳細は、『SDAccel プログラマ ガイド』 (UG1277) の「カーネルの複数インスタンス」を参照してください。
このチュートリアルでは、次を実行します。
- ハードウェア エミュレーションを実行し、エミュレーション レポートを参照して、カーネルが順に複数回実行されることを確認します。
- コマンドを順不同に実行できるようにホスト コードを変更します。
- カーネル リンク プロセスを変更し、同じカーネルの CUを複数作成します。
- ハードウェア エミュレーションを再実行し、CU が同時実行されることを確認します。
このチュートリアルでは、画像フィルター例を使用して複数 CU の利点を示します。ホスト アプリケーションは、画像を処理して Y、U、および V プレーンを抽出し、カーネルを 3 回実行して画像の各プレーンをフィルター処理します。デフォルトでは、FPGA にはカーネルの CU が 1 つしか含まれないので、これら 3 つのカーネルは同じハードウェア リソースを使用して順次実行されます。このチュートリアルでは、CU の数を増加し、このカーネル実行を並列で実行する方法を示します。
このチュートリアルでは、次を使用します。
- BASH Linux シェル コマンド
- 2019.1 SDx リリースおよび xilinx_u200_xdma_201830_1 プラットフォーム。必要であれば、その他のバージョンおよびプラットフォームも使用できます。
重要:
- リファレンス ファイルを入手するには、ターミナルに
git clone http://github.com/Xilinx/SDAccel-Tutorialsと入力します。 SDAccel-Tutorials-master/docs/using-multiple-cu/reference-filesに移動します。
このチュートリアルで使用する makefile は、using-multiple-cu/reference-files/Makefile に含まれます。最上位設定には、次が含まれます。
-
XOCC: カーネル コードをコンパイルする XOCC コンパイラ パス。
-
EMCONFIGUTIL: エミュレーション コンフィギュレーション ファイル
emconfig.jsonを作成するユーティリティ ファイルのパス。 -
DSA: ターゲット プラットフォーム。
-
NKERNEL: XOCC コンパイラ リンカー オプションの
--nkで使用される CU のカーネル名:CU 数。 -
KERNEL_XO: このチュートリアルで使用するカーネル コードは、既にコンパイル済みのオブジェクト ファイル (XO) です。
Filter2DKernel.xoファイルは C/C++ または RTL のいずれかから生成可能で、これらはコンパイルされたオブジェクト コードから開始する場合は基本的に同じです。XO ファイルから開始しても、リンク プロセスをカスタマイズすることは可能です。 -
LFLAGS: ホスト コード リンカー オプション用に OpenCV™ ライブラリを使用するリンカー オプションを示します。
-L${XILINX_SDX}/lnx64/tools/opencv -lopencv_core -lopencv_highgui -Wl,-rpath,${XILINX_SDX}/lnx64/tools/opencv -
EXE_OPT: コマンド ライン引数として渡されるランタイム オプション: コンパイル済みカーネル xclbin ファイル, 入力画像。
次のコマンドでハードウェア エミュレーションを実行します。
make check MODE=hw_emu
ハードウェア エミュレーション (hw_emu) では、カーネル コードがハードウェア モデル (RTL) にコンパイルされ、専用シミュレータで実行されますが、残りのシステムは C シミュレータを使用します。ビルドおよび実行にかかる時間は長くなりますが、詳細でサイクル認識のカーネル アクティビティが表示されます。このターゲットは、FPGA に含まれるロジックの機能をテストして、最初のパフォーマンス見積もりを得る場合に便利です。
注記: ホスト ソフトウェアおよびハードウェアのビルド方法は、アプリケーションのビルド演習を参照してください。
-
エミュレーション run を実行中、別のターミナルで
src/host/host.cppファイルを開きます。 -
255 ~ 257 行目を確認してください。Y、U、および V チャネルを処理するためにフィルター関数が 3 回呼び出されています。
request[xx*3+0] = Filter(coeff.data(), y_src.data(), width, height, stride, y_dst.data()); request[xx*3+1] = Filter(coeff.data(), u_src.data(), width, height, stride, u_dst.data()); request[xx*3+2] = Filter(coeff.data(), v_src.data(), width, height, stride, v_dst.data());この関数は、80 行目から記述されています。下の抜粋部分で、カーネル引数が設定され、カーネルが
clEnqueueTaskコマンドにより実行されます。// Set the kernel arguments clSetKernelArg(mKernel, 0, sizeof(cl_mem), &mSrcBuf[0]); clSetKernelArg(mKernel, 1, sizeof(cl_mem), &mSrcBuf[1]); clSetKernelArg(mKernel, 2, sizeof(unsigned int), &width); clSetKernelArg(mKernel, 3, sizeof(unsigned int), &height); clSetKernelArg(mKernel, 4, sizeof(unsigned int), &stride); clSetKernelArg(mKernel, 5, sizeof(cl_mem), &mDstBuf[0]); // Schedule the writing of the inputs clEnqueueMigrateMemObjects(mQueue, 2, mSrcBuf, 0, 0, nullptr, &req->mEvent[0]); // Schedule the execution of the kernel clEnqueueTask(mQueue, mKernel, 1, &req->mEvent[0], &req->mEvent[1]);これら 3 つの
clEnqueueTaskコマンドは、1 つの順序どおりのコマンド キューを使用してキューに追加されます (75 行目)。この結果、このコマンド キューを使用するすべてのコマンドは、キューに追加された順序で実行されます。Filter2DDispatcher( cl_device_id &Device, cl_context &Context, cl_program &Program ) { mKernel = clCreateKernel(Program, "Filter2DKernel", &mErr); mQueue = clCreateCommandQueue(Context, Device, CL_QUEUE_PROFI LING_ENABLE, &mErr); mContext = Context; mCounter = 0; }
-
まず、生成されたプロファイル サマリ レポート (
profile_summary.csv) を確認します。次のコマンドを実行し、プロファイル サマリ レポート ファイルを HTML 形式に変換します。
sdx_analyze profile -i profile_summary.csv -f html- このレポートには、アプリケーションがどうのように実行されたかに関連するデータが表示されます。
- 「Top Kernel Execution」セクションを見ると、カーネルが 3 回実行されていることがわかります。
注記: run ディレクトリには、
sdaccel.iniというファイルが含まれます。このファイルには、プロファイル サマリ レポートおよびタイムライン トレースなどの追加レポートを生成するランタイム オプションが含まれています。 -
次にタイムライン トレース レポート (
timeline_trace.csv) を確認します。このレポートを GUI で確認するには、次のコマンドを使用してファイルを波形データベース (WDB) 形式に変換します。sdx_analyze trace -i timeline_trace.csv -
SDx 環境 GUI を実行するには、次のコマンドを入力します。
sdx -report timeline_trace.wdbアプリケーション タイムライン レポートは、ホストとデバイスのイベント情報を収集し、共通のタイムラインに表示します。これは、システムの全体的な状態とパフォーマンスを視覚的に表示して理解するのに役立ちます。
-
75 行目の
src/host/host.cppホスト ファイルを変更します。
これはコマンド キューを順不同コマンド キューとして宣言します。コード変更前:
mQueue = clCreateCommandQueue(Context, Device, CL_QUEUE_PROFILING_ENABLE, &mErr);コード変更後:
mQueue = clCreateCommandQueue(Context, Device, CL_QUEUE_PROFILING_ENABLE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &mErr); -
(オプション) 変更したホスト コードでハードウェア エミュレーションを実行します。
ハードウェア エミュレーションを実行する場合、タイムライン トレースを使用して、順不同コマンド キューを使用することによりカーネルがほぼ同時に実行されるように要求できます (青のバーはホストでスケジュールされるカーネル エンキュー リクエストを示しています)。
ホストはこれらの実行を同時にスケジューリングできますが、FPGA 上には 1 つしか CU がないので、2 つ目および 3 つ目の実行要求が遅れます (FPGA ではカーネルはまだ順次実行されるので)。
次の手順では、FPGA 上の CU の数を増やして、ホスト カーネルを同時に実行できるようにします。
次は、同じカーネルの CU を 3 つ生成するようにリンク手順を変更して、カーネル xclbin をビルドし直します。
makefile を開いて NKERNEL 設定を変更します。NKERNEL 変数は XOCC リンク ステージの --nk オプションで使用されます。
NKERNEL := Filter2DKernel:3
-
xclbin ファイルを生成し直します。
make cleanおよびmakeを実行して 1 つの CU を含む既存の xclbin を削除してから、3 つのカーネル CU を含む新しい xclbin を作成する必要があります。make clean make check MODE=hw_emu -
新しい
timeline_trace.csvファイルを WBD 形式に変換し、SDx 環境 GUI で開いて、前と同じ手順を実行します。sdx_analyze trace -i timeline_trace.csv sdx -report timeline_trace.wdbアプリケーションが
--nkオプションで作成した 3 つの CU の利点を生かし、カーネル実行がオーバーラップして並列で実行されるようになって、アプリケーション全体の速度が上がるようになりました。
カーネル リンク プロセスを変更して、FPGA 上の同じカーネル インスタンスを同時に実行する方法を学びました。
Copyright© 2019 Xilinx
