ホスト プログラミングのベスト プラクティス - 2022.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 日本語

Vitis 環境では、ホスト アプリケーションは、ザイリンクス ランタイム (XRT) のネイティブ C++ API を使用して C++ で記述できます。ハードウェア上で並列処理を有効にし、メモリ アクセスを最適化するためにカーネル コードを再構築する必要があるのと同様に、ホスト プログラミングも CPU 上で高いパフォーマンスを確保するために重要です。必要なパフォーマンスを達成するように最適化されたカーネルを使用することはできますが、CPU と FPGA の使用率が高くない場合、アプリケーションのパフォーマンスは最適になりません。ホスト プログラムを作成する際の考慮事項を次に示します。

  • カーネル エンキューのオーバーヘッドを削減: カーネルをエンキューする前に、ホストからカーネルにコマンドと引数を送信するためのオーバーヘッドがあります。このオーバーヘッドの影響は、ホストでカーネルをエンキューする必要のある回数を最小限にすると削減できます。
  • ホストとデバイス間のデータ転送帯域幅を最大化: ホストとデバイス メモリ間のデータ転送には、PCIe 帯域幅を最大化するのに十分な大きさが必要です。同時に、バッファーが大きすぎると、カーネルの実行が開始できなくなります。
  • カーネル計算に使用可能なデータ: ホストはデータを FPGA デバイス メモリにできるだけ早く送信することで、計算を開始させて、使用可能なデータがないことでカーネルが枯渇しないようにします。
  • カーネル計算を使用してデータ転送をオーバーラップ: データベース分析やビデオのようなアプリケーションでは、アクセラレーション デバイスで使用可能なグローバル デバイス メモリよりも大きなデータ セットが使用されます。データはブロック単位で処理される必要があります。これらのアプリケーションで優れたパフォーマンスを達成するには、データ転送と計算をオーバーラップさせる手法が必要となります。

別のバッファー サイズを使用してホストとデバイス メモリ間のデータ移動を試して、アプリケーションのパフォーマンスを最適化する必要がある場合があります。Vitis ツールを使用すると、エミュレーション ターゲットを使用してパフォーマンス結果を見積もり、最後にハードウェア上で実行して正確なパフォーマンス結果を取得できます。アプリケーションを実行した後、Vitis アナライザーを使用すると、ホストと FPGA メモリ間、カーネルとデバイス メモリ間のデータ移動を視覚化できます。

次は、Vitis アナライザー ユーティリティの [Application Timeline] ビューです。このビューでは、水平軸上のデータ移動が「時間」として表示され、パフォーマンス改善の可能性が示されます。

図 1. ホスト アプリケーションのタイムライン

ホストがデバイス メモリからデータを読み出しているときは、「Data Transfer:Read」の行が表示され、ホストがデバイス メモリにデータを書き込んでいるときは「Data Transfer: Write」と表示されます。カーネルの実行中は、「Kernel Enqueue」の行が表示されます。

カーネル内で達成されたタスクレベルの並列処理と同様、ホストと CPU 間でも同様の並列処理を達成できます。これを有効にすることで、CPU と FPGA の両方を同時にアクティブにして、優れたパフォーマンスを実現できます。ホスト コードをプログラムする際には、FPGA と CPU の両方を同時に使用し続ける方法を検討する必要があります。これは通常アルゴリズムのプロパティなので、ホスト プログラムは慎重に記述して、FPGA と CPU の最大使用率を取得する必要があります。

上記のアプリケーションタイムラインからは、CPU がアイドル状態のときのギャップを簡単に特定できます。同様に、FPGA はホストがデータを転送しているときにアイドル状態になります。したがって、ホスト プログラムは、FPGA 上のカーネルがデータ不足にならないように、デバイス メモリにできるだけ早くデータを供給する必要があります。ここでは、大きなバッファーがホストから CPU に 1 回送信され、計算が実行されます。FPGA は、データがデバイス メモリに完全に転送されるまでアイドル状態になります。FPGA が計算関数を実行する場合、CPU はその時点でアイドル状態になります。このアプリケーションの場合、大きなバッファーを送信する必要はなく、ホスト転送とカーネル計算が重複して実行されるため、アプリケーションの結果は改善します。

図 2. 改善されたタイムライン

データを複数のチャンクに分割してホスト側を変更したことで、カーネルの計算を早期に開始し、ホストと FPGA 間のデータ転送を隠すことができます。ホスト データ転送と FPGA 上のアクセラレーション関数を並行して実行できるようになり、アプリケーション全体のパフォーマンスが向上します。この手法のデモと詳細は、「ブルーム フィルターのチュートリアル」を参照してください。

Vitis アナライザーは、タイムライン トレースを表示するだけでなく、プロファイリングに関するアプリケーション ガイダンスのほか、タイミングとリソース情報、およびデザインのクリティカル パスを含む合成レポートも提供します。このツールの詳細は、「Vitis アナライザーの使用」を参照してください。

ホスト プログラミングの詳細は、「XRT ネイティブ API」および「ホスト プログラムとカーネル実行のオーバーラップの例」を参照してください。