リンク段階では、カーネルのメモリ ポートが DDR、HBM、および PLRAM を含むメモリ リソースに接続されます。デフォルトでは、v++
リンク プロセスで xclbin
ファイルが生成されるときに、すべてのカーネル メモリ インターフェイスが同じグローバル メモリ バンク (または gmem
) に接続されます。そのため、メモリ バンクとデータを転送できるのは一度に 1 つのメモリ インターフェイスのみなので、カーネルのパフォーマンスはメモリ アクセスにより制限されます。
Vitis コンパイラでは CU がグローバル メモリ リソースに自動的に接続できますが、各カーネル引数 (またはインターフェイス) が接続されているグローバル メモリ バンクを手動で指定することもできます。帯域幅を最大にし、データ転送を最適化して、全体的なパフォーマンスを改善するには、カーネルとメモリを正しく接続することが重要です。デバイスに計算ユニットが 1 つしかない場合でも、入力と出力引数を別々のグローバル メモリ バンクに割り当てると、入力データと出力データに同時にアクセスできるようになるので、パフォーマンスを向上できます。
--conectivity.sp
を使用して接続を複数のメモリ バンクに分散する必要があります。次の例は、カーネル インターフェイス コード例に基づいています。まず、カーネル引数を別々のバンドルに割り当てて使用可能なインターフェイス ポートを増やし、その引数を別々のメモリ バンクに割り当てます。
- C/C++ カーネルの場合、コンパイル前に引数をカーネル コードで別々のバンドルに割り当てます。
void cnn( int *pixel, // Input pixel int *weights, // Input Weight Matrix int *out, // Output pixel ... // Other input or Output ports #pragma HLS INTERFACE m_axi port=pixel offset=slave bundle=gmem #pragma HLS INTERFACE m_axi port=weights offset=slave bundle=gmem1 #pragma HLS INTERFACE m_axi port=out offset=slave bundle=gmem
上記の例では、メモリ インターフェイス入力
pixel
とweights
に異なるバンドル名が割り当てらていますが、out
はpixel
とバンドルされています。これにより、2 つの別々のインターフェイス ポートが作成されます。重要:bundle=
で名前を指定する場合は、--connectivity.sp
オプションを使用して特定のメモリ バンクに割り当てることができるように、すべて小文字を使用してください。 - コンフィギュレーション ファイルに
--connectivity.sp
オプションを含め、そのコンフィギュレーション ファイルを、Vitis コンパイラ コマンド で説明されるように、v++
コマンド ラインで--config
オプションを使用して指定します。たとえば、上記のcnn
カーネルの場合は、コンフィギュレーション ファイルでconnectivity.sp
オプションを次のように指定します。[connectivity] #sp=<compute_unit_name>.<argument>:<bank name> sp=cnn_1.pixel:DDR[0] sp=cnn_1.weights:DDR[1] sp=cnn_1.out:DDR[2]
説明:
-
<compute_unit_name>
:connectivity.nk
オプションで定義されている CU のインスタンス名 (複数のカーネル インスタンスの作成 を参照)、または複数の CU が指定されていない場合は<kernel_name>_1
。 -
<argument>
: カーネル引数の名前。C/C ++ カーネルの場合、m_axi_
およびbundle
名など、HLS INTERFACE プラグマで定義されるカーネル インターフェイス名を指定することもできます。上記のcnn
カーネルの場合、ポートはm_axi_gmem
およびm_axi_gmem1
です。ヒント: RTL カーネルの場合、インターフェイスは kernel.xml ファイルで定義されるインターフェイス名で指定されます。 -
<bank_name>
: バンク名。4 つの DDR バンクを含むプラットフォームの場合はDDR[0]
、DDR[1]
、DDR[2]
、およびDDR[3]
となります。また、メモリを DDR[0:2] などの連続するバンク範囲として指定することもできます。この場合、実行時に XRT によってメモリ バンクが割り当てられます。PLRAM、HBM、HP または MIG メモリをサポートするプラットフォームもあり、その場合は PLRAM[0]、HBM[0]、HP[0] または MIG[0] を使用します。プラットフォームで使用可能なグローバル メモリ バンクに関する情報を取得するには、
platforminfo
を使用します。詳細は、platforminfo ユーティリティ を参照してください。DDR メモリ バンクと HBM メモリ バンクの両方を含むプラットフォームでは、別々の AXI インターフェイスを使用して、カーネルが異なるメモリにアクセスできるようにする必要があります。DDR および PLRAM アクセスは、1 つのポートから共有できます。
-
重要: ホスト コードでの DDR バンクの割り当て に示すように、バンク割り当てのカスタマイズは、ホスト コードにも反映させる必要があることもあります。
-
ホスト メモリへの直接接続
PCIe®
Slave-Bridge IP は、カーネルがホスト メモリに直接アクセスできるようにするため、一部のデータセンター プラットフォームで提供されています。デバイス バイナリをメモリに接続するように設定するには、次の --connectivity.sp
コマンドで指定されたリンクを変更する必要があります。また、XRT 資料のホストメモリ アクセスで説明されるように、アクセラレータ カードのセットアップとホスト アプリケーションを変更する必要もあります。
[connectivity]
## Syntax
##sp=<cu_name>.<interface_name>:HOST[0]
sp=cnn_1.m_axi_gmem:HOST[0]
上記のコマンド構文では、CU 名とインターフェイス名は同じですが、バンク名は HOST[0]
にハード コード化されています。