このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 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 アドレスまたはホスト名が誤っていることです。
既定では、異なるターゲットに対して複数の 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 生成コードのパフォーマンス ボトルネックを可視化し、特定し、対処するために使用できます。
これらの数値は代表的なものです。実際の値はハードウェア設定によって異なります。この例のプロファイリングは、12 コアの 3.6GHz Intel® Xeon® CPU と NVIDIA TITAN XP GPU を搭載したマシンで Jetson AGX Xavier 開発キットを使用し、MATLAB® R2024b を使用して行われました。
プロファイリング タイムライン
プロファイリング タイムラインには、実行時間がしきい値を上回るすべてのイベントの完全なトレースが表示されます。次のイメージは、しきい値が 0.0 ms に設定されている場合のプロファイリング トレースのスニペットを示しています。
マウス ホイールまたは同等のタッチパッド オプションを使用して、タイムラインのズーム レベルを制御できます。あるいは、パネル上部にあるタイムラインの概要を使用して、ズーム レベルを制御したり、タイムライン プロットを操作したりすることもできます。
各イベントのツールヒントは、CPU と GPU 上での選択されたイベントの開始時間、終了時間、および持続時間を示します。ツールヒントは、CPU でカーネルが起動されてから GPU で実際にカーネルが実行されるまでの経過時間も示します。
各イベントで右クリック コンテキスト メニューを使用して、CPU イベントと対応する GPU イベントの間でトレースを追加します。右クリック メニューを使用して、コード ペイン上のイベントに対応する CUDA 生成コードを表示することもできます。
イベント統計
[イベント統計] ペインには、選択したイベントの追加情報が表示されます。たとえば、feature_matching_kernel1
を選択すると、カーネルの開始時間、終了時間、持続時間、起動パラメーター、共有メモリ、およびスレッドあたりのレジスタ数が表示されます。
プロファイリングの概要
[プロファイリングの概要] ペインには、GPU と CPU のアクティビティの概要を示す棒グラフが含まれます。棒グラフは、プロファイリング タイムラインのズーム レベルに応じて変化します。次のイメージは、プロファイリングの概要のスニペットを示しています。タイムラインで選択された領域内で、GPU 使用率が 75% であることを示しています。
呼び出しツリー
このセクションでは、CPU から呼び出される GPU イベントを一覧表示します。呼び出しツリーの各イベントには、呼び出し元関数の実行時間が割合として一覧表示されます。このメトリクスは、生成されたコードのパフォーマンス ボトルネックを特定するのに役立ちます。呼び出しツリーで対応するイベントをクリックして、プロファイリング タイムラインの特定のイベントに移動することもできます。
フィルター
このセクションでは、レポートのフィルター処理オプションを提供します。[プロファイリング セッション全体を表示] を選択して、初期化と終了を含むアプリケーション全体のプロファイリング結果を表示します。あるいは、[1 回の実行を表示] を選択して、設計関数の個々の実行からの結果を表示します。
[イベントのフィルター処理] では、以下を指定できます。
イベントしきい値 — 指定されたしきい値より短いイベントをスキップします。
メモリの割り当て/解放 — GPU デバイスのメモリ割り当てと割り当て解除に関連するイベントを CPU アクティビティ バーに表示します。
メモリ転送 — ホストからデバイス、およびデバイスからホストへのメモリ転送を表示します。
カーネル — CPU カーネルの起動と GPU カーネルのアクティビティを表示します。
他のイベント — 同期や GPU の待機など、その他の GPU 関連イベントを表示します。