カーネル ポートのグローバル メモリへのマップ - 2020.1 Japanese

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

Document ID
UG1393
Release Date
2020-08-20
Version
2020.1 Japanese

リンク段階では、カーネルのメモリ ポートが DDR、HBM、および PLRAM を含むメモリ リソースに接続されます。デフォルトでは、v++ リンク プロセスで xclbin ファイルが生成されるときに、すべてのカーネル メモリ インターフェイスが同じグローバル メモリ バンク (または gmem) に接続されます。そのため、メモリ バンクとデータを転送できるのは一度に 1 つのメモリ インターフェイスのみなので、カーネルのパフォーマンスはメモリ アクセスにより制限されます。

FPGA にグローバル メモリ バンクが 1 つしか含まれていない場合は、これが唯一の方法ですが、すべての Alveo データセンター アクセラレータ カードには複数のグローバル メモリ バンクが含まれています。リンク段階で、どのカーネル ポート (またはインターフェイス) をどのグローバル メモリ バンクに接続するかを指定できます。帯域幅を最大にし、データ転送を最適化して、全体的なパフォーマンスを改善するには、カーネルとメモリを正しく接続することが重要です。デバイスに計算ユニットが 1 つしかない場合でも、入力ポートと出力ポートを別々のバンクに割り当てると、入力データと出力データに同時にアクセスできるようになるので、パフォーマンスを向上できます。

重要: 15 本までのカーネル ポートを 1 つのグローバル メモリ バンクに接続できます。メモリ インターフェイスが 16 個以上ある場合は、ここで説明するように、--conectivity.sp を使用して接続を複数のメモリ バンクに分散する必要があります。
カーネル ポートをメモリ バンクにマップするには、次の手順に従います。
  1. カーネル インターフェイス の手順に従って、カーネル インスタンスに bundle 名を指定します。
  2. v++ のリンク時に、コンフィギュレーション ファイルで connectivity.sp オプションを使用して、カーネル ポートを適切なメモリ バンクにマップます。

v++ コンフィギュレーション ファイルで connectivity.sp オプションを使用してカーネル ポートをグローバル メモリ バンクに割り当てるには、次の手順に従います。

  1. カーネル インターフェイス のカーネル コード例から開始します。
    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
    

    メモリ インターフェイス入力 pixelweights に、異なるバンドル名が割り当てらています。これにより、2 つのポートを別々のグローバルメモリ バンクに割り当てることができます。

    重要: bundle= で名前を指定する場合は、--connectivity.sp オプションを使用して特定のメモリ バンクに割り当てることができるように、すべて小文字を使用してください。
  2. v++ リンク時に、個別のポートを異なるグローバルメモリ バンクにマップできます。コンフィギュレーション ファイルに --connectivity.sp オプションを含め、そのコンフィギュレーション ファイルを、Vitis コンパイラ コマンド で説明されているように、v++ コマンド ラインで --config オプションを使用して指定します。
    たとえば、上記の cnn カーネルの場合は、コンフィギュレーション ファイルで connectivity.sp オプションを次のように指定します。
    [connectivity]
    #sp=<compute_unit_name>.<interface_name>:<bank name> 
    sp=cnn_1.m_axi_gmem:DDR[0]          
    sp=cnn_1.m_axi_gmem1:DDR[1]
    説明:
    • <compute_unit_name>: connectivity.nk オプションで定義されている CU のインスタンス名 (複数のカーネル インスタンスの作成 を参照)、または複数の CU が指定されていない場合は <kernel_name>_1
    • <interface_name>: HLS INTERFACE プラグマで定義される m_axi_bundle 名を含むカーネル ポート名。上記の cnn カーネルの場合、ポートは m_axi_gmem および m_axi_gmem1 です。
      ヒント: ポートがバンドルの一部として指定されていない場合は、<interface_name>m_axi_ なしで port を使用して指定します。
    • <bank_name>: バンク名。4 つの DDR バンクを含むプラットフォームの場合は DDR[0]DDR[1]DDR[2]、および DDR[3] となります。PLRAM、HBM、HP または MIG メモリをサポートするプラットフォームもあり、その場合は PLRAM[0]、HBM[0]、HP[0] または MIG[0] を使用します。プラットフォームで使用可能なグローバル メモリ バンクに関する情報を取得するには、platforminfo を使用します。詳細は、platforminfo ユーティリティ を参照してください。
      重要: ホスト コードでの DDR バンクの割り当て に示すように、バンク接続のカスタマイズは、ホスト コードにも反映させる必要があります。