English | 日本語
その他のバージョンを表示 |
SDAccel™ 開発環境フレームワークでは、アプリケーション プログラムがホスト アプリケーションとハードウェア アクセラレーションされたカーネル間で分割されます。ホスト アプリケーションは OpenCL™ API 呼び出しを使用して C/C++ で開発されますが、 ハードウェア カーネルは C/C++、OpenCL C、または RTL で開発されます。実際のところ、SDAccel アプリケーションでは、異なる言語で開発したカーネルをどの組み合わせでも使用できます。ホスト コードは、カーネルの開発方法には関係ありませんが、同じ関数呼び出しを使用します。
このチュートリアルでは、C++ で設計されたカーネルと RTL で設計されたカーネルの 2 つのカーネルを使用するアプリケーションについて説明します。ホスト コードは、これらのカーネルに同じようにアクセスします。
このチュートリアルは、次の 2 つのセクションに分割されます。
- まずは、1 つの C++ ベース カーネルを使用してアプリケーション (ホストおよびカーネル) をビルドし、カーネル関数呼び出しも含めたホスト コードを確認します。
- 次に、RTL ベースのカーネルをアプリケーションに追加し、 追加カーネルへの関数呼び出しも含め、アップデートしたホスト コードを確認します。
どちらの手順でも、アプリケーションは makefile を使用してビルドされます。 ソフトウェア エミュレーションは手順 1 で、ハードウェア エミュレーションは手順 2 で実行します。 どちらの手順でも、生成されたアプリケーション タイムラインを確認し、カーネルがホスト アプリケーションから呼び出されて実行されることを確認します。
ホスト コードと C++ カーネル コードは提供されます。RTL コードは RTL Kernel ウィザードで生成します。
このチュートリアルでは、次を使用します。
- BASH Linux シェル コマンド
- 2019.1 SDx™ リリースおよび xilinx_u200_xdma_201830_1 プラットフォーム。必要であれば、その他のバージョンおよびプラットフォームも使用できます。
重要:
サンプルを実行する前に、次のコマンドを実行して SDx ツール、プラットフォーム、ランタイムが設定済みであること確認します。
#setup Xilinx SDx tools, XILINX_SDX and XILINX_VIVADO will be set in this step. source <SDX install path>/settings64.sh. for example:
source /opt/Xilinx/SDx/2019.1/settings64.sh
#Setup runtime. XILINX_XRT will be set in this step
source /opt/xilinx/xrt/setup.sh
- リファレンス ファイルを入手するには、ターミナルに
git clone https://github.com/Xilinx/SDAccel-Tutorials
と入力します。 SDAccel-Tutorials-master/docs/mixing-c-rtl-kernels/reference-files
に移動します。
この手順では、makefile を使用してホスト コードと C++ カーネルを含むアプリケーションをビルドします。
アプリケーションのビルドに関する概要は、アプリケーションのビルドを参照してください。
C ベースのカーネルは 2 つの入力ベクターを追加し、出力を生成します。ソース コードは、次のディレクトリに含まれます。
./reference-files/src/kernel_cpp/
makefile はこのカーネルをビルドし、ホスト コードからアクセス可能なハードウェア プラットフォーム (xclbin) に追加します。
手順 1 のホスト コード (host_step1.cpp
) は、次のディレクトリに含まれます。
./reference-files/src/host/
このホスト コードは、プラットフォームを設定し、グローバル メモリ バッファーを定義してカーネルに接続します。このホスト コードには、次に説明する 4 つの OpenCL API 呼び出しがあります。host_step1.cpp
ファイルを開いてこれらの呼び出しを表示します。
-
1 つ目は 189 ~ 191 行目のコードで、実行するプログラムを作成します。C++ ベース カーネルのみを含むバイナリ コンテナーが使用されます。
cl::Program::Binaries bins; bins.push_back({buf,nb}); cl::Program program(context, devices, bins);
-
2 つ目は 195 行目のコードで、プログラムから C++ の krnl_vadd カーネル オブジェクトを取得し、krnl_vector_add という名前を付けます。これにより、ホストがカーネルを使用できるようになります。
cl::Kernel krnl_vector_add(program,"krnl_vadd");
-
3 つ目は 213 ~ 216 行目のコードで、krnl_vector_add カーネル引数をバッファーに割り当てます。
krnl_vector_add.setArg(0,buffer_a); krnl_vector_add.setArg(1,buffer_b); krnl_vector_add.setArg(2,buffer_result); krnl_vector_add.setArg(3,DATA_SIZE);
-
引数の番号 0、1、2、3 は、
krnl_vadd.cpp
に含まれる次のkrnl_vadd
定義引数の順序と同じです。注記: 引数
a
およびb
は入力で、c
が出力です。void krnl_vadd( int* a, int* b, int* c, const int n_elements)
-
4 つ目は 220 目のコードで、次の OpenCL API により krnl_vector_add カーネルが起動します。
q.enqueueTask(krnl_vector_add);
ホスト コードのプログラムに関する詳細は、『SDAccel プログラマ ガイド』 (UG1277) を参照してください。
-
ソフトウェア エミュレーションをターゲットにするアプリケーションをビルドするには、
./reference-files/run1
ディレクトリから次の makefile を実行します。make all TARGET=sw_emu
これで、ホスト ソフトウェアと、ソフトウェア エミュレーションをターゲットにするハードウェア バイナリの両方がビルドされます。この makefile はエミュレーション中に使用するプラットフォーム JSON エミュレーション ファイルも生成します。
エミュレーション中は、ホストおよびデバイス イベントを含むアプリケーション タイムライン データが集められます。これはエミュレーションが終了した後に確認できます。アプリケーション タイムライン データの収集は、エミュレーションを実行する前に、xrt.ini
ファイルで timeline_trace=true オプションを設定してイネーブルにしておく必要があります。
[Debug]
profile=true
timeline_trace=true
このファイルは既に作成されており、run1
および run2
ディレクトリに含まれます。
-
デザインでソフトウェア エミュレーションを実行するには、次のコマンドを実行するように XCL_EMULATION_MODE 環境変数を設定します。
export XCL_EMULATION_MODE=sw_emu
-
run1
ディレクトリ内からソフトウェア エミュレーションを実行するには、次のコマンドを実行します。./host krnl_vadd.sw_emu.xilinx_u200_xdma_201830_1.xclbin
アプリケーションが問題なく終了したら、[Console] ウィンドウに次のメッセージが表示されます。
TEST WITH ONE KERNEL PASSED
ソフトウェア エミュレーション中に生成されたアプリケーション タイムラインを確認し、ホスト イベントと実行中のカーネルを可視化します。
-
アプリケーション タイムラインを表示するには、
run1
ディレクトリ内から次のコマンドを実行して、CSV ファイルから波形ファイルを作成します。sdx_analyze trace -f wdb -i ./timeline_trace.csv
-
SDx を使用して生成したタイムライン トレース波形ファイルを開くには、
run1
ディレクトリ内から次のコマンドを実行します。sdx -workspace workspace -report timeline_trace.wdb
[Device] → [Binary Container] の下に、「Compute Unit krnl_vadd_1」という行があります
-
そのタイムラインをたどり、計算ユニット krnl_vadd_1 を拡大し、
running
と表示されていることを確認します。
-
確認したら、[Application Timeline] ビューを閉じます。
注記: 計算ユニットは、FPGA 上のカーネルのインスタンシエーションです。
手順 1 では、次を実行しました。すべてのコマンドを ./reference-files/run1
ディレクトリで実行しました。
# Build the application
make all TARGET=sw_emu
# Set XCL_EMULATION_MODE environment variable for software emulation
export XCL_EMULATION_MODE=sw_emu
# Run software emulation
./host krnl_vadd.sw_emu.xilinx_u200_xdma_201830_1.xclbin
# Create timeline waveform and view in SDx
sdx_analyze trace -f wdb -i ./timeline_trace.csv
sdx -workspace workspace -report timeline_trace.wdb
ここまでで、C++ ベースのカーネルを使用してアプリケーションを問題なくビルドして実行したので、次はアプリケーションをアップデートして RTL ベースのカーネルを含めます。
前のセクションと同様、ビルドして、エミュレーションした後、生成したアプリケーション タイムラインを確認します。カーネルがどのように設計されたかに関係なく、カーネルがビルドされた後、ホスト コードは同様の関数呼び出しを使用してカーネルにアクセスします。
まず、RTL Kernel ウィザードを使用して RTL ベースのカーネルを作成してパッケージします。デフォルトでは、1 ずつ増加するカーネルが作成されます。このチュートリアルでは、このカーネルを使用します。また、ウィザードでは RTL デザインをカーネル オブジェクト ファイル (XO) にパッケージするために必要な手順が自動化されます。
RTL Kernel ウィザードの手順に従うと、詳細な設定をせずにすばやく RTL ベースのカーネルを生成できます。詳細は、RTL カーネル入門の RTL Kernel ウィザードの記述を参照してください。RTL Kernel ウィザードのすべての詳細は、『SDAccel 環境ユーザー ガイド』 (UG1023) を参照してください。
- コマンド ラインに
sdx
と入力して SDAccel 環境 GUI を開きます。 - ワークスペース ディレクトリに ./mixing-c-rtl-kernels/workspace を選択し、[Launch] をクリックします。
- [Create Application Project] をクリックし、「
rtl_project
」と入力し、[Next] をクリックします。 - xilinx_u200_xdma_201830_1 プラットフォームを選択して [Next] をクリックします
- [Templates] から [Empty Application] を選択し、[Finish] をクリックします。これで SDAccel 環境プロジェクトが作成されます。
次に、SDACcel 環境プロジェクト内から RTL ベースのカーネルを生成します。
- [Xilinx] → [RTL Kernel Wizard] をクリックします。
RTL Kernel ウィザードの Welcome ページが開きます。 - [Next] をクリックします。
- [General Settings] ページで、デフォルト設定のままにして [Next] をクリックします。
- [Scalars] ページで、スカラー引数の数を
0
に設定し、[Next] をクリックします。 - [Global Memory] ページで、デフォルト設定のままにして [Next] をクリックします。
- [Streaming Interfaces] ページで、デフォルト設定のままにして [Next] をクリックします。
[Summary] ページに、RTL カーネル設定のサマリが示され、呼び出しが C 関数としてどのように見えるかを示す関数プロトタイプが含まれます。 - [OK] をクリックします。
これで RTL カーネル ソース ファイルが作成されました。
この段階では、Vivado Design Suite はデフォルトの A = A + 1
関数に該当する RTL コードを生成したプロジェクトが自動的に開きます。 ソース ファイルを確認したり、RTL シミュレーションを実行したりできますが、 このチュートリアルでは、デフォルトの RTL カーネルは変更せずに、オブジェクト ファイル (XO) にパッケージします。
-
[Generate RTL Kernel] ダイアログ ボックスで、パッケージ オプションに [Sources-only] を選択します。
-
[Software Emulation Sources] には、ソフトウェア エミュレーションで使用する RTL カーネルの C++ モデルを追加できます。
C++ モデルは、設計エンジニアがコード記述する必要があります。通常 C++ モデルはなく、デザインのテストにはハードウェア エミュレーションが使用されます。RTL Kernel ウィザードでは vadd デザインの C++ モデルが作成されるので、このファイルを追加する手順も示します。
-
[…] (参照ボタン) をクリックします。
-
imports
ディレクトリをダブルクリックします。 -
CPP ファイル (.cpp) のみを選択し、[OK] をクリックします。
-
[OK] をクリックして RTL カーネルを生成します。
-
RTL カーネルが生成されたら、[Yes] をクリックして Vivado Design Suite を閉じ、SDAccel 環境に戻ります。
「RTL Kernel has been imported」と表示されます。
-
[OK] をクリックします。
-
SDAccel ツールを終了します。
ここまでで、RTL カーネルを次のディレクトリの sdx_kernel_wizard_0.xo
オブジェクト ファイルにパッケージしました。
./mixing-c-rtl-kernels/workspace/rtl_project/src/sdx_rtl_kernel/sdx_kernel_wizard_0
RTL ベース カーネルにアクセスするには、ホスト コードをアップデートする必要があります。 アップデートは、次のディレクトリの host_step2.cpp
ファイルで実行しました。
./reference-files/src/host/
アップデートには、次に簡単に示した追加の OpenCL API 呼び出しが含まれます。この追加の OpenCL 呼び出しは、C++ ベース カーネルに使用されるものと同じで、引数が RTL ベース カーネル用に変更されているだけです。
cl::Program::Binaries bins;
bins.push_back({buf,nb});
cl::Program program(context, devices, bins);
次のコードでは、プログラムから sdx_kernel_wizard_0
オブジェクトを取得し、198 行目で「krnl_const_add」という名前を割り当てています。sdx_kernel_wizard_0
オブジェクト名は、RTL Kernel ウィザードで生成された名前と同じです。
cl::Kernel krnl_const_add(program,"sdx_kernel_wizard_0");
次に、219 行目で krnl_const_add カーネル引数を定義します。
注記: ホスト コードでは、
buffer_result
バッファーは C カーネルから DDR を介して RTL カーネルに渡され、ホスト メモリには戻されません。
krnl_const_add.setArg(0,buffer_result);
222 行目で krnl_const_add カーネルを起動します。
q.enqueueTask(krnl_const_add);
RTL ベース カーネルを追加し、ホスト コードをアップデートした状態で、run2
ディレクトリのアップデートした makefile を使用して、ハードウェア エミュレーションをターゲットにしたアプリケーションをビルドします。makefile は、CPP と RTL ベースのカーネルをハードウェア プラットフォーム ファイル (xclbin) の両方を追加するようにアップデートされています。
-
./mixing-c-rtl-kernels/reference-files/run2
ディレクトリに移動します。 -
ハードウェア エミュレーションをターゲットにするアプリケーションをビルドするには、
./reference-files/run2
ディレクトリから次の makefile を実行します。make all TARGET=hw_emu
前と同様、
run2
ディレクトリ内から次のコマンドを実行して、エミュレーションを実行し、アプリケーション タイムラインを生成して確認します。 -
ハードウェア エミュレーションのための XCL_EMULATION_MODE 環境変数を設定します。
export XCL_EMULATION_MODE=hw_emu
-
ハードウェア エミュレーションを実行します。
./host krnl_vadd.hw_emu.xilinx_u200_xdma_201830_1.xclbin
-
CSV ファイルから波形ファイルを作成します。
sdx_analyze trace -f wdb -i ./timeline_trace.csv
-
生成したタイムライン トレース波形ファイルを開きます。
sdx -workspace workspace -report timeline_trace.wdb
-
[Device] → [Binary Container] の下のタイムラインをたどり、拡大表示します。計算ユニット krnl_vadd_1 および sdx_kernel_wizard_0_1 が実行されているのがわかります。
-
確認したら、[Application Timeline] ビューを閉じます。
SDAccel アプリケーションは、開発した言語に関係なく、どの組み合わせのカーネルでも使用できます。
CPP エミュレーション ファイルが RTL カーネルと一緒にパッケージされたので (RTL Kernel ウィザードを使用して)、ソフトウェア エミュレーションも実行できます。 ソフトウェア エミュレーションは、次の手順で実行できます。
# Build the application
make all TARGET=sw_emu
# Set XCL_EMULATION_MODE environment variable for software emulation
export XCL_EMULATION_MODE=sw_emu
# Run software emulation
./host krnl_vadd.sw_emu.xilinx_u200_xdma_201830_1.xclbin
# Create timeline waveform and view in SDx
sdx_analyze trace -f wdb -i ./timeline_trace.csv
sdx -workspace workspace -report timeline_trace.wdb
-
アプリケーションをビルドし、エミュレーションを実行し、プロファイルおよびトレース レポートを生成する方法を理解するため、アクセラレーションされたアプリケーションをビルドして実行するための基本的な概念チュートリアルを参照してください。
-
RTL Kernel ウィザードの詳細は、次を参照してください。
- RTL カーネル入門チュートリアル。
- 『SDAccel 環境ユーザー ガイド』 (UG1023 の「RTL Kernel ウィザード」セクション)。
Copyright© 2019 Xilinx
この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきましては、必ず最新英語版をご参照ください。