メインコンテンツ

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

この例では、gpuPerformanceAnalyzer 関数を使用して、Jetson™ プラットフォームで生成された CUDA® コードの GPU プロファイリングを実行する方法を示します。

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

この例では、特徴マッチング アルゴリズムのパフォーマンス アナライザー レポートを生成します。詳細については、特徴のマッチングを参照してください。

前提条件

ターゲット ボード要件

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

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

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

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

  • ターゲット ボードとホスト PC を接続するためのイーサネット クロスオーバー ケーブル。ターゲット ボードをローカル ネットワークに接続できる場合は、ケーブルは不要です。

開発用ホスト要件

  • NVIDIA CUDA Toolkit およびドライバー。

  • コンパイラおよびライブラリ用の、開発ホスト上の環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細については、サードパーティ ハードウェアを参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。

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

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

checkHardwareSupportPackageInstall();

NVIDIA ハードウェアへの接続

MATLAB Coder™ Support Package for NVIDIA Jetson and NVIDIA DRIVE® Platforms は、生成された 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 Orin Nano Developer Kit
CUDA Version            : 12.2
cuDNN Version           : 8.9
TensorRT Version        : 8.6
GStreamer Version       : 1.20.3
V4L2 Version            : 1.22.1-2build1
SDL Version             : 1.2
OpenCV Version          : 4.8.0
Available Webcams       :  
Available GPUs          : Orin
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 アドレスまたはホスト名が誤っていることです。

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

setupCodegenContext(hwobj);

ターゲットの 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)を使用して特徴を抽出します。

type featureDetectionAndExtraction.m
function [refPoints,refDesc,qryPoints,qryDesc] = featureDetectionAndExtraction(refImage,qryImage)

%   Copyright 2018-2021 The MathWorks, Inc.

%% Extract features from both the images and find matching points
% SURF Feature Detection
refPointsStruct = detectSURFFeatures(refImage, 'MetricThreshold', 300);
qryPointsStruct = detectSURFFeatures(qryImage, 'MetricThreshold', 300);

% SURF Feature Extraction
refDesc = extractFeatures(refImage, refPointsStruct, 'FeatureSize', 128);
qryDesc = extractFeatures(qryImage, qryPointsStruct, 'FeatureSize', 128);

% Extract coordinate locations from SURFPoints structure
refPoints = refPointsStruct.Location; 

% Extract coordinate locations from SURFPoints structure
qryPoints = qryPointsStruct.Location; 

関数 featureDetectionAndExtraction は次を返します。

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

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

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

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

この例では、camerman.tif 内のイメージが参照イメージです。参照イメージを回転およびスケーリングして新しいイメージを作成します。featureDetectionAndExtraction を使用して、両方のイメージから特徴を検出および抽出します。

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 関数は、featureDetectionAndExtraction によって 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 入力引数を使用し、ダイナミック ライブラリ ビルド タイプでコード構成オブジェクトを作成します。coder.EmbeddedCodeConfig 構成オブジェクトを作成するオプションを有効にします。

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

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

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

既定の反復回数 2 で gpuPerformanceAnalyzer を実行します。GPU パフォーマンス アナライザーは、両方の反復とプロファイリング セッション全体に関するパフォーマンス データを収集します。GPU パフォーマンス アナライザーの結果が自動的に開きます。

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 生成コードのパフォーマンス ボトルネックを可視化し、特定し、対処するために使用できます。

Performance Analyzer report for the feature_matching function

これらの数値は代表的なものです。実際の値はハードウェア設定によって異なります。この例では、MATLAB® R2025a を使用して、Jetson Orin Nano ボード上でプロファイリングを実行しました。

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

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

Profiling timeline pane showing the results between approximately 1ms and 3ms

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

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

Tooltip for the feature_matching_kernel2 kernel showing it executed for 0.025ms on the CPU and 0.067ms on the GPU

イベントの詳細を確認するには、タイムラインでそれを選択してください。ツールストリップで、[イベント アクション] セクションのボタンを使用して、生成されたコードをトレースし、関連イベントや、親または子のイベントを表示します。

イベント統計

[イベント統計] ペインには、選択したイベントの追加情報が表示されます。たとえば、feature_matching_kernel2 を選択すると、カーネルの開始時間、終了時間、持続時間、起動パラメーター、共有メモリ、およびスレッドあたりのレジスタ数が表示されます。

Event Statistics pane showing statistics for feature_matching_kernel2. It executed for 0.06ms and launched with more than 133 thousand threads.

プロファイリングの概要

[プロファイリングの概要] ペインには、GPU と CPU のアクティビティの概要を示す棒グラフが含まれます。棒グラフは、プロファイリング タイムラインのズーム レベルに応じて変化します。次のイメージは、プロファイリングの概要のスニペットを示しています。

Profiling Summary pane showing the results between 1.022ms and 2.961ms. The GPU utilization is 93% and the CPU overhead is 10%.

呼び出しツリー

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

フィルター

このセクションでは、レポートのフィルター処理オプションを提供します。[プロファイリング セッション全体を表示] を選択して、初期化と終了を含むアプリケーション全体のプロファイリング結果を表示します。あるいは、[1 回の実行を表示] を選択して、設計関数の個々の実行からの結果を表示します。

[イベントのフィルター処理] では、以下を指定できます。

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

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

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

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

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

参考

関数

オブジェクト

トピック