C/C++ カーネルの開発手法 - 2022.1 日本語

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

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

Vitis ソフトウェア プラットフォームでは、C/C++ または RTL (Verilog、VHDL、SystemVerilog) のいずれかで記述されたカーネルがサポートされます。この設計手法ガイドは C/C++ カーネル用です。RTL カーネルの詳細は、RTL カーネル を参照してください。

最適なアプリケーション パフォーマンスに必要な次のカーネル要件は、アーキテクチャの定義段階で既に特定されているはずです。

  • スループット目標
  • レイテンシ目標
  • データパス幅
  • エンジン数
  • インターフェイスの帯域幅

これらの要件により、カーネル開発および最適化プロセスが決まります。全体的なアプリケーション パフォーマンスは、各カーネルが指定したスループットを満たすことにより予測されるので、カーネルのスループット目標を達成することが主な目的となります。

このため、カーネル開発手法はスループット ドリブン方法に従って、アウトサイドインで開発していきます。この手法には、次の 2 つの段階が含まれます。

  1. カーネルのマクロ アーキテクチャを定義してインプリメント
  2. カーネルのマイクロ アーキテクチャをコード記述して最適化

カーネル開発プロセスを開始する前に、機能、アルゴリズム、アーキテクチャの違いと、これらがカーネル開発プロセスにどのように関係するかを理解しておくことが重要です。

  • 機能は、入力パラメーターと出力結果の数学的な関係です。
  • アルゴリズムは、特定の機能を実行するための一連の手順です。ある機能は、異なるアルゴリズムを使用して実行できます。たとえば、並べ替えは quick sort または bubble sort アルゴリズムを使用してインプリメントできます。
  • アーキテクチャは、このコンテキストでは、アルゴリズムの基になるハードウェア インプリメンテーションの特性を意味します。たとえば特定の並べ替えアルゴリズムは、並列実行するコンパレータ、RAM またはレジスタ ベースのストレージなどでインプリメントできます。

Vitis コンパイラでは、C/C++ で記述されたアルゴリズムから最適化されたハードウェア アーキテクチャが生成されますが、特定のアルゴリズムが別のアルゴリズムに変換されることはありません。ソフトウェア プログラムを自動的にハードウェアに変換 (または合成) して許容可能な QoR (結果の品質) を達成できる場合でも、HLS ツールが目的のパフォーマンス目標を達成できるようにソフトウェアを書き直すなどの追加作業が必要です。

アルゴリズムはデータ アクセスの局所性および計算の並列処理に直接影響するので、コンパイラの能力やユーザー指定のプラグマよりも、選択するアルゴリズムが達成可能なパフォーマンスに大きく関係します。このためには、FPGA デバイス上で実行するのに適切なソフトウェアを記述するベスト プラクティスを理解する必要があります。次のいくつかのセクションでは、プログラムを構成するマクロレベルのアーキテクチャ最適化を最初に特定し、パフォーマンス目標を高める詳細なマイクロレベルのアーキテクチャ最適化に焦点を当てる方法について説明します。

次の設計手法では、アクセラレーションする機能に適したアルゴリズムが特定されていることを想定しています。

図 1. カーネル開発手法