このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 CUDA Toolkit およびドライバー。
コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細については、サードパーティ ハードウェアを参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。
ホストでの 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 生成コードのパフォーマンス ボトルネックを可視化し、特定し、対処するために使用できます。
これらの数値は代表的なものです。実際の値はハードウェア設定によって異なります。この例のプロファイリングは、6 コアの 3.5GHz Intel® Xeon® CPU と NVIDIA TITAN XP GPU を搭載したマシンで Jetson AGX Xavier 開発キットを使用し、MATLAB® R2023b を使用して行われました。
プロファイリング タイムライン
プロファイリング タイムラインには、実行時間がしきい値を上回るすべてのイベントの完全なトレースが表示されます。次のイメージは、しきい値が 0.0 ms に設定されている場合のプロファイリング トレースのスニペットを示しています。
マウス ホイールまたは同等のタッチパッド オプションを使用して、タイムラインのズーム レベルを制御できます。あるいは、パネル上部にあるタイムラインの概要を使用して、ズーム レベルを制御したり、タイムライン プロットを操作したりすることもできます。
各イベントのツールヒントは、CPU と GPU 上での選択されたイベントの開始時間、終了時間、および持続時間を示します。ツールヒントは、CPU でカーネルが起動されてから GPU で実際にカーネルが実行されるまでの経過時間も示します。
各イベントで右クリック コンテキスト メニューを使用して、CPU イベントと対応する GPU イベントの間でトレースを追加します。右クリック メニューを使用して、コード ペイン上のイベントに対応する CUDA 生成コードを表示することもできます。
イベント統計
イベント統計ペインには、選択したイベントの追加情報が表示されます。たとえば、feature_matching_kernel1
は次の統計を示します。
洞察
洞察ペインには、GPU と CPU のアクティビティの概要を示す円グラフが含まれます。円グラフは、プロファイリング タイムラインのズーム レベルに応じて変化します。次のイメージは洞察のスニペットを示しています。タイムラインで選択された領域内で、GPU 使用率がわずか 52% であることを示しています。
呼び出しツリー
このセクションでは、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
GPU メモリ マネージャーを使用すると、GPU 使用率が 76% に増加します。