compute() API - 2023.2 日本語

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

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

compute() メソッドは、ユーザー定義のアクセラレータ クラス定義内の特殊なユーザー定義のメソッドで、演算ユニットを表すために使用されます。compute() の引数は、CU のソフトウェアインタフェースをホスト側アプリケーションに提供し、compute() の本体が CU のハードウェア構成を指定します。アクセラレータ クラスには、1 つ以上の追加のメソッドが定義されている必要があります。各メソッドは、compute() の本体内でのみ個別に呼び出すことができます。このように呼び出される関数は、ハードウェア内のプロセッシング エレメント (PE) です。compute() の本体では、PE の構造的な構成を作成します。

compute() の本体には、次の機能があります。

  • 次のようなプロセッシング エレメントの構造的なネットワークです。
    • ハードウェアで AXI4 標準プロトコルを使用します。
    • compute() ジョブごとに開始/停止同期を使用します。
    • 同期されたハードウェア パイプラインを表すことができます。
  • compute() 本体では、PE 関数およびローカル変数宣言の呼び出しのみが使用でき、それ以外の C 言語のコンストラクトは使用できません。
  • 各 PE は、ハードウェアで並列で実行されるプロセッシング エレメントです。
    • この関数のコードは、Vitis HLS を使用して FSM およびデータパスとしてインプリメントされます。
    • PE 関数には、Vitis HLS プラグマ (#pragma HLS) を含めることができます。
  • PE は、グローバル メモリまたはその他のプラットフォーム AXI4 ポートに接続できます。
  • PE は、AXI4-Stream インターフェイスを介して相互に接続できます。
  • PE は、次の条件下でフリーランニングにできます。
    • ap_ctrl 信号がない状態でトランザクションの開始/停止を認識しません。
    • リセット/開始ステートなしで常に実行 (データ駆動) されます。
    • 使用できるのは AXI4-Stream インターフェイスだけです。

次は、compute() 関数定義の例です。

typedef vpp::stream<float, STREAM_DEPTH> InternalStream;
void pipelined_cu::compute(float* A, float* B, float* E, int M) {
    static InternalStream STR_X("str_X");
    static InternalStream STR_Y("str_Y");
    mmult(A, B, STR_X, M);
    incr_10(STR_X, STR_Y, M);
    incr_20(STR_Y, E, M);
}
  • 次の例では、3 つの PE が 2 つの内部 AXI4-Stream インターフェイス (STR_X および STR_Y) で接続されるハードウェア パイプラインを示しています。
  • mmult PE は、関連するポインターを使用してグローバル メモリから行列 A および B を読み出し、STR_X ストリームに書き込みます。
  • incr_10 PE は STR_X ストリームから読み出し、STR_Y ストリームに書き込みます。
  • incr_20 PE は STR_Y ストリームから読み出し、グローバル メモリ E に書き込みます。
  • スカラー引数 M は、行列の寸法であり、CU 内のすべての PE に提供されます。

このモデルを使用すると、さまざまなタイプのアクセラレータ システム構成を定義できます。

compute() インターフェイスは、シンプルなソフトウェア アプリケーション インターフェイスを提供しながら、ハードウェア システムを簡潔にキャプチャすることを目的としています。次のセクションでは、compute() インターフェイスで使用できるネイティブ C++ データ型について説明します。compute() およびほかの PE を含むアクセラレータ クラス定義全体とアプリケーションコードは、デバッグおよび検証 の説明に従って機能的に検証できます。