アクセラレーション用 Vitis 環境の概要
Vitis ソフトウェア プラットフォームを使用したアクセラレーション フローのアプリケーション開発
Vitis™ 統合ソフトウェア プラットフォームは、ザイリンクス ソフトウェア開発のすべてを 1 つの環境に統合した新しいツールです。Vitis ソフトウェア プラットフォームでは、次世代のテクノロジに移行する予定のザイリンクス ソフトウェア開発キット (SDK) ユーザー用に Vitis エンベデッド ソフトウェア開発フロー、ザイリンクス FPGA ベースのソフトウェア アクセラレーションの最新機能を活用することを考慮しているソフトウェア開発者用に Vitis アプリケーション アクセラレーション開発フローがサポートされています。ここでは、主にアプリケーション アクセラレーション フローについてと、Vitis コア開発キットおよびザイリンクス ランタイム (XRT) の使用について説明します。
Vitis アプリケーション アクセラレーション開発フローは、ソフトウェアおよびハードウェア コンポーネントの両方に標準プログラミング言語を使用して、FPGA でアクセラレーションされたアプリケーションを開発して配布するためのフレームワークを提供します。ソフトウェア コンポーネント (ホスト プログラム) は、C/C++ を使用して開発して x86 またはエンベデッド プロセッサで実行し、OpenCL™ API 呼び出しを使用してアクセラレータとのランタイムの通信を管理します。ハードウェア コンポーネント (カーネル) は、C/C++、OpenCL C、または RTL を使用して開発できます。Vitisソフトウェア プラットフォームは、異種アプリケーションのハードウェアおよびソフトウェア要素の同時開発およびテストを促進します。
上の図に示すように、Vitis 統合ソフトウェア プラットフォームには次の機能および構成要素が含まれます。
- Vitis テクノロジは、Alveo™ データセンター アクセラレータ カードなどのアクセラレーション ハードウェア プラットフォーム、および Versal または Zynq® UltraScale+™ MPSoC ベースのエンベデッド プロセッサ プラットフォームをターゲットにしています。
- XRT は、ホスト プログラムがターゲット プラットフォームにアクセスするための API およびドライバーを提供し、ホスト プログラムとアクセラレーション カーネルの間のトランザクションを処理します。
- Vitis コア開発キットは、ホスト プログラムおよびカーネルをビルドするコンパイラおよびクロス コンパイラ、アプリケーションのパフォーマンスをプロファイリングおよび解析するアナライザー、アプリケーションの問題を特定して修正するためのデバッガーなど、ソフトウェア ツール スタックを提供します。
- Vitis アクセラレーション ライブラリは、コードに最小限の変更を加えてパフォーマンスを最適化した FPGA アクセラレーションを提供しており、アルゴリズムをインプリメントし直さなくても、ザイリンクスの適応型コンピューティングの利点を活用できます。Vitis アクセラレーション ライブラリには、算術演算、統計、線形代数、DSP などの一般的な関数用のものだけでなく、ビジョンおよび画像処理、数理ファイナンス、データベースおよびデータ分析、データ圧縮などのドメイン特化アプリケーション用のものがあります。Vitis アクセラレーション ライブラリの詳細は、https://xilinx.github.io/Vitis_Libraries/ を参照してください。
FPGA アクセラレーション
ザイリンクス FPGA には、プロセッサで実行可能などの関数でもインプリメントできるカスタム アーキテクチャなど、従来の CPU/GPU アクセラレーションと比べて多くの利点があり、消費電力を低く抑えながら高パフォーマンスを達成できます。ザイリンクス デバイスのプログラマブル ロジック (PL) ファブリックでは、アプリケーション実行の並列化をプロセッサ アーキテクチャよりも詳細に調整できます。
ザイリンクス デバイスでソフトウェアをアクセラレーションできる利点を活用するには、アプリケーションで計算負荷の高い部分をアクセラレーションします。これらの関数をカスタム ハードウェアにインプリメントすると、パフォーマンスと消費電力の理想的なバランスを達成できます。
パフォーマンスが最適なアプリケーションを設計する方法およびその他を推奨される設計手法は、Vitis ソフトウェア プラットフォームでのアプリケーションのアクセラレーション手法 を参照してください。
実行モデル
Vitis コア開発キットでは、アプリケーション プログラムがホスト アプリケーションとハードウェア アクセラレーション カーネルに分割され、その間が通信チャネルで接続されます。ホスト プログラムは、C/C++ および OpenCL のような API 抽象化を使用して記述され、ホスト プロセッサ (x86 サーバー、エンベデッド プラットフォーム用の Arm プロセッサなど) で実行されますが、ハードウェア アクセラレーション カーネルはザイリンクス デバイス内で実行されます。
ホスト プログラムとハードウェア アクセラレータの間のトランザクションを処理するには、XRT で制御される API 呼び出しが使用されます。制御およびデータの転送を含むホストとカーネルの間の通信には、PCIe® バスまたはエンベデッド プラットフォームの AXI バスを使用します。制御情報はハードウェアの特定のメモリ位置間で転送されますが、ホスト プログラムとカーネル間のデータ転送にはグローバル メモリが使用されます。グローバル メモリにはホスト プロセッサとハードウェア アクセラレータの両方からアクセスできますが、ホスト メモリにはホスト アプリケーションからしかアクセスできません。
たとえば、典型的なアプリケーションでは、まずホストがカーネルで実行されるデータをホスト メモリからグローバル メモリに転送します。その後カーネルがデータを処理し、結果をグローバル メモリに格納します。カーネルが処理を終了すると、ホストが結果をホスト メモリに戻します。ホストとグローバル メモリ間のデータ転送によりレイテンシが発生し、アクセラレーション全体に悪影響を及ぼすことがあります。実際のシステムでアクセラレーションを達成するには、ハードウェア アクセラレーション カーネルで達成される利点がこのデータ転送のレイテンシを上回る必要があります。
ターゲット プラットフォームには FPGA アクセラレーション カーネル、グローバル メモリ、およびメモリ転送用のダイレクト メモリ アクセス (DMA) が含まれます。カーネルには 1 つまたは複数のグローバル メモリ インターフェイスを含めることができ、プログラム可能です。Vitis コア開発キットの実行モデルは、次の段階に分割できます。
- ホスト プログラムが、Alveo データセンター アクセラレータ カード上の PCIe インターフェイスまたはエンベデッド プラットフォームの AXI バスを介して、カーネルで必要なデータをグローバル メモリに書き込みます。
- ホスト プログラムが、入力パラメーターを使用してカーネルを設定します。
- ホスト プログラムが FPGA のカーネル関数の実行をトリガーします。
- カーネルが、必要に応じてグローバル メモリからのデータを読み出しながら、計算を実行します。
- カーネルがグローバル メモリにデータを書き込み、ホストにタスクが終了したことを通知します。
- ホスト プログラムがグローバル メモリからホスト メモリにデータを読み出し、必要に応じて処理を続けます。
FPGA には、アクセラレータ上に複数のカーネル インスタンス (別のカーネル タイプまたは同じカーネルの複数のインスタンス) を含めることができます。ホスト プログラムとアクセラレータ内のカーネル間の通信は、XRT で管理されます。XRT アーキテクチャの資料は、https://xilinx.github.io/XRT/ を参照してください。
データセンター アプリケーション アクセラレーション開発フロー
次の図は、Alveo データセンター アクセラレータ カードで使用するアプリケーションをビルドして実行するために必要な手順を示しています。各手順は次にまとめていますが、その詳細はこの資料全体で説明します。
- x86 アプリケーションのコンパイル
- g++ コンパイラを使用して、x86 プロセッサで実行するホスト アプリケーションをコンパイルして、ホスト実行ファイルを作成します。ホスト プログラムは、PL 領域内のカーネルとインタラクティブです。ホスト アプリケーションの詳細は、アプリケーションの開発 を参照してください。ホスト アプリケーションのコンパイルの詳細は、ホスト プログラムのビルド を参照してください。
- PL カーネルのコンパイルおよびリンク
-
PL カーネルは、ターゲット プラットフォームの PL 領域にインプリメンテーションできるようにコンパイルされます。PL カーネルは、Vitis コンパイラ (
v++) または C/C++ カーネルの場合は Vitis HLS を使用し、RTL カーネルの場合はpackage_xoコマンドを使用して、ザイリンクス オブジェクト形式 (XO) ファイルにコンパイルできます。カーネルのコーディングに関する詳細は、C/C ++ カーネル または RTL カーネル を参照してください。Vitis コンパイラは、カーネル XO ファイルをハードウェアプラットフォームにリンクして、アプリケーションのデバイス実行ファイル (.xclbin) を作成します。詳細は、デバイス バイナリのビルドを参照してください。
v++ --linkコマンドでザイリンクス オブジェクト (XO) ファイルをターゲット ハードウェア プラットフォームとリンクしてデバイス バイナリ ファイル (.xclbin) を作成し、これをターゲット プラットフォーム上のザイリンクス デバイスに読み込みます。 - アプリケーションの実行
- Alveo データセンター アクセラレータ カードの場合、.xclbin ファイルはシステムを実行するために必要なビルド オブジェクトです。アプリケーションを実行する際は、ソフトウェア エミュレーション、ハードウェア エミュレーションを実行するか、実際の物理的なアクセラレータ プラットフォームで実行できます。詳細は、アプリケーション ハードウェア ビルドの実行を参照してください。
- ビルド ターゲットがソフトウェアまたはハードウェア エミュレーションの場合、Vitis コンパイラでカーネルのシミュレーション モデルがデバイス バイナリに生成されます。ビルド ターゲット で説明されているように、 ターゲットを使用すると、デザインをビルドおよび実行して比較的速いサイクルで反復実行し、アプリケーションをデバッグしてパフォーマンスを評価できます。
- ビルド ターゲットがハードウェア システムの場合、Vitis コンパイラは Vivado Design Suite を使用して合成およびインプリメンテーションを実行してからタイミングを解決し、.xclbin を生成します。このプロセスは自動化されて高品質の結果を生成しますが、ハードウェアに精通した開発者の場合は、設計プロセスで Vivado ツールを完全に活用することもできます。
エンベデッド プロセッサ アプリケーション アクセラレーション開発フロー
次の図は、Versal ACAP、Zynq UltraScale+ MPSoC および Zynq-7000 SoC デバイスのプログラマブル ロジック領域で実行される Arm® プロセッサとカーネルを使用して、アプリケーションをビルドおよび実行するために必要な手順を示しています。各手順は次にまとめていますが、その詳細はこの資料全体で説明します。
- PS アプリケーションのコンパイル
- GNU Arm クロス コンパイラを使用して、Cortex®-A72 または Cortex-A53 コア プロセッサで実行するホスト アプリケーションをコンパイルし、ELF ファイルを作成します。ホスト プログラムは、デバイスの PL および AI エンジン 領域内のカーネルとインタラクティブです。ホスト アプリケーションの詳細は、アプリケーションの開発 を参照してください。ホスト アプリケーションのコンパイルの詳細は、ホスト プログラムのビルド を参照してください。
- AI エンジン アレイ (Versal AI エンジン Core シリーズの場合のみオプション)
- Versal ACAP デバイスの中には、単一命令複数データ (SIMD) ベクター ユニットを含む VLIW (Very-Long Instruction Word) プロセッサの AI エンジン アレイが搭載されているものもあり、5G ワイヤレスおよび人工知能 (AI) アプリケーションなどの演算負荷の高いアプリケーション向けに高度に最適化されています。AI エンジン グラフとカーネルは、
aiecompilerやaiesimulatorなどの Vitis ツールを使用して構築されており、『Versal ACAP AI エンジン プログラミング環境ユーザー ガイド』 (UG1076) で説明されているように、エンベデッド プロセッサ アプリケーションのアクセラレーション フローに統合できます。 - PL カーネルのコンパイルおよびリンク
-
PL カーネルは、ターゲット プラットフォームの PL 領域にインプリメンテーションできるようにコンパイルされます。PL カーネルは、Vitis コンパイラ (
v++) または C/C++ カーネルの場合は Vitis HLS を使用し、RTL カーネルの場合はpackage_xoコマンドを使用して、ザイリンクス オブジェクト形式 (XO) ファイルにコンパイルできます。カーネルのコーディングに関する詳細は、C/C ++ カーネル または RTL カーネル を参照してください。Vitis コンパイラは、カーネル XO ファイルをハードウェアプラットフォームにリンクして、アプリケーションのデバイス実行ファイル (.xclbin) を作成します。詳細は、デバイス バイナリのビルドを参照してください。
v++ --linkコマンドでザイリンクス オブジェクト (XO) ファイルをターゲット ハードウェア プラットフォームとリンクしてデバイス バイナリ ファイル (.xclbin) を作成し、これをターゲット プラットフォーム上のザイリンクス デバイスに読み込みます。 - システム パッケージ
v++ --packageコマンドを使用して、ホスト アプリケーションおよび PL カーネル バイナリを含むアプリケーションをロードおよび実行するために、システムの設定と起動に必要なファイルを収集します。この段階では、ソフトウェアまたはハードウェアのエミュレーションとデバッグを実行するために必要なパッケージをビルドしたり、ハードウェア上でアプリケーションを実行するための SD カードを作成したりします。詳細は、システムのパッケージを参照してください。- アプリケーションの実行
- アプリケーションを実行する際は、ソフトウェア エミュレーション、ハードウェア エミュレーションを実行するか、実際の物理的なアクセラレータ プラットフォームで実行できます。エンベデッド プロセッサ プラットフォームでのアプリケーションの実行は、データセンター アクセラレータ カードでの実行とは異なります。詳細は、アプリケーション ハードウェア ビルドの実行を参照してください。
- ビルド ターゲットがソフトウェアまたはハードウェア エミュレーションの場合、Vitis コンパイラでカーネルのシミュレーション モデルがデバイス バイナリに生成されます。ビルド ターゲット で説明されているように、 ターゲットを使用すると、デザインをビルドおよび実行して比較的速いサイクルで反復実行し、アプリケーションをデバッグしてパフォーマンスを評価できます。
- ビルド ターゲットがハードウェア システムの場合、Vitis コンパイラは Vivado Design Suite を使用して合成およびインプリメンテーションを実行してからタイミングを解決し、.xclbin を生成します。このプロセスは自動化されて高品質の結果を生成しますが、ハードウェアに精通した開発者の場合は、設計プロセスで Vivado ツールを完全に活用することもできます。
ビルド ターゲット
Vitis コンパイラのビルド プロセスでは、ホスト プログラムの実行ファイルと FPGA バイナリ (.xclbin) が生成されます。FPGA バイナリの特性は、ビルド ターゲットによって決定されます。
- ビルド ターゲットがソフトウェアまたはハードウェア エミュレーションの場合、Vitis コンパイラでカーネルのシミュレーション モデルが FPGA バイナリに生成されます。これらのエミュレーション ターゲットを使用すると、デザインをビルドおよび実行して比較的速いサイクルで反復実行し、アプリケーションをデバッグしてパフォーマンスを評価できます。
- ビルド ターゲットがシステムの場合は、Vitis コンパイラでハードウェア アクセラレータ用に .xclbin が生成され、Vivado Design Suite を使用して合成およびインプリメンテーションが実行されます。この場合、良い QoR (結果の品質) が得られる定義済み設定が使用されます。Vitis コア開発キットを使用するのにこれらのツールの知識は必要ありませんが、ハードウェアに精通していると、これらのツールで使用可能なすべての機能を活用してカーネルをインプリメントできます。
Vitis コンパイラには、デバッグおよび検証に使用する 2 つのエミュレーション ターゲット、および実際の FPGA バイナリを生成するのに使用されるデフォルトのハードウェア ターゲットの 3 つのビルド ターゲットがあります。
- ソフトウェア エミュレーション (
sw_emu) - ホスト アプリケーション コードとカーネル コードの両方がホスト プロセッサで実行できるようコンパイルされます。これにより、高速なビルドおよび実行ループを使用した反復アルゴリズムによる改善が可能になります。このターゲットは、構文エラーを特定し、アプリケーションと共に実行されるカーネル コード ソース レベルのデバッグを実行し、システムの動作を検証するのに便利です。
- ハードウェア エミュレーション (
hw_emu) - カーネル コードが、専用シミュレータで実行可能なハードウェア モデル (RTL) にコンパイルされます。ビルドおよび実行ループにかかる時間は長くなりますが、詳細でサイクル精度のカーネル アクティビティが表示されます。このターゲットは、FPGA に配置するロジックの機能をテストして、初期パフォーマンス見積もりを取得する場合に便利です。
- ハードウェア (
hw) - カーネル コードがハードウェア モデル (RTL) にコンパイルされ、FPGA にインプリメントされて、実際の FPGA で実行されるバイナリが生成されます。
チュートリアルおよびサンプル
Vitis コア開発キットの使用方法を短時間で習得するため、チュートリアル、サンプル アプリケーション、ハードウェア カーネルが https://github.com/xilinx/Vitis-Tutorials の次のリポジトリから提供されています。
- Vitis アプリケーション アクセラレーション開発フロー チュートリアル
- ツール フローおよびアプリケーション開発に関する特定の概念を理解するためのチュートリアルが多数含まれます。
新規ユーザーは、入門チュートリアルから始めることをお勧めします。
- Vitis Examples
- 適切な設計プラクティス、コーディング ガイドライン、一般的なアプリケーションのデザイン パターンなどの例が多数含まれ、アプリケーションのパフォーマンスを最大限にするために重要な最適化手法が示されています。オンボーディング例は、複数のテゴリに分類されており、カテゴリごとに異なる概念が示され、該当する場合は OpenCL™ C および C/C++ フレームワークの両方が含まれます。すべてのサンプルに、ソフトウェア エミュレーション、ハードウェア エミュレーションの実行、ハードウェアでの実行に必要な makefile と、サンプルを詳細に説明する README.md が含まれます。
Vitis コア開発キットの要素、アクセラレーション用にアプリケーションを記述してビルドする方法を理解したら、デザインの問題を解決するのに最適な方法を確認してみてください。