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 を含むアクセラレータ クラス定義全体とアプリケーションコードは、デバッグおよび検証 の説明に従って機能的に検証できます。