Main Content

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

gpuPerformanceAnalyzer

生成コードのパフォーマンス分析および最適化

R2023a 以降

    説明

    gpuPerformanceAnalyzer(fcn, fcn_inputs) は、MATLAB® エントリポイント関数 fcn 用の GPU コードを生成し、コード実行のプロファイリング プロットとレポートを通じてパフォーマンスを分析します。fcn_inputs は、コード生成および実行プロファイリングの際に使用される fcn に対するサンプル値から成る cell 配列です。

    メモ

    プロファイリング ワークフローは、NVIDIA® のプロファイリング ツールに依存します。CUDA® Toolkit v10.1 以降では、NVIDIA はパフォーマンス カウンターへのアクセスを管理者ユーザーに制限します。GPU パフォーマンス カウンターをすべてのユーザー アカウントで有効にするには、Permission issue with Performance Counters (NVIDIA) の手順を参照してください。

    メモ

    NVIDIA からのプロファイリング ツールは、Kepler ファミリ デバイスなどのレガシ GPU ハードウェアをサポートしていない場合があります。サポートされている GPU デバイスについては、NVIDIA のドキュメンテーションを参照してください。

    gpuPerformanceAnalyzer(___,Name=Value) は GPU コードを生成し、1 つ以上の Name=Value ペアの引数で指定されたオプションを使用し、コード実行のプロファイリング プロットとレポートを通じてパフォーマンスを解析します。

    すべて折りたたむ

    この例では、gpuPerformanceAnalyzer を使用して、マンデルブロ アルゴリズム用に生成された CUDA コードのパフォーマンスを解析する方法を示します。

    マンデルブロ集合とは、下記の方程式で定義された軌跡が k→∞ のときに有限の範囲内にとどまる値 z0 で構成された複素平面の領域です。

    zk+1=zk2+z0,k=0,1,

    マンデルブロ集合の全体的な幾何形状を図に示しています。この図には、集合の境界の外側周辺における詳しい構造を十分に示すための解像度がありません。拡大率を上げていくと、マンデルブロ集合の詳細な境界が示され、そこでは徐々に細かくなりながら細部が繰り返されていることがわかります。

    Geometry of the Mandelbrot set

    この例では、メインのカージオイドとその左側にある p/q 球状部との谷間にある、マンデルブロ集合の大きく拡大された部分を指定する一連の範囲を選択します。これらの 2 つの範囲間に、実数部 (x) と虚数部 (y) の 1000 x 1000 のグリッドを作成します。次に、マンデルブロ アルゴリズムを各グリッド位置で反復します。500 回の反復回数で、完全な解像度のイメージがレンダリングされます。

    maxIterations = 500;
    gridSize = 1000;
    xlim = [-0.748766713922161,-0.748766707771757];
    ylim = [0.123640844894862,0.123640851045266];
    
    x = linspace( xlim(1), xlim(2), gridSize );
    y = linspace( ylim(1), ylim(2), gridSize );
    [xGrid,yGrid] = meshgrid( x, y );
    

    エントリポイント関数 mandelbrot_count.m には、マンデルブロ集合のベクトル化済みの実装が含まれています。

    function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen
    
    z0 = xGrid + 1i*yGrid;
    count = ones(size(z0));
    
    % Map computation to GPU.
    coder.gpu.kernelfun;
    
    z = z0;
    for n = 0:maxIterations
        z = z.*z + z0;
        inside = abs(z)<=2;
        count = count + inside;
    end
    count = log(count);
    

    mandelbrot_count の CUDA コードを生成し、そのパフォーマンスを分析するには、関数 gpuPerformanceAnalyzer を使用します。

    cfg = coder.gpuConfig('dll');
    cfg.GpuConfig.CompilerFlags = '--fmad=false';
    cfg.GpuConfig.EnableMemoryManager = true;
    
    gpuPerformanceAnalyzer('mandelbrot_count', ...
    {maxIterations,xGrid,yGrid},Config=cfg, ...
    NumIterations=2,OutFolder="PerfTest");
    
    ### Starting GPU code generation
    Code generation successful: View report
    
    ### GPU code generation finished
    ### Starting SIL execution for 'mandelbrot_count'
        To terminate execution: clear mandelbrot_count_sil
    ### Stopping SIL execution for 'mandelbrot_count'
    ### Starting profiling data processing
    ### Profiling data processing finished
    ### Showing profiling data
    

    プロファイリング データを収集した後、gpuPerformanceAnalyzer は GPU パフォーマンス アナライザー レポート ウィンドウを起動します。

    GPU performance analyzer report for Mandelbrot set

    入力引数

    すべて折りたたむ

    現在の作業フォルダーまたはパス上に存在する関数として指定します。MATLAB ファイルが 7 ビット ASCII 以外の文字 (日本語の文字など) を含むパス上にある場合、gpuPerformanceAnalyzer コマンドはファイルを検出できない可能性があります。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)});

    上記の MATLAB 関数の入力のサイズ、クラス、および実数/複素数を定義する値の例。cell 配列内での入力の位置は、MATLAB 関数定義内での入力引数の位置に対応していなければなりません。あるいは、値の例の代わりに、coder.Type オブジェクトを指定できます。coder.Type オブジェクトを作成するには、coder.typeof を使用します。

    関数で定義されているよりも少ない入力引数で関数を生成するには、不要な引数の例の値を省略します。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)});

    名前と値の引数

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)}, Config=cfg, NumIterations=2, OutFolder="PerfTest");

    コード生成中に使用されるエントリポイント関数入力のプロパティ (サイズ、クラス、および実数/複素数) を指定します。この値が空の場合、コード ジェネレーターは fcn_inputs からの入力プロパティを解釈します。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)}, InputTypes=coder.typeof(ones(5,100)));

    コード生成パラメーターを含む構成オブジェクトを指定します。構成オブジェクトは、GPU スタンドアロン ライブラリまたは実行可能ファイル生成用の coder.EmbeddedCodeConfig オブジェクトでなければなりません。

    既定では、gpuPerformanceAnalyzer はダイナミック リンク ライブラリ (dll) 用の GPU コード生成構成オブジェクトを使用します。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)}, Config=coder.gpuconfig('dll'));

    生成コードを実行する回数を指定します。名前と値のペア 'NumIterations' の値は、1 以上の正の整数でなければなりません。

    既定では、GPU パフォーマンス アナライザー ウィンドウの [ビュー モード][エントリポイント関数] に設定されており、[プロファイリング タイムライン] には生成コードの最後の実行のみが表示されます。すべての反復を表示するには、[ビュー モード][全適用] に設定します。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)},NumIterations=2);

    生成ファイルを、名前と値のペアの引数 'Outfolder' で指定された絶対パスまたは相対パスに格納します。'Outfolder' の値には次を含めないでください。

    • スペース。特定のオペレーティング システム構成では、スペースがコード生成の失敗につながる可能性があるためです。

    • 7 ビット ASCII 以外の文字 (日本語など)。

    名前と値のペアの引数 'Outfolder' で指定されたフォルダーが存在しない場合は、gpuPerformanceAnalyzer によって作成されます。

    フォルダーの場所を指定しない場合、gpuPerformanceAnalyzer は既定のフォルダーにファイルを生成します。

    codegen/target/fcn_name

    次を target とすることができます。

    • exe (CUDA 実行可能ファイル)

    • lib (CUDA ライブラリ)

    • dll (CUDA ダイナミック ライブラリ)

    fcn_name は、MATLAB 関数の名前です。

    この関数は、フォルダー名に次の文字を含めることをサポートしていません。アスタリスク (*)、疑問符 (?)、ドル ($)、およびポンド (#)。

    メモ

    gpuPerformanceAnalyzer は、同じコードに対して同じタイプの出力を生成するたびに、以前のビルドからファイルを削除します。以前のビルドのファイルを保持する場合は、別のビルドを開始する前に、それらを別の場所にコピーします。

    例: gpuPerformanceAnalyzer('foo.m', {rand(5,10)}, OutFolder="PerfTest");

    バージョン履歴

    R2023a で導入