プログラミング モデル

Vitis™ コア開発キットでは、業界標準の OpenCL™ フレームワーク (https://www.khronos.org/opencl/) を使用したヘテロジニアス計算がサポートされています。ホスト プログラムは、プロセッサ (x86 または Arm®) で実行され、ザイリンクス ランタイム (XRT) を介して演算負荷の高いタスクが OpenCL プログラミングの基本枠組みを使用したプログラマブル ロジック (PL) で動作するハードウェア カーネルで実行されるようにします。

デバイス トポロジ

Vitis コア開発キットでは、ターゲット デバイスに PCIe バスを介する x86 ホストや AXI4 インターフェイスを介する Arm プロセッサなどのプロセッサに接続されたザイリンクス MPSoC または UltraScale+™ FPGA を含めることができます。FPGA には、ハードウェア カーネルをインプリメントおよび実行するプログラマブル領域が含まれます。

FPGA プラットフォームには、1 つまたは複数のグローバル メモリ バンクが含まれます。ホスト マシンとカーネルの間のデータ転送は、これらのグローバル メモリ バンクを介して実行されます。FPGA で実行されるカーネルには、1 つまたは複数のメモリ インターフェイスを含めることができます。グローバル メモリ バンクからこれらのメモリ インターフェイスへの接続は柔軟にプログラム可能であり、カーネルのコンパイル オプションにより指定されます。

ザイリンクス デバイスの PL 領域には複数のカーネルをインプリメントできるので、アプリケーションをかなりアクセラレーションできます。1 つのカーネルを複数回インスタンシエートすることもできます。カーネルのインスタンス数はプログラム可能で、FPGA バイナリを構築する際に指定したリンク オプションで決定できます。これらのオプションの詳細は、カーネルのリンク を参照してください。

カーネル プロパティ

Vitis アプリケーション アクセラレーション開発フローでは、カーネルはザイリンクス デバイスのプログラマブル ロジック (PL) 領域で実行されるプロセッシング エレメントです。Vitis ソフトウェア プラットフォームでは、C/C++、RTL、または OpenCL C で記述されたカーネルがサポートされます。ソース言語に関係なく、すべてのカーネルのプロパティが同じで、同じ要件に従っている必要があります。これにより、システム コンパイラ リンカーおよびザイリンクス ランタイム (XRT) がカーネルとスムーズに通信できるようになります。

このセクションでは、Vitis アプリケーション アクセラレーション フローでのカーネルのプロパティおよび要件について説明します。これらの要件がどのように満たされるかは、ソース言語によって異なります。

カーネル実行モード

次の表で説明するように、カーネル実行モードには 3 つのタイプがあります。これらのモードは一緒に使用することはできず、各カーネルにはこの中の 1 つの実行モードしか使用できません。異なる実行モードのカーネルは Vitis リンカーでリンクでき、FPGA バイナリが形成されます。

シーケンシャル モード パイプライン モード フリーランニング モード
  • カーネルは、API 呼び出しを使用してホスト アプリケーションにより開始されます。
  • カーネルが終了したら、それがホスト アプリケーションに通知されます。
  • カーネルは、現在のタスクが終了してからしか再開できません。
  • メモリ ベースのデータ転送を使用したカーネルのレガシ モード。
  • カーネルは、API 呼び出しを使用してホスト アプリケーションにより開始されます。
  • カーネルが新しいデータを読み込む準備ができたら、それがホスト アプリケーションに通知されます。
  • カーネルは、現在のタスクが終了する前に再開できます。
  • カーネルの複数の起動をオーバーラップできるので、パフォーマンスが改善します。
  • メモリ ベースのデータ転送を使用したカーネルのデフォルト モード。
  • カーネルは、デバイスが xclbin を使用してプログラムされるとすぐに開始されます。
  • カーネルは続けて実行され、データが使用可能になると同期されます。
  • フリーランニング モードは、OpenCL C で記述されたカーネルではサポートされません。

カーネル インターフェイス

カーネル インターフェイスは、ホスト アプリケーション、その他のカーネル、またはデバイス I/O とデータを交換するために使用されます。使用可能なインターフェイスのタイプは 3 つあり、それぞれが特殊なデータ転送用に設計されています。カーネルには、さまざまなタイプの複数のインターフェイスが含まれることがよくあります。

関数プロパティ

次の表では、カーネル インターフェイスの関数プロパティについて説明します。

レジスタ メモリ マップド ストリーミング
  • ホスト アプリケーションとカーネル間でスカラーを転送するために設計されています。
  • レジスタ読み出しおよび書き込みは、ホスト アプリケーションで開始されます。
  • カーネルはスレーブとして動作します。
  • グローバル メモリ (DDR、PLRAM、HBM) を使用した双方向のデータ転送用です。
  • アクセス パターンは通常ランダムです。
  • メモリ転送のレイテンシが増えます。
  • カーネルはグローバル メモリに格納されたデータにアクセスするマスターとして動作します。
  • データのベース アドレスはレジスタ インターフェイスを介して送信されます。
  • ホスト アプリケーションがデータセットのサイズに合わせてバッファーを割り当てます。
  • フリーランニング カーネルには、メモリ マップド インターフェイスを使用できません。
  • カーネル間やホストアプリケーションとカーネル間で一方向のデータを転送するために設計されています。
  • アクセス パターンはシーケンシャルです。
  • グローバル メモリは使用しません。
  • メモリ マップド転送よりも良いパフォーマンスになります。
  • データセットはボンディングされません。
  • ストリーム内の最後の値を示すために側帯波信号が使用されることがあります。

インプリメンテーション要件

各インターフェイス タイプは、特定のハードウェア プロトコルを使用してインプリメントする必要があります。これにより、システム コンパイラ リンカーがカーネルにプラットフォームを含めて生成できるようになります次の表に、ハードウェアへインターフェイスをマップする際の要件を示します。

レジスタ メモリ マップド ストリーミング
  • レジスタ インターフェイスは、AXI4-Lite インターフェイスを使用してインプリメントする必要があります。
  • カーネルに含めることができる AXI4-Lite インターフェイスは 1 つだけです。
  • メモリ マップド インターフェイスは、AXI4 インターフェイスを使用してインプリメントする必要があります。
  • カーネルには 1 つまたは複数の AXI4 マスター インターフェイスを含むことができます。
  • 異なるメモリ マップド引数を同じ AXI4 マスターを介して転送できます。
  • ストリーミング インターフェイスは、AXI4-Stream インターフェイスを使用してインプリメントする必要があります
  • カーネルには 1 つまたは複数の AXI4-Stream インターフェイスを含むことができます

クロックおよびリセット要件

C/C++/OpenCL C カーネル RTL カーネル
C カーネルでは、クロック ポートおよびリセット ポートにユーザーからの入力は必要としません。HSL ツールは常に ap_clk クロック ポートと ap_rst リセット ポートを使用して RTL を生成します。
  • クロック ポートを必要とし、ap_clk という名前にする必要があります。
  • オプションのクロック ポートでap_clk_2 という名前にする必要があります。
  • オプションのリセット ポートで、ap_rst_n という名前にする必要があります。この信号は ap_clk クロック ドメインで同期リセットにより駆動されます。
  • このリセット信号はアクティブ Low です。
  • オプションの別のリセット ポートで、ap_rst_n_2 という名前にする必要があります。この信号は ap_clk_2 クロック ドメインで同期リセットにより駆動されます。

カーネル実行モード

次の表で説明するように、カーネル実行モードには 3 つのタイプがあります。これらのモードは一緒に使用することはできず、各カーネルにはこの中の 1 つの実行モードしか使用できません。異なる実行モードのカーネルは Vitis リンカーでリンクでき、FPGA バイナリが形成されます。

シーケンシャル モード パイプライン モード フリーランニング モード
  • カーネルは、API 呼び出しを使用してホスト アプリケーションにより開始されます。
  • カーネルが終了したら、それがホスト アプリケーションに通知されます。
  • カーネルは、現在のタスクが終了してからしか再開できません。
  • メモリ ベースのデータ転送を使用したカーネルのレガシ モード。
  • カーネルは、API 呼び出しを使用してホスト アプリケーションにより開始されます。
  • カーネルが新しいデータを読み込む準備ができたら、それがホスト アプリケーションに通知されます。
  • カーネルは、現在のタスクが終了する前に再開できます。
  • カーネルの複数の起動をオーバーラップできるので、パフォーマンスが改善します。
  • メモリ ベースのデータ転送を使用したカーネルのデフォルト モード。
  • カーネルは、デバイスが xclbin を使用してプログラムされるとすぐに開始されます。
  • カーネルは続けて実行され、データが使用可能になると同期されます。
  • フリーランニング モードは、OpenCL C で記述されたカーネルではサポートされません。