アクセラレーション用 Vitis 環境の概要

入門と概要

Vitis™ 統合ソフトウェア プラットフォームは、ザイリンクス ソフトウェア開発のすべてを 1 つの環境に統合した新しいツールです。Vitis ソフトウェア プラットフォームでは、次世代のテクノロジに移行する予定のザイリンクス ソフトウェア開発キット (SDK) ユーザー用に Vitis エンベデッド ソフトウェア開発フロー、ザイリンクス FPGA ベースのソフトウェア アクセラレーションの最新機能を活用することを考慮しているソフトウェア開発者用に Vitis アプリケーション アクセラレーション開発フローがサポートされています。この内容では、主にアプリケーション アクセラレーション フローについてと、Vitis コア開発キットおよびザイリンクス ランタイム (XRT) 使用について説明します。

Vitis アプリケーション アクセラレーション開発フローは、ソフトウェアおよびハードウェア コンポーネントの両方に標準プログラミング言語を使用して、FPGA でアクセラレーションされたアプリケーションを開発して配布するためのフレームワークを提供します。ソフトウェア コンポーネント (ホスト プログラム) は、C/C++ を使用して開発して x86 またはエンベデッド プロセッサで実行し、OpenCL™ API 呼び出しを使用してアクセラレータとのランタイムの通信を管理します。ハードウェア コンポーネント (カーネル) は、C/C++、OpenCL C、または RTL を使用して開発できます。Vitis ソフトウェア プラットフォームはさまざまな設計手法に対応しており、アプリケーションまたはカーネルのいずれからでも開発を開始できます。

1: Vitis 統合ソフトウェア プラットフォーム

上の図に示すように、Vitis 統合ソフトウェア プラットフォームには次の機能および構成要素が含まれます。

  • Vitis テクノロジは、Alveo™ データセンター アクセラレータ カードなどのアクセラレーション ハードウェア プラットフォーム、または Zynq® UltraScale+™ MPSoC および Zynq®-7000 SoC ベースのエンベデッド プロセッサ プラットフォームをターゲットにしています。
  • 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 バスを使用します。制御情報はハードウェアの特定のメモリ位置間で転送されますが、ホスト プログラムとカーネル間のデータ転送にはグローバル メモリが使用されます。グローバル メモリにはホスト プロセッサとハードウェア アクセラレータの両方からアクセスできますが、ホスト メモリにはホスト アプリケーションからしかアクセスできません。

たとえば、典型的なアプリケーションでは、まずホストがカーネルで実行されるデータをホスト メモリからグローバル メモリに転送します。その後カーネルがデータを処理し、結果をグローバル メモリに格納します。カーネルが処理を終了すると、ホストが結果をホスト メモリに戻します。ホストとグローバル メモリ間のデータ転送によりレイテンシが発生し、アクセラレーション全体に悪影響を及ぼすことがあります。実際のシステムでアクセラレーションを達成するには、ハードウェア アクセラレーション カーネルで達成される利点がこのデータ転送のレイテンシを上回る必要があります。

2: Vitis コア開発キット アプリケーションのアーキテクチャ


ターゲット プラットフォームには FPGA アクセラレーション カーネル、グローバル メモリ、およびメモリ転送用のダイレクト メモリ アクセス (DMA) が含まれます。カーネルには 1 つまたは複数のグローバル メモリ インターフェイスを含むことができ、プログラム可能です。Vitis コア開発キットの実行モデルは、次の段階に分割できます。

  1. ホスト プログラムが、Alveo データセンター アクセラレータ カード上の PCIe インターフェイスまたはエンベデッド プラットフォームの AXI バスを介して、カーネルで必要なデータをグローバル メモリに書き込みます。
  2. ホスト プログラムが、入力パラメーターを使用してカーネルを設定します。
  3. ホスト プログラムが FPGA のカーネル関数の実行をトリガーします。
  4. カーネルが、必要に応じてグローバル メモリからのデータを読み出しながら、計算を実行します。
  5. カーネルがグローバル メモリにデータを書き込み、ホストにタスクが終了したことを通知します。
  6. ホスト プログラムがグローバル メモリからホスト メモリにデータを読み出し、必要に応じて処理を続けます。

FPGA には、アクセラレータ上に複数のカーネル インスタンス (別のカーネル タイプまたは同じカーネルの複数のインスタンス) を含めることができます。ホスト プログラムとアクセラレータ内のカーネル間の通信は、XRT で管理されます。XRT アーキテクチャの資料は、https://xilinx.github.io/XRT/ を参照してください。

ビルド プロセス

ヒント: ザイリンクス GitHub リポジトリのアクセラレーション アプリケの基本概念チュートリアルを参照してください。

Vitis コア開発キットには、標準ソフトウェア開発環境の機能がすべて含まれています。

  • x86 または Arm® プロセッサで実行されるホスト アプリケーション用のコンパイラまたはクロス コンパイラ。
  • FPGA バイナリをビルドするためのクロス コンパイラ。
  • コードの問題を特定して解決するのに役立つデバッグ環境。
  • ボトルネックを特定し、アプリケーションを最適化するのに役立つパフォーマンス プロファイラー。

ビルド プロセスでは、ホスト プログラムとカーネル コードの両方に対して標準のコンパイルおよびリンク プロセスに従います。次の図に示すように、ホスト プログラムは GNU C++ コンパイラ (g++) または MPSoC ベース デバイス用の GNU C++ Arm クロス コンパイラを使用してビルドされます。FPGA バイナリは、Vitis コンパイラを使用してビルドされます。

3: ソフトウェア/ハードウェアのビルド プロセス


ホスト プログラムのビルド プロセス

メイン アプリケーションは、g++ コンパイラを使用して、次の 2 つの手順でコンパイルおよびリンクされます。

  1. 必要なコードをオブジェクト ファイル (.o) にコンパイル。
  2. オブジェクト ファイル (.o) を XRT 共有ライブラリとリンクし、実行ファイルを作成。

このトピックの詳細は、ホスト プログラムのビルド を参照してください。

FPGA バイナリのビルド プロセス

4: FPGA のビルド プロセス


カーネルは、C/C++ または OpenCL C コードで記述するか、パッケージされた RTL デザインから作成できます。上の図に示すように、各ハードウェア カーネルが個別にザイリンクス オブジェクト (.xo) ファイルにコンパイルされます。

ザイリンクス オブジェクト (.xo) ファイルをハードウェア プラットフォームとリンクして FPGA バイナリ (.xclbin) を作成し、これをターゲット プラットフォーム上のザイリンクス デバイスに読み込みます。

FPGA バイナリをビルドする際に重要なのは、生成するビルド ターゲットを決定することです。詳細は、ビルド ターゲット を参照してください。

ビルド プロセスの詳細は、FPGA バイナリのビルド を参照してください。

ビルド ターゲット

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 コア開発キットの使用方法を短時間で習得するため、チュートリアル、サンプル アプリケーション、ハードウェア カーネルが http://github.com/Xilinx の次のリポジトリから提供されています。

Vitis アプリケーション アクセラレーション開発フロー チュートリアル
ツール フローおよびアプリケーション開発に関する特定の概念を理解するためのチュートリアルが多数含まれます。

新規ユーザーは、入門パスウェイ チュートリアルから始めることをお勧めします。

Vitis Examples
適切な設計プラクティス、コーディング ガイドライン、一般的なアプリケーションのデザイン パターンなどの例が多数含まれ、アプリケーションのパフォーマンスを最大限にするために重要な最適化手法が示されています。オンボーディング例は、複数のテゴリに分類されており、カテゴリごとに異なる概念が示され、該当する場合は OpenCL™ C および C/C++ フレームワークの両方が含まれます。すべてのサンプルに、ソフトウェア エミュレーション、ハードウェア エミュレーションの実行、ハードウェアでの実行に必要な makefile と、サンプルを詳細に説明する README.md が含まれます。

Vitis コア開発キットの要素、アクセラレーション用にアプリケーションを記述してビルドする方法を理解したら、デザインの問題を解決するのに最適な方法を確認してみてください。