AI エンジンに接続された NMU のプロファイリング手順 - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語
次に、NoC をプロファイリングする手順を示します。手順を実行する前に、ハードウェア ブート イメージ (sd_card.img) を生成しておく必要があります。
  1. settings64.csh スクリプトをソースとして読み込み、Vitis ツール環境をセットアップします。
    <Vitis Installation Path>/Vitis/<202x.x>/settings64.sh
  2. 次のコマンドを使用して Chipscopy サーバーを起動します。
    cs_server &
    図 1. Chipscopy サーバー
  3. ターゲット ボードに接続するコンピューターからハードウェア サーバーを実行します。これを実行するためには、VCK 190 ボードに JTAG 接続しているコンピューターからハードウェア サーバーを起動します。上記にハイライトしている cs_server のコンピューター名または IP アドレスをメモしておきます。
  4. sd_card イメージを使用してボードを起動します。
  5. ローカルの Linux ターミナルで、v++ のビルド出力があるディレクトリに移動します。
  6. 次のように vperf コマンドのオプションを設定します。
    vperf --link_summary <Design>.xsa.link_summary --hw_url <TCP:ComputerName>/<IP>:3121 --cs_url <TCP:ComputerName>/<IP>:3042 --verbose

    --link_summary オプションを指定する必要があります。このオプションは、v++ --link ステップで生成される link_summary 出力に設定します。--hw_url オプションはハードウェア サーバーのロケーションに、--cs_url オプションは Chipscopy のロケーションに設定します。

    コマンドが実行されると、次の出力が生成されます。

    [INFO] Successfully connected to hw_server and cs_server
    [INFO] Debug IP layout found at : <Vitis Build Path>/_x/link/int/debug_ip_layout.rtd
    [INFO] HW Device : xilinx_vck190_base_<>
    1  NOC_NMU128_X0Y6     :  CIPS_0/FPD_CCI_NOC_0
    2  NOC_NMU128_X0Y7     :  CIPS_0/FPD_CCI_NOC_1
    3  NOC_NMU128_X0Y8     :  CIPS_0/FPD_CCI_NOC_2
    4  NOC_NMU128_X0Y9     :  CIPS_0/FPD_CCI_NOC_3
    5  NOC_NMU128_X0Y4     :  CIPS_0/FPD_AXI_NOC_0
    6  NOC_NMU128_X0Y5     :  CIPS_0/FPD_AXI_NOC_1
    7  NOC_NMU128_X0Y3     :  CIPS_0/LPD_AXI_NOC_0
    8  NOC_NMU128_X0Y2     :  CIPS_0/PMC_NOC_AXI_0
    9  NOC_NMU128_X7Y10    :  ai_engine_0/M03_AXI
    10 NOC_NMU128_X10Y10   :  ai_engine_0/M00_AXI
    11 NOC_NMU128_X12Y10   :  ai_engine_0/M01_AXI
    12 NOC_NMU128_X8Y10    :  ai_engine_0/M05_AXI
    13 NOC_NMU128_X9Y10    :  ai_engine_0/M04_AXI
    14 NOC_NMU128_X11Y10   :  ai_engine_0/M02_AXI
    15 DDRMC_X0Y0          :  DDRMC/DDRMC_X0Y0
    16 DDRMC_X3Y0          :  DDRMC/DDRMC_X3Y0
    17 DDRMC_X1Y0          :  DDRMC/DDRMC_X1Y0

    vperf コマンドはリンク サマリからメタデータを読み出し、デザインで使用される NoC NMU に対応するすべてのノードを入力します。たとえば、上記の出力では、Control, Interfaces, and Processing System (CIPS)、AI エンジン GMIO インターフェイス ポート、および DDR メモリ コントローラー チャネル ポートに対応する NoC NMU ユニットが一覧表示されています。

    vperf プロファイリング制御コマンドを使用して、対象ノードをフィルタリングし、プロファイリングを開始できます。

    次に、対象ノードのプロファイリングを開始/終了するために使用可能な制御コマンドの一覧を示します。

    表 1. vperf 制御コマンド
    コマンド 説明
    s/start_profile プロファイリングを開始します。
    e/end_profile プロファイリングを終了します。
    q/quit プロファイリングを終了し、vperf コマンドを終了します。
    n/set_npi_sample_period 値がサンプリングされる期間を示すサンプル期間を設定します。このコマンドを実行すると、使用可能なデバッグ コアが検出され、サポートされているサンプル期間が表示されます。サンプル期間は ID を使用して選択できます。
    ID [Sample Period]
    0 56 ms
    1 112 ms
    2 224 ms
    3 447 ms
    4 895 ms
    5 1790 ms
    6 3579 ms
    7 7158 ms
    t/set_tslide 2 TSLIDE クロック サイクルを 1 カウントとして表します。このコマンドは、NoC のプロファイリング時にオーバーフローが発生した場合に便利です。
    f/set_filter このコマンドを使用して、プロファイリングするノードを選択できます。カンマ区切りでノードのリストを指定するか、範囲を指定できます。
    フィルター文字列 選択したノード
    1,3,4,5,6,8 1,3,4,5,6,8
    1-5.8 1,2,3,4,5,8
    2,4,9-10 2,4,9,10
    一度にサンプリングするのは、最大 4 ノードまでとすることをお勧めします。これを超えると、JTAG を介するサンプリング間隔が遅くなります。4 ノードを超えるプロファイリングは、サンプルの欠落を招き、不正確な結果となる可能性があります。
    c/clear_filter すべてのフィルターをクリアし、すべてのノードをプロファイリングします (デフォルト)。
    p/print プロファイリングを開始する前に、参照用として簡易的なコンフィギュレーションを表示します。

    次に、npi_sample_periodTslide オプションの設定例を示します。

    > n
    Discovering debug cores...Done!
    
    Enumerating NoC (warning this can take 60-80s on xcvc1902)...Done
    Discovered Nodes: 
    {'enabled': ['DDRMC_X0Y0', 'DDRMC_X1Y0', 'DDRMC_X3Y0', 'NOC_NMU128_X0Y3', 'NOC_NMU128_X0Y2', 'NOC_NMU128_X0Y4', 'NOC_NMU128_X0Y5', 'NOC_NMU128_X0Y6', 'NOC_NMU128_X0Y7', 'NOC_NMU128_X0Y8', 'NOC_NMU128_X0Y9', 'NOC_NMU128_X11Y10', 'NOC_NMU128_X12Y10', 'NOC_NMU128_X9Y10', 'NOC_NMU128_X10Y10', 'NOC_NMU128_X7Y10', 'NOC_NMU128_X8Y10', 'NOC_NSU128_X6Y6'], 'disabled': [], 'invalid': []}
    Select ID from the list:
    ID  Sample Period 
    0  :  56ms
    1  :  112ms
    2  :  224ms
    3  :  447ms
    4  :  895ms
    5  :  1790ms
    6  :  3579ms
    7  :  7158ms
    
    >> 0
    [INFO] Sample period changed to 56ms
    
    > t
    Select Tslide between 0 and 27:
    >> 1
    [INFO] Tslide changed to: 1.
    
  7. すべてのコンフィギュレーションが設定されたら、s/start_profile を使用してプロファイリングを開始できます。
  8. ハードウェア Linux コンソールに移動し、アプリケーションを実行します。run が完了したら、e/end_profile を使用してプロファイリングを終了できます。
  9. q/quit コマンドを使用して vperf ユーティリティから終了すると、新しい vperf.run_summary ファイルが生成されます。このファイルは、Vitis IDE で開くことができます。

    次の例では、AI エンジン アプリケーションに 3 つの GMIO 入力ポートと 6 つの GMIO 出力ポートが含まれています。vperf ユーティリティでオプションの f コマンドを使用して、プロファイリングの対象となるノードをフィルタリングすると、次のように利用可能なノードがすべて表示されます。

    > f
    List of detected nodes in the design:
    1  NOC_NMU128_X0Y6     :  CIPS_0/FPD_CCI_NOC_0
    2  NOC_NMU128_X0Y7     :  CIPS_0/FPD_CCI_NOC_1
    3  NOC_NMU128_X0Y8     :  CIPS_0/FPD_CCI_NOC_2
    4  NOC_NMU128_X0Y9     :  CIPS_0/FPD_CCI_NOC_3
    5  NOC_NMU128_X0Y4     :  CIPS_0/FPD_AXI_NOC_0
    6  NOC_NMU128_X0Y5     :  CIPS_0/FPD_AXI_NOC_1
    7  NOC_NMU128_X0Y3     :  CIPS_0/LPD_AXI_NOC_0
    8  NOC_NMU128_X0Y2     :  CIPS_0/PMC_NOC_AXI_0
    9  NOC_NMU128_X7Y10    :  ai_engine_0/M03_AXI
    10 NOC_NMU128_X10Y10   :  ai_engine_0/M00_AXI
    11 NOC_NMU128_X12Y10   :  ai_engine_0/M01_AXI
    12 NOC_NMU128_X8Y10    :  ai_engine_0/M05_AXI
    13 NOC_NMU128_X9Y10    :  ai_engine_0/M04_AXI
    14 NOC_NMU128_X11Y10   :  ai_engine_0/M02_AXI
    15 DDRMC_X0Y0          :  DDRMC/DDRMC_X0Y0
    16 DDRMC_X3Y0          :  DDRMC/DDRMC_X3Y0
    17 DDRMC_X1Y0          :  DDRMC/DDRMC_X1Y0
    

    ここで重要な点は、デザインに合計 9 つの I/O ポートが含まれていることです。一方で、AI エンジンに対応する NMU ノードは 6 つしかありません (ID: 9-14)。これは、インターフェイス タイルを介する各 AI エンジン - NMU 間接続に対して、2 つの MM2S と 2 つの S2MM チャネルがサポートされているためです。

    つまり、読み出しと書き込みは同じインターフェイス タイルを介して実行されますが、チャネルは異なる可能性が高くなります。したがって、読み出し転送と書き込み転送の両方に同じ NMU ノードが使用され、次の図に示すように、Vitis IDE の両方の NoC カウンターに同じ NMU ノードが表示されます。

    GMIO ポート (入力と出力の両方) のインターフェイス タイルとチャネル マッピングに関する情報は、Vitis IDE のグラフ コンパイル サマリ レポートで確認できます。

    図 2. インターフェイス チャネル

    次の例のコンフィギュレーションでは、3 つの NoC NMU 9-11 (JTAG 帯域幅の制限を考慮) をプロファイリングするように設定されています。

    Enter the filter to select Nodes from the above list:
    >> 9,10,11
    [INFO] Selected nodes according to the filter :
    1  NOC_NMU128_X7Y10    :  ai_engine_0/M03_AXI
    2  NOC_NMU128_X10Y10   :  ai_engine_0/M00_AXI
    3  NOC_NMU128_X12Y10   :  ai_engine_0/M01_AXI
    

    次の図に、Vitis IDE に表示される NoC プロファイル出力を示します。

    図 3. NoC カウンターの読み出し
    1. NoC カウンターの読み出しグループは、NMU を経由する、DDR から AI エンジンまでのトラフィックを示します。
    2. NMU ノードは GMIO 入力の読み出しに対応します。

      Vitis IDE の NoC プロファイル出力には、NMU 書き込みグループと対応するノードが含まれます。

      図 4. NoC カウンターの書き込み
    3. NoC カウンターの書き込みグループは、NMU を経由する、AI エンジンから DDR までのトラフィックを示します。
    4. NMU ノードは GMIO 出力の書き込みに対応します。

      コンフィギュレーションは、NoC NMU 12-14 (JTAG 帯域幅の制限を考慮) をプロファイリングするようにに設定されています。

      Enter the filter to select Nodes from the above list:
      >> 12,13,14
      [INFO] Selected nodes according to the filter :
      1  NOC_NMU128_X8Y10    :  ai_engine_0/M05_AXI
      2  NOC_NMU128_X9Y10    :  ai_engine_0/M04_AXI
      3  NOC_NMU128_X11Y10   :  ai_engine_0/M02_AXI

ほかの NMU ノードのプロファイリングを入手するには次を実行します。

  1. npi_sample_periodTSLIDE の値を再設定し、必要なノードをフィルタリングします。
  2. プロファイリングを開始します。
  3. ハードウェアでアプリケーションを再度実行します。
  4. プロファイリングを終了して、新しい vperf.run_summary ファイルを生成します。
図 5. NoC カウンターの書き込みのみ

上の図では、プロファイル サマリには NoC カウンターの書き込みグループのみが表示され、読み出しグループはありません。これは、3 つのノードが GMIO 出力に対応し、GMIO 入力がそのインターフェイス タイルにマッピングされていないためです。

v++ リンク (_x/link/vivado/vpl/prj/prj.xpr) ステップで生成された Vivado プロジェクトを開いて、NoC インターコネクト ネットワークを表示し、NoC を経由するトラフィックがあるデザイン向けに接続されている NMU を特定することもできます。

図 6. NoC Vivado