Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

NVIDIA Jetson プラットフォームでの GPU プロファイリング

この例では、関数 gpuPerformanceAnalyzer を使用して、Jetson プラットフォームで生成された CUDA® コードのパフォーマンスを解析して最適化する方法を示します。

関数 gpuPerformanceAnalyzer は、生成されたコード内の CPU と GPU のアクティビティに関するメトリクスを収集するソフトウェアインザループ (SIL) 実行を行います。関数は、CUDA 生成コードのパフォーマンス ボトルネックを可視化し、特定し、緩和するために使用できる時系列のタイムライン プロットを含むレポートを提供します。

この例では、GPU Coder の "特徴のマッチング" の例で使用するためのパフォーマンス アナライザー レポートを生成します。詳細については、特徴のマッチングを参照してください。

必要条件

ターゲット ボード要件

  • NVIDIA® Jetson™ 組み込みプラットフォーム。

  • ターゲット ボードとホスト PC を接続するイーサネット クロスオーバー ケーブル (ターゲット ボードをローカル ネットワークに接続できない場合)。

  • ターゲット ボードにインストールされている NVIDIA CUDA Toolkit。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。サポートされているコンパイラおよびライブラリのバージョンおよびその設定の詳細については、Install and Setup Prerequisites for NVIDIA Boards for NVIDIA boards を参照してください。

  • GPU パフォーマンス カウンターにアクセスする権限。CUDA Toolkit v10.1 以降では、NVIDIA はパフォーマンス カウンターへのアクセスを管理者ユーザーのみに制限します。GPU パフォーマンス カウンターをすべてのユーザーに対して有効にするには、Permission issue with Performance Counters (NVIDIA) に記載されている手順を参照してください。

開発用ホスト要件

ホストでの NVIDIA サポート パッケージのインストールの検証

関数 checkHardwareSupportPackageInstall を使用して、この例を実行するために必要なサポート パッケージがホスト システムにあることを確認します。

checkHardwareSupportPackageInstall();

NVIDIA ハードウェアへの接続

GPU Coder Support Package for NVIDIA GPUs は、生成された CUDA コードを Jetson プラットフォームでビルドおよび実行している間、TCP/IP 経由の SSH 接続を使用してコマンドを実行します。そのため、ターゲット プラットフォームをホスト コンピューターと同じネットワークに接続するか、イーサネット クロスオーバー ケーブルを使用してボードをホスト コンピューターに直接接続しなければなりません。ボードの設定および構成方法については NVIDIA のドキュメンテーションを参照してください。

NVIDIA ハードウェアと通信するには、関数jetsonを使用してライブ ハードウェア接続オブジェクトを作成しなければなりません。ライブ ハードウェア接続オブジェクトを作成するには、ターゲット ボードのホスト名または IP アドレス、ユーザー名、およびパスワードを知っている必要があります。たとえば、ターゲット ボードに初めて接続するときに、次のコマンドを使用して、Jetson ハードウェア用のライブ オブジェクトを作成します。

hwobj= jetson('host-name','username','password');

Jetson オブジェクトは、最近 Jetson ハードウェアに正常に接続されたときの設定を再利用します。この例では、メモリに保存されている設定を使用して、Jetson ハードウェアへの SSH 接続を確立します。

hwobj = jetson;
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
Checking for cuDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for prerequisite libraries is complete.
Gathering hardware details...
Checking for third-party library availability on the Target...
Gathering hardware details is complete.
 Board name              : NVIDIA Jetson AGX Xavier Developer Kit
 CUDA Version            : 11.4
 cuDNN Version           : 8.4
 TensorRT Version        : 8.4
 GStreamer Version       : 1.16.3
 V4L2 Version            : 1.18.0-2build1
 SDL Version             : 1.2
 OpenCV Version          : 4.5.4
 Available Webcams       : Logitech Webcam C925e
 Available GPUs          : Xavier
 Available Digital Pins  : 7  11  12  13  15  16  18  19  21  22  23  24  26  29  31  32  33  35  36  37  38  40

接続に失敗した場合、MATLAB® コマンド ラインで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。

異なるターゲットに対する複数のライブ接続オブジェクトがある場合、コード ジェネレーターは最新のライブ オブジェクトが作成されたターゲットでリモート ビルドを実行します。リモート ビルドを実行するハードウェア ボードを選択するには、各ライブ ハードウェア オブジェクトの setupCodegenContext() メソッドを使用します。ライブ接続オブジェクトが 1 つしか作成されていない場合、このメソッドを呼び出す必要はありません。

hwobj.setupCodegenContext;

ターゲットの GPU 環境の検証

この例に必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数coder.checkGpuInstallを使用します。

envCfg = coder.gpuEnvConfig('jetson');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

coder.gpuEnvConfig オブジェクトの Quiet プロパティが true に設定されている場合、関数 coder.checkGpuInstall は警告メッセージまたはエラー メッセージのみを返します。

特徴の検出と抽出

この例では、互いに回転およびスケーリングされた 2 つのイメージに対して特徴マッチングを実行します。2 つのイメージをマッチングする前に、各イメージの特徴点を検出および抽出しなければなりません。以下の関数 featureDetectionAndExtraction は、SURF (detectSURFFeatures (Computer Vision Toolbox)) 局所特徴検出器を使用して特徴点を検出し、extractFeatures (Computer Vision Toolbox)を使用して特徴を抽出します。

関数 featureDetectionAndExtraction は、参照イメージの特徴座標を格納する refPoints、クエリ イメージの特徴座標を格納する qryPoints、参照イメージ特徴記述子を格納する refDesc 行列、およびクエリ イメージ特徴記述子を格納する qryDesc 行列を返します。

  • refPoints = 参照イメージ特徴座標。

  • qryPoints = クエリ イメージ特徴座標。

  • refDescFeat = 参照イメージ特徴記述子。

  • qryDescFeat = クエリ イメージ特徴記述子。

K = imread('cameraman.tif'); 
refImage = imresize(K,3);
scale = 0.7;                  
J = imresize(refImage,scale);
theta = 30.0;                 
qryImage = imrotate(J,theta); 
[refPoints,refDescFeat,qryPoints,qryDescFeat] = featureDetectionAndExtraction(refImage,...
    qryImage);

エントリポイント関数 feature_matching

関数 feature_matching は 2 つのイメージから抽出された特徴点および特徴記述子を受け取り、それらの間でマッチする点を見つけます。

type feature_matching
function [matchedRefPoints,matchedQryPoints] = feature_matching(refPoints,...
    refDesc,qryPoints,qryDesc) 
%#codegen
% Copyright 2018-2021 The MathWorks, Inc.

coder.gpu.kernelfun;
%% Feature Matching
[indexPairs,matchMetric] = matchFeatures(refDesc, qryDesc);
matchedRefPoints = refPoints(indexPairs(:,1),:);
matchedQryPoints = qryPoints(indexPairs(:,2),:);

GPU パフォーマンス アナライザー レポートの生成

関数 gpuPerformanceAnalyzer を使用して生成コードのパフォーマンスを解析するには、入力引数 dll を使用し、ダイナミック ライブラリ ビルド タイプでコード構成オブジェクトを作成します。関数 gpuPerformanceAnalyzer は Embedded Coder™ 構成オブジェクトのみを受け入れるため、coder.EmbeddedCodeConfig 構成オブジェクトを作成するオプションを有効にします。

cfg = coder.gpuConfig('dll','ecoder',true);

また、GPU パフォーマンス アナライザーを使用して、NVIDIA® Jetson™ および NVIDIA DRIVE® プラットフォームをターゲットとする深層学習アプリケーションと組み込みアプリケーションをプロファイリングすることもできます。組み込みターゲット用に gpuPerformanceAnalyzer を使用するには、コード構成オブジェクトのハードウェア プロパティを適切なターゲット プラットフォームに設定します。

cfg.Hardware = coder.Hardware('NVIDIA Jetson');

既定の反復回数 2 で gpuPerformanceAnalyzer を実行します。

inputs = {refPoints,refDescFeat,qryPoints,qryDescFeat};
designFileName = 'feature_matching';

gpuPerformanceAnalyzer(designFileName, inputs, ...
    'Config', cfg, 'NumIterations', 2);
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
### Starting GPU code generation
### Connectivity configuration for function 'feature_matching': 'NVIDIA Jetson'
PIL execution is using Port 17725.
PIL execution is using 30 Sec(s) for receive time-out.
Code generation successful: View report

### GPU code generation finished
### Starting application profiling
### Starting application: 'codegen/dll/feature_matching/pil/feature_matching.elf'
    To terminate execution: clear feature_matching_pil
### Launching application feature_matching.elf...
PIL execution terminated on target.
### Application profiling finished
### Starting profiling data processing
### Profiling data processing finished
### Showing profiling data

GPU パフォーマンス アナライザー

GPU パフォーマンス アナライザー レポートには、GPU と CPU のアクティビティ、イベント、パフォーマンス メトリクスが時系列のタイムライン プロットで一覧表示されます。これらは、CUDA 生成コードのパフォーマンス ボトルネックを可視化し、特定し、対処するために使用できます。

ss1_1.png

これらの数値は代表的なものです。実際の値はハードウェア設定によって異なります。この例のプロファイリングは、6 コアの 3.5GHz Intel® Xeon® CPU と NVIDIA TITAN XP GPU を搭載したマシンで Jetson AGX Xavier 開発キットを使用し、MATLAB® R2023b を使用して行われました。

プロファイリング タイムライン

プロファイリング タイムラインには、実行時間がしきい値を上回るすべてのイベントの完全なトレースが表示されます。次のイメージは、しきい値が 0.0 ms に設定されている場合のプロファイリング トレースのスニペットを示しています。

ss2_1.png

マウス ホイールまたは同等のタッチパッド オプションを使用して、タイムラインのズーム レベルを制御できます。あるいは、パネル上部にあるタイムラインの概要を使用して、ズーム レベルを制御したり、タイムライン プロットを操作したりすることもできます。

各イベントのツールヒントは、CPU と GPU 上での選択されたイベントの開始時間、終了時間、および持続時間を示します。ツールヒントは、CPU でカーネルが起動されてから GPU で実際にカーネルが実行されるまでの経過時間も示します。

各イベントで右クリック コンテキスト メニューを使用して、CPU イベントと対応する GPU イベントの間でトレースを追加します。右クリック メニューを使用して、コード ペイン上のイベントに対応する CUDA 生成コードを表示することもできます。

イベント統計

イベント統計ペインには、選択したイベントの追加情報が表示されます。たとえば、feature_matching_kernel1 は次の統計を示します。

ss3.png

洞察

洞察ペインには、GPU と CPU のアクティビティの概要を示す円グラフが含まれます。円グラフは、プロファイリング タイムラインのズーム レベルに応じて変化します。次のイメージは洞察のスニペットを示しています。タイムラインで選択された領域内で、GPU 使用率がわずか 52% であることを示しています。

ss4_1.png

呼び出しツリー

このセクションでは、CPU から呼び出される GPU イベントを一覧表示します。呼び出しツリーの各イベントには、呼び出し元関数の実行時間が割合として一覧表示されます。このメトリクスは、生成されたコードのパフォーマンス ボトルネックを特定するのに役立ちます。呼び出しツリーで対応するイベントをクリックして、プロファイリング タイムラインの特定のイベントに移動することもできます。

フィルター

このセクションでは、レポートのフィルター処理オプションを提供します。

  • ビュー モード — アプリケーション全体 (初期化と終了を含む) または設計関数 (初期化と終了なし) のプロファイリング結果を表示します。

  • イベントしきい値 — 指定されたしきい値より短いイベントをスキップします。

  • メモリの割り当て/解放 — GPU デバイスのメモリ割り当てと割り当て解除に関連するイベントを CPU アクティビティ バーに表示します。

  • メモリ転送 — ホストからデバイス、およびデバイスからホストへのメモリ転送を表示します。

  • カーネル — CPU カーネルの起動と GPU カーネルのアクティビティを表示します。

  • その他 — 同期や GPU の待機など、その他の GPU 関連イベントを表示します。

Feature_Matching のパフォーマンス改善

パフォーマンス アナライザーのレポートから、実行時間のかなりの部分がメモリの割り当てと割り当て解除に費やされていることがわかります。パフォーマンスを改善するには、GPU メモリ マネージャーをオンにして、解析を再度実行します。

GPU メモリ マネージャーは、大きな GPU メモリ プールのコレクションを作成し、これらのプール内のメモリ ブロックのチャンクの割り当ておよび割り当て解除を管理します。大きなメモリ プールを作成することにより、メモリ マネージャーは CUDA のメモリ API に対する呼び出し回数を減らして、実行時のパフォーマンスを向上させます。

killApplication(hwobj,'feature_matching');
cfg = coder.gpuConfig('dll');
cfg.GpuConfig.EnableMemoryManager = true;
cfg.Hardware = coder.Hardware('NVIDIA Jetson');

gpuPerformanceAnalyzer(designFileName, inputs, ...
    'Config', cfg, 'NumIterations', 2);
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
### Starting GPU code generation
### Connectivity configuration for function 'feature_matching': 'NVIDIA Jetson'
PIL execution is using Port 17725.
PIL execution is using 30 Sec(s) for receive time-out.
Code generation successful: View report

### GPU code generation finished
### Starting application profiling
### Starting application: 'codegen/dll/feature_matching/pil/feature_matching.elf'
    To terminate execution: clear feature_matching_pil
### Launching application feature_matching.elf...
PIL execution terminated on target.
### Application profiling finished
### Starting profiling data processing
### Profiling data processing finished
### Showing profiling data

ss5_1.png

GPU メモリ マネージャーを使用すると、GPU 使用率が 76% に増加します。

参考

関数

オブジェクト

関連するトピック