カーネル配置の変更

新しいプラットフォームにターゲットを変更する際の主な問題は、既存のカーネル配置が新しいターゲット プラットフォームで動作するようにすることです。各ターゲット プラットフォームには、スタティック領域で定義された FPGA が含まれます。次の図に示すように、ターゲット プラットフォームは異なっていることがあります。

  • 左側のターゲット プラットフォームには SLR が 4 つあり、スタティック領域が 4 つの SLR すべてにまたがっています。
  • 右側のターゲット プラットフォームには SLR が 3 つしかなく、スタティック領域はすべて SLR1 内に完全に含まれています。
1: ハードウェア プラットフォームのターゲット プラットフォームの比較


このセクションでは、カーネルの配置前の変更方法を説明します。

新しいハードウェア プラットフォームに移行する際の注意点

次の図に、新規ターゲット プラットフォームに移行する際に発生するカーネル配置の問題を示します。この例では、次のようになっています。

  • 既存のカーネルの kernel_B は新しいターゲット プラットフォームの SLR2 には大きすぎて収まりません。これは、この SLR のほとんどがスタティック領域で使用されているからです。
  • 新しいターゲット プラットフォームには既存のプラットフォームのように SLR が 4 つないので、既存のカーネルの kernel_D は新しい SLR に移動する必要があります。
2: プラットフォームの移行: カーネルの配置


新しいプラットフォームに移行する場合は、次を実行する必要があります。

これらについては、次のセクションで説明します。

カーネルを配置する場所の決定

カーネルを配置する場所を決めるには、次の 2 つの情報が必要です。

  • ハードウェア プラットフォーム (.xsa) の各 SLR で使用可能なリソース。
  • 各カーネルに必要なリソース。

これら 2 つの情報を使用すると、ターゲット プラットフォームの各 SLR にどのカーネルを配置するかを決定できます。

これらを計算する際は、使用可能なリソースの 10% がシステム インフラストラクチャで使用される可能性があることに注意してください。

  • インフラストラクチャ ロジックは、カーネルが SLR 境界をまたぐ必要がある場合にカーネルを DDR インターフェイスに接続するのに使用できることがあります。
  • FPGA では、リソースが信号配線にも使用されます。信号配線にもリソースが必要なので、FPGA で使用可能なリソースを 100% 使用することはできません。

使用可能な SLR リソース

リリースでサポートされるさまざまプラットフォームの各 SLR で使用可能なリソースについては、Vitis 2019.2 ソフトウェア プラットフォーム リリース ノート を参照してください。次は、ターゲット プラットフォームの例です。この例の詳細は、次のとおりです。

  • SLR 記述は、どの SLR にスタティック領域やダイナミック領域が含まれるかを示しています。
  • 各 SLR で使用可能なリソース (LUT、レジスタ、RAM など) がリストされます。

これにより、各 SLR でどのリソースが使用可能かどうかを判断できます。

表 1. ハードウェア プラットフォームの SLR リソース
エリア SLR 0 SLR 1 SLR 2
SLR 記述 デバイスの最下部、ダイナミック領域専用。 デバイスの中部、ダイナミック領域およびスタティック領域リソースで共有。 デバイスの最上部、ダイナミック領域専用。
ダイナミック領域の Pblock 名 pfa_top_i_dynamic_region_pblock _dynamic_SLR0 pfa_top_i_dynamic_region_pblock _dynamic_SLR1 pfa_top_i_dynamic_region_pblock _dynamic_SLR2
計算ユニット配置構文 set_property CONFIG.SLR_ASSIGNMENTS SLR0[get_bd_cells<cu_name>] set_property CONFIG.SLR_ASSIGNMENTS SLR1[get_bd_cells<cu_name>] set_property CONFIG.SLR_ASSIGNMENTS SLR2[get_bd_cells<cu_name>]
ダイナミック領域で使用可能なグローバル メモリ リソース
メモリ チャネル、システム ポート名 bank0 (16 GB DDR4) bank1 (16 GB DDR4、スタティック領域)

bank2 (16 GB DDR4、ダイナミック領域)

bank3 (16 GB DDR4)
ダイナミック領域で使用可能なファブリック リソースの概算
CLB LUT 388K 199K 388K
CLB レジスタ 776K 399K 776K
ブロック RAM タイル 720 420 720
UltraRAM 320 160 320
DSP 2280 1320 2280

カーネル リソース

各カーネルのリソースは、System Estimate レポートからわかります。

System Estimate レポートは、ハードウェア エミュレーションまたはシステム実行のいずれかが終了したら、Assistant ビューに表示されるようになります。次は、そのレポートの例です。

3: システム見積もりレポート


  • FF は、各 SLR のプラットフォーム リソースの箇所に記述された CLB レジスタのことです。
  • FF は、各 SLR のプラットフォーム リソースの箇所に記述された CLB レジスタのことです。
  • DSP は、各 SLR のプラットフォーム リソースの箇所に記述された DSP のことです。
  • ブロック RAM は、各 SLR のプラットフォーム リソースの箇所に記述されたブロック RAM タイルのことです。

この情報は、カーネルごとに適切な SLR を指定するのに役立ちます。

カーネルの SLR への割り当て

デザインの各カーネルは、v++ --config コマンド ライン オプションで指定するコンフィギュレーション ファイルに connectivity.slr オプションを使用すると、SLR 領域に割り当てることができます。詳細は、計算ユニットの SLR への割り当て を参照してください。

ザイリンクスでは、カーネルを配置する場合、カーネル ポートのグローバル メモリへのマップ に示すように connectivity.sp コンフィギュレーション オプションを使用して、カーネルが接続される特定の DDR メモリ バンクを割り当てることをお勧めしています。

次の図は 4 つの SLR を含む既存のターゲット プラットフォームと 3 つの SLR を含む新しいターゲット プラットフォームの例を示しています。スタティック領域の構造も 2 つのプラットフォーム間では異なっています。この移行の例の詳細は、次のとおりです。

  • Kernel_A は SLR0 にマップされます。
  • Kernel_B は SLR1 にはフィットしなくなったので、使用可能なリソースがある SLR0 にリマップされます。
  • Kernel_C は SLR2 にマップされます。
  • Kernel_D は使用可能なリソースがある SLR2 にリマップされます。

カーネル マップは、次の図に示すようになります。

4: カーネルの SLR へのマップ


カーネル配置の指定

たとえば、上記の例の場合、カーネルを割り当てるコンフィギュレーション ファイルは次のようになります。

[connectivity]
nk=kernel:4:kernel_A.lernel_B.kernel_C.kernel_D

slr=kernel_A:SLR0
slr=kernel_B:SLR0
slr=kernel_C:SLR2
slr=kernel_D:SLR2

上記の図の各カーネルを配置する v++ コマンド ラインは、次のようになります。

v++ -l --config config.txt ...

カーネル DDR インターフェイスの指定

カーネル配置を指定する場合は、カーネル DDR メモリ インターフェイスも指定する必要があります。DDR インターフェイスを指定すると、別の SLR にある DDR インターフェイスへのカーネル接続が自動的にパイプライン処理されるようになります。これにより、タイミングが落ちることはないので、最大クロック周波数を削減される可能性があります。

この例では、上記の図のカーネル配置を使用して、次が実行されます。

  • Kernel_A はメモリ バンク 0 に接続されます。
  • Kernel_B はメモリ バンク 1 に接続されます。
  • Kernel_C はメモリ バンク 2 に接続されます。
  • Kernel_D はメモリ バンク 1 に接続されます。

これらの接続を実行するコンフィギュレーション ファイルは次のようになり、v++ --config コマンドを使用して渡されます。

[connectivity]
nk=kernel:4:kernel_A.lernel_B.kernel_C.kernel_D

slr=kernel_A:SLR0
slr=kernel_B:SLR0
slr=kernel_C:SLR2
slr=kernel_D:SLR2

sp=kernel_A.arg1:DDR[0]
sp=kernel_B.arg1:DDR[1]
sp=kernel_C.arg1:DDR[2]
sp=kernel_D.arg1:DDR[1]
重要: connectivity.sp オプションを使用してカーネル ポートをメモリ バンクに割り当てる際は、カーネルのすべてのインターフェイス/ポートをマップする必要があります。詳細は、カーネル ポートのグローバル メモリへのマップ を参照してください。