VSC がサポートするガイダンス マクロを使用すると、アクセラレータ クラスの関数引数 (PEと compute の両方) をさまざまなタイプのハードウェア インターフェイスで使用できます。次に、さまざまなタイプのガイダンス マクロを定義します。
- SYS_PORT(<port>, <global_memory>);
-
compute()
関数の特定の引数に使用するプラットフォーム インターフェイスを指定します。グローバル メモリは通常、FPGA との間のデータ転送に使用されるメモリ バンクです。-
<port>
は特定のcompute()
引数の名前です。 -
<global_memory>
は、次の形式のいずれかで指定できます。-
<bank-ID>
: すべての CU インスタンスに適用される単一のバンク ID です。たとえば、DDR、DDR[1]、または HBM[5] が入ります。ヒント: プラットフォームのバンク名は、platforminfo
コマンドを使用して確認できます。 -
(
<CU1-bank-ID> : ... : <NCU-bank-ID>
): かっこ内に、各 CU のバンク ID をコロンで分けてリストします。バンク ID は、CU ごとに(HBM[0]:HBM[4]:HBM[8]:HBM[12])
という順序で指定されます。エントリ数は、クラス内で指定された数の CU (/*NCU=*/4
) と一致する必要があります。 -
<bank-ID>
: プラットフォームでサポートされているグローバル メモリ キーワードを使用する必要があります。例は、HBM[n]、DDR[n]、bank0 です。注記: 現時点では、メモリ バンクの範囲 (たとえば、HBM[0:3])、PLRAM、またはホスト メモリ (HOST[0]) の指定はサポートされていません。
-
-
- SYS_PORT_PFM(<substr>, <port>, <global_memory>);
-
これを使用して、特定のプラットフォームのアクセラレータ ポート接続を設定できますが、1 つのクラス ヘッダーで定義できます。たとえば、次のコードでは、ポート A は u50 プラットフォームの場合は HBM[0] に、その他のプラットフォームの場合は DDR[0] に接続されます。
SYS_PORT(A, DDR[0]); SYS_PORT_PFM(u50, A, HBM[0]);
-
<substr>
は、プラットフォーム名のサブストリングを参照します。たとえば、u50
を使用すると、プラットフォーム名に指定された文字列が含まれている場合にのみSYS_PORT_PFM
接続が使用されます。 -
<port>
引数と<global_memory>
引数は、上記のSYS_PORT
マクロの場合と同様に機能します。
重要: 同じ<port>
に複数のSYS_PORT
マクロとSYS_PORT_PFM
マクロが指定されている場合、VSC は最後に読み込まれた適切なSYS_PORT
またはSYS_PORT_PFM
ガイダンス マクロを適用します。 -
- ACCESS_PATTERN(<port>, <pattern>);
-
VSC がハードウェア アクセラレータ インターフェイスとデバイス内のグローバル メモリ間のデータ ムーバーを推論できるようにします。
-
<port>
は特定のcompute()
引数の名前です。 -
<pattern>
では、2 つの異なるメモリ アクセス パターンのいずれかを定義します。-
SEQUENTIAL
: データ転送は、アクセラレーション インターフェイスへの AXI4-Stream 接続を介して実行されます。CU (またはカーネル) コードは、対応する引数のシーケンシャル アクセス パターンに厳密に従う必要があります。そうしないと、ハードウェアの動作が正しくなくなります。たとえば、ポインターのインデックスは、コーディング スタイルpointer[i++]
または*pointer++
と同様に、シーケンシャルにインクリメントする必要があります。 -
RANDOM
: データは、アクセラレータへのキャッシュとして機能するオンチップ メモリに転送されます。このため、CU コードはシーケンシャル アクセス パターンに従う必要はありません。重要: オンチップ メモリ リソースは制限されています (たとえば、32 ビットの 1024 ワードとしてアクセス可能な BRAM あたり 32 キロビットなど)。計算ジョブごとに大きなペイロード サイズが使用するオンチップ RAM が多すぎる場合、Vivado ツールでタイミング クロージャの問題が発生する可能性があります。次に説明するように、アクセラレータをグローバル メモリに直接接続するZERO_COPY
ガイダンス マクロを使用することをお勧めします。
-
-
- DATA_COPY(<port>, <port>[<Num>]);
-
グローバル メモリとアクセラレータ インタフェース間のデータ ムーバー IP を推論します。このデータ ムーバー IP は、各
compute()
呼び出しの実行時に、SYS_PORT
またはSYS_PORT_PFM
ガイダンス マクロによって指定されたソース メモリ、またはローカル オンチップ メモリとの間で特定のcompute()
引数のデータをコピーします。-
<port>
は特定のcompute()
引数の名前です。 -
<port>[<Num>]
は、(配列またはポインター) 引数が参照する配列エレメントの数を指定します。Num
は、compute()
の C 定数やスカラー引数の式を指定できます。これにより、アクセラレータが実行時にダイナミック ペイロード サイズを決定し、AXI4 接続での自動バースト、データ幅変換、およびユーザー定義の引数データ型のパディングができるようになります。
重要:DATA_COPY
をRANDOM
アクセス パターンと共にを使用する場合は、計算 API のプロトタイプ内の対応する引数を固定サイズの配列として宣言する必要があります。たとえば、compute(int A[10], ...)
のように指定します。 -
- ZERO_COPY(<port>);
-
データ ムーバー IP を推論しないように VSC に指示します。代わりに、アクセラレータが、
compute()
関数の指定した引数に対し、指定されたグローバル メモリに直接接続された AXI4 インターフェイスを使用するようにします。-
<port>
は特定のcompute()
引数の名前です。
-
- ASSIGN_SLR(<PE>, <SLR-IDS>);
-
VSC が、指定された PE の関連ロジックを指定された SLR に配置するように Vivado に対して要求します。ただし、これは要求にすぎず、最終決定は配置時になります。
-
<PE>
: プロセッシング エレメントの名前を指定します。ヒント:compute()
関数を指定すると、compute()
関数内のすべての PE に SLR 割り当てが適用されます。 -
<SLR-IDS>
: PE の配置に使用する SLR を指定します。これは、次の形式のいずれかで指定できます。-
<SLR-ID>
: 指定した SLR-ID をこの PE のすべての CU インスタンスに適用します。 -
(
<CU1-SLR-ID> : ... : <NCU-SLR-ID>
): かっこ内に SLR-ID をコロンで分けてリストします。これらの SLR-ID は CU インスタンスに割り当てられます。エントリ数は、クラス内で指定された数の CU (/*NCU=*/4
) と一致する必要があります。
-
-
- FREE_RUNNING(<PE>);
-
指定された PE 関数を、ハードウェアで実行中のカーネルまたは常に実行中のカーネルとしてマークできるようにします。詳細は、アクセラレータ システムの構成 を参照してください。