Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

生成コードの GPU 実行プロファイリング

この例では、関数 gpucoder.profile を使用して、生成された CUDA® コードの実行プロファイリング レポートを生成する方法を示します。この概念を説明するための例として、霧の修正を使用します。

必要条件

  • Compute Capability 3.2 以上の CUDA 対応 NVIDIA® GPU。

  • NVIDIA CUDA ツールキットおよびドライバー。

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

  • この例のプロファイリング ワークフローは NVIDIA の nvprof ツールに依存します。CUDA ツールキット v10.1 以降では、NVIDIA はパフォーマンス カウンターへのアクセスを管理者ユーザーのみに制限します。GPU パフォーマンス カウンターをすべてのユーザーが使用できるようにするには、https://developer.nvidia.com/nvidia-development-tools-solutions-ERR_NVGPUCTRPERM-permission-issue-performance-counters に記載されている手順を参照してください。

GPU 環境の検証

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

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

コード生成およびプロファイリングの準備

関数 fog_rectification.m は、霧のかかったイメージを入力として受け取り、霧が取り除かれたイメージを返します。CUDA コードを生成するには、ダイナミック ライブラリ ('dll') ビルド タイプを指定して、GPU コード構成オブジェクトを作成します。関数 gpucoder.profile は Embedded Coder 構成オブジェクトのみを受け入れるため、ecoder オプションが明示的に選択されていない場合でも coder.EmbeddedCodeConfig 構成オブジェクトが使用されます。

inputImage = imread('foggyInput.png');
inputs  ={inputImage};
designFileName = 'fog_rectification';

cfg = coder.gpuConfig('dll');
cfg.GpuConfig.MallocMode = 'discrete';

実行プロファイリング レポートの生成

しきい値を 0.003 に指定して gpucoder.profile を実行し、SIL 実行レポートを表示します。0.003 というしきい値は代表的な数値にすぎません。生成コードに多数の CUDA API またはカーネルの呼び出しがある場合、各呼び出しが合計時間のほんの一部しか占めていない可能性は高くなります。意味のあるプロファイリング レポートを生成するには、低いしきい値 (0.001 ~ 0.005) を設定することをお勧めします。実行数の値を非常に低い数値 (5 未満) に設定することは推奨されません。これでは一般的な実行プロファイルが正確に表現されないためです。

gpucoder.profile(designFileName, inputs, 'CodegenConfig', cfg, 'Threshold', 0.003, 'NumCalls', 10);
### Starting SIL execution for 'fog_rectification'
    To terminate execution: <a href="matlab: targets_hyperlink_manager('run',1);">clear fog_rectification_sil</a>
    Execution profiling data is available for viewing. Open <a href="matlab:Simulink.sdi.view;">Simulation Data Inspector.</a>
    Execution profiling report available after termination.
### Stopping SIL execution for 'fog_rectification'

関数 fog_rectification のコード実行プロファイリング レポート

コード実行プロファイリング レポートは、SIL 実行または PIL 実行から収集されたデータに基づくメトリクスを提供します。実行時間の計算は、SIL または PIL テスト ハーネスに追加された計測プローブか、各コンポーネントについて生成されたコードの内部に追加された計測プローブで記録したデータを基に行われます。詳細は、View Execution Times (Embedded Coder) を参照してください。これらの数値は代表的なものです。実際の値はハードウェア設定によって異なります。このプロファイリングは、6 コアの 3.5 GHz Intel® Xeon® CPU および NVIDIA TITAN XP GPU を搭載したマシンで MATLAB R2020a を使用して行われました。

1.まとめ

2.プロファイリングされたコードのセクション

3.fog_rectification の GPU プロファイリング トレース

セクション 3 には、実行時間がしきい値を上回る GPU 呼び出しの完全なトレースが表示されます。'Threshold' パラメーターは、実行に対する最大実行時間の割合として定義されます (初回の実行は除外されます)。たとえば、最上位の関数 fog_rectification の 9 回の呼び出しのうち、3 回目の呼び出しで最大時間 ($t$ms) がかかった場合、最大実行時間は $t$ ms になります。$Threshold*t$ ms よりも長い時間をかけたすべての GPU 呼び出しが、このセクションに表示されます。呼び出しの上にカーソルを置くと、他の適切な、時間計測以外の関連情報に関する実行時の値が呼び出しごとに表示されます。たとえば、fog_rectification_kernel10 の上にカーソルを置くと、その呼び出しに関するブロックの次元、グリッドの次元、およびスタティック共有メモリのサイズ (KiB 単位) が表示されます。このトレースは最大時間がかかった実行に対応しています。

4.fog_rectification の GPU プロファイリングの概要

レポートのセクション 4 には、セクション 3 に表示されている GPU 呼び出しの概要が示されます。cudaFree は、fog_rectification の 1 回の実行あたり 17 回呼び出されており、9 回の fog_rectification の実行に対する 17 回の cudaFree 呼び出しにかかった平均時間は 1.7154 ms です。この概要は、かかった時間の降順で並べ替えられており、最も時間がかかった GPU 呼び出しをユーザーが把握しやすくなっています。