Skip to content

Latest commit

 

History

History
392 lines (256 loc) · 22.6 KB

File metadata and controls

392 lines (256 loc) · 22.6 KB

English | 日本語

2019.1 SDAccel™ 開発環境チュートリアル

その他のバージョンを表示

C++ と RTL カーネルの混合

概要

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 プラットフォーム。必要であれば、その他のバージョンおよびプラットフォームも使用できます。

重要:

  • サンプル ファイルを実行する前に、『SDAccel 開発環境リリース ノート、インストール、およびライセンス ガイド』 (UG1238) で説明されるように、ザイリンクス ランタイム (XRT) と SDAccel 開発環境ツールをインストールしてください。
  • Alveo™ カードでアプリケーションを実行する場合は、『Alveo データセンター アクセラレータ カード入門ガイド (UG1301) で説明されるように、カードとソフトウェア ドライバーを正しくインストールしてください。

サンプルを実行する前に、次のコマンドを実行して 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

チュートリアル リファレンス ファイルの入手

  1. リファレンス ファイルを入手するには、ターミナルに git clone https://github.com/Xilinx/SDAccel-Tutorials と入力します。
  2. SDAccel-Tutorials-master/docs/mixing-c-rtl-kernels/reference-files に移動します。

C++ ベースのカーネルを使用したアプリケーションのビルド

この手順では、makefile を使用してホスト コードと C++ カーネルを含むアプリケーションをビルドします。

アプリケーションのビルドに関する概要は、アプリケーションのビルドを参照してください。

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) を参照してください。

アプリケーションのビルド

  1. ソフトウェア エミュレーションをターゲットにするアプリケーションをビルドするには、./reference-files/run1 ディレクトリから次の makefile を実行します。

    make all TARGET=sw_emu

    これで、ホスト ソフトウェアと、ソフトウェア エミュレーションをターゲットにするハードウェア バイナリの両方がビルドされます。この makefile はエミュレーション中に使用するプラットフォーム JSON エミュレーション ファイルも生成します。

エミュレーションの実行

エミュレーション中は、ホストおよびデバイス イベントを含むアプリケーション タイムライン データが集められます。これはエミュレーションが終了した後に確認できます。アプリケーション タイムライン データの収集は、エミュレーションを実行する前に、xrt.ini ファイルで timeline_trace=true オプションを設定してイネーブルにしておく必要があります。

[Debug]
profile=true
timeline_trace=true

このファイルは既に作成されており、run1 および run2 ディレクトリに含まれます。

  1. デザインでソフトウェア エミュレーションを実行するには、次のコマンドを実行するように XCL_EMULATION_MODE 環境変数を設定します。

    export XCL_EMULATION_MODE=sw_emu
  2. run1 ディレクトリ内からソフトウェア エミュレーションを実行するには、次のコマンドを実行します。

    ./host krnl_vadd.sw_emu.xilinx_u200_xdma_201830_1.xclbin

    アプリケーションが問題なく終了したら、[Console] ウィンドウに次のメッセージが表示されます。

    TEST WITH ONE KERNEL PASSED

アプリケーション タイムラインの確認

ソフトウェア エミュレーション中に生成されたアプリケーション タイムラインを確認し、ホスト イベントと実行中のカーネルを可視化します。

  1. アプリケーション タイムラインを表示するには、run1 ディレクトリ内から次のコマンドを実行して、CSV ファイルから波形ファイルを作成します。

    sdx_analyze trace -f wdb -i ./timeline_trace.csv
    
  2. SDx を使用して生成したタイムライン トレース波形ファイルを開くには、run1 ディレクトリ内から次のコマンドを実行します。

    sdx -workspace workspace -report timeline_trace.wdb
    

    [Device][Binary Container] の下に、「Compute Unit krnl_vadd_1」という行があります

  3. そのタイムラインをたどり、計算ユニット krnl_vadd_1 を拡大し、running と表示されていることを確認します。
    Missing Image:Application Timeline 1

  4. 確認したら、[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 ベースのカーネルを使用したアプリケーションのビルド

ここまでで、C++ ベースのカーネルを使用してアプリケーションを問題なくビルドして実行したので、次はアプリケーションをアップデートして RTL ベースのカーネルを含めます。

前のセクションと同様、ビルドして、エミュレーションした後、生成したアプリケーション タイムラインを確認します。カーネルがどのように設計されたかに関係なく、カーネルがビルドされた後、ホスト コードは同様の関数呼び出しを使用してカーネルにアクセスします。

RTL ベースのカーネル

まず、RTL Kernel ウィザードを使用して RTL ベースのカーネルを作成してパッケージします。デフォルトでは、1 ずつ増加するカーネルが作成されます。このチュートリアルでは、このカーネルを使用します。また、ウィザードでは RTL デザインをカーネル オブジェクト ファイル (XO) にパッケージするために必要な手順が自動化されます。

RTL Kernel ウィザードの手順に従うと、詳細な設定をせずにすばやく RTL ベースのカーネルを生成できます。詳細は、RTL カーネル入門の RTL Kernel ウィザードの記述を参照してください。RTL Kernel ウィザードのすべての詳細は、『SDAccel 環境ユーザー ガイド』 (UG1023) を参照してください。

SDAccel プロジェクトの作成

  1. コマンド ラインに sdx と入力して SDAccel 環境 GUI を開きます。
  2. ワークスペース ディレクトリに ./mixing-c-rtl-kernels/workspace を選択し、[Launch] をクリックします。
  3. [Create Application Project] をクリックし、「rtl_project」と入力し、[Next] をクリックします。
  4. xilinx_u200_xdma_201830_1 プラットフォームを選択して [Next] をクリックします
  5. [Templates] から [Empty Application] を選択し、[Finish] をクリックします。これで SDAccel 環境プロジェクトが作成されます。

次に、SDACcel 環境プロジェクト内から RTL ベースのカーネルを生成します。

  1. [Xilinx][RTL Kernel Wizard] をクリックします。
    RTL Kernel ウィザードの Welcome ページが開きます。
  2. [Next] をクリックします。
  3. [General Settings] ページで、デフォルト設定のままにして [Next] をクリックします。
  4. [Scalars] ページで、スカラー引数の数を 0 に設定し、[Next] をクリックします。
  5. [Global Memory] ページで、デフォルト設定のままにして [Next] をクリックします。
  6. [Streaming Interfaces] ページで、デフォルト設定のままにして [Next] をクリックします。
    [Summary] ページに、RTL カーネル設定のサマリが示され、呼び出しが C 関数としてどのように見えるかを示す関数プロトタイプが含まれます。
  7. [OK] をクリックします。

これで RTL カーネル ソース ファイルが作成されました。

Vivado Design Suite プロジェクト

この段階では、Vivado Design Suite はデフォルトの A = A + 1 関数に該当する RTL コードを生成したプロジェクトが自動的に開きます。 ソース ファイルを確認したり、RTL シミュレーションを実行したりできますが、 このチュートリアルでは、デフォルトの RTL カーネルは変更せずに、オブジェクト ファイル (XO) にパッケージします。

  1. Flow Navigator で [Generate RTL Kernel] をクリックします。
    RTL カーネルの生成

  2. [Generate RTL Kernel] ダイアログ ボックスで、パッケージ オプションに [Sources-only] を選択します。

  3. [Software Emulation Sources] には、ソフトウェア エミュレーションで使用する RTL カーネルの C++ モデルを追加できます。
    C++ モデルは、設計エンジニアがコード記述する必要があります。通常 C++ モデルはなく、デザインのテストにはハードウェア エミュレーションが使用されます。

    RTL Kernel ウィザードでは vadd デザインの C++ モデルが作成されるので、このファイルを追加する手順も示します。

  4. […] (参照ボタン) をクリックします。

  5. imports ディレクトリをダブルクリックします。

  6. CPP ファイル (.cpp) のみを選択し、[OK] をクリックします。

  7. [OK] をクリックして RTL カーネルを生成します。

  8. RTL カーネルが生成されたら、[Yes] をクリックして Vivado Design Suite を閉じ、SDAccel 環境に戻ります。

    RTL Kernel has been imported」と表示されます。

  9. [OK] をクリックします。

  10. 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);

C++ および RTL ベースのカーネルを使用したアプリケーションのビルドおよびエミュレーション

RTL ベース カーネルを追加し、ホスト コードをアップデートした状態で、run2 ディレクトリのアップデートした makefile を使用して、ハードウェア エミュレーションをターゲットにしたアプリケーションをビルドします。makefile は、CPP と RTL ベースのカーネルをハードウェア プラットフォーム ファイル (xclbin) の両方を追加するようにアップデートされています。

  1. ./mixing-c-rtl-kernels/reference-files/run2 ディレクトリに移動します。

  2. ハードウェア エミュレーションをターゲットにするアプリケーションをビルドするには、./reference-files/run2 ディレクトリから次の makefile を実行します。

    make all TARGET=hw_emu

    前と同様、run2 ディレクトリ内から次のコマンドを実行して、エミュレーションを実行し、アプリケーション タイムラインを生成して確認します。

  3. ハードウェア エミュレーションのための XCL_EMULATION_MODE 環境変数を設定します。

    export XCL_EMULATION_MODE=hw_emu
  4. ハードウェア エミュレーションを実行します。

    ./host krnl_vadd.hw_emu.xilinx_u200_xdma_201830_1.xclbin
    
  5. CSV ファイルから波形ファイルを作成します。

    sdx_analyze trace -f wdb -i ./timeline_trace.csv
    
  6. 生成したタイムライン トレース波形ファイルを開きます。

    sdx -workspace workspace -report timeline_trace.wdb
    
  7. [Device][Binary Container] の下のタイムラインをたどり、拡大表示します。計算ユニット krnl_vadd_1 および sdx_kernel_wizard_0_1 が実行されているのがわかります。
    アプリケーション タイムライン 2

  8. 確認したら、[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

次のステップ



メイン ページに戻る

Copyright© 2019 Xilinx

この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきましては、必ず最新英語版をご参照ください。