Main Content

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

CUDA MEX 関数のデバッグ

生成された CUDA® MEX 関数は、MATLAB® または CUDA デバッガーを使用してデバッグできます。MATLAB で CUDA MEX 関数をデバッグするには、関数 disp を使用して MEX 関数の変数の内容を調べます。コード生成ではサポートされないため、save を使用して MEX 関数の変数をデバッグすることはできません。コード生成では、save を外部関数として宣言することをサポートしていません。関数 fprintf を使用して、MEX 関数の変数の内容を調べることもできます。

デバッガーを使用した CUDA MEX 関数のデバッグ

この例では、デバッガーを使用して CUDA MEX 関数をデバッグする方法を示します。

  1. 行列 x の各要素を 2 乗し、結果を 1/(i+j) の係数でスケーリングするエントリポイント関数 foo について考えます。ここで、i,j は行と列のインデックスです。

    function [y] = foo(x) %#codegen
    
    y = coder.nullcopy(zeros(size(x)));
    coder.gpu.kernelfun();
    for i = 1:size(x,1)
        for j = 1:size(x,2)
            y(i,j)=(x(i,j)^2)/(i+j);
        end
    end
    end
    
  2. デバッグ シンボルを含む CUDA MEX 関数をビルドするには、MEX 構成オブジェクトのプロパティ EnableDebugging1 に設定します。

    cfg = coder.gpuConfig('mex');
    cfg.EnableDebugging = 1;
    input = rand(32);
    
    codegen -config cfg -args {input} foo
    
    または、次のコマンドを実行して MEX 関数をデバッグすることもできます。

    codegen -g -args {input} foo
    

生成された CUDA MEX (foo_mex) は、Windows® では Visual Studio® CUDA デバッガー、Linux® システムでは CUDA GNU® デバッガー cuda-gdb を使用してデバッグできます。

Microsoft Windows プラットフォームでのデバッグ

この例は、NVIDIA® Nsight Visual Studio Edition の CUDA デバッガーを使用して foo_mex をデバッグするための一般的な手順を示しています。Nsight VSE の使用に関する具体的な情報については、NVIDIA のドキュメントを参照してください。

  1. CUDA MEX 関数を生成した後、Visual Studio を起動します。MATLAB セッションは終了しないでください。

  2. [Debug][Attach to Process] を選択するか、Visual Studio で Ctrl + Alt + p を押して、実行中の MATLAB プロセスにデバッガーを接続します。詳細については、Visual Studio のドキュメントを参照してください。

  3. コードにブレークポイントを設定します。Visual Studio で [Debug][New Breakpoint] を選択します。詳細については、Visual Studio のドキュメントを参照してください。

  4. MATLAB を開き、次のように入力します。

    out = foo_mex(inputs);
    

    Visual Studio CUDA デバッガーで、foo.cu が最初のブレークポイントで開かれます。

  5. [Debug][Continue] を選択すると、コードの実行が完了し、MATLAB で結果を検証できます。

Linux プラットフォームでのデバッグ

CUDA Toolkit インストールの一部として Linux システムで利用可能な CUDA GNU デバッガー cuda-gdb は、ブレークポイントの設定、変数の検査、ソース コードの行ごとのステップ実行などの包括的なソース コード デバッグを用意しています。

この手順では、MATLAB コマンド プロンプト >> を MATLAB コマンドの前に表示しています。また、linux> は Linux プロンプトを表しています。システムによっては異なるプロンプトが表示される場合があります。デバッガーのプロンプトは <cuda-gdb> です。

  1. cuda-gdb でデバッグするには、Linux プロンプトで、関数 matlab-D オプションを使用して cuda-gdb デバッガーを起動します。

    linux> matlab -Dcuda-gdb
    
  2. デバッグのために停止するように cuda-gdb に指示します。

    <cuda-gdb> handle SIGSEGV SIGBUS nostop noprint
    <cuda-gdb> handle SIGUSR1 stop print
    
  3. 起動フラグ -nojvm を使用して、Java® Virtual Machine (JVM™) なしで MATLAB を起動します。

    <cuda-gdb> run -nojvm
    
  4. MATLAB で、関数 dbmex を使用してデバッグを有効にし、バイナリ MEX ファイルを実行します。

    >> dbmex on
    >> out = foo_mex(rand(32));
    
  5. これで、デバッグを開始する準備が整いました。

    通常は、mexFunction でブレークポイントを設定して、ゲートウェイ ルーチンの最初で停止するようにすると便利です。

    <cuda-gdb> break mexFunction
    <cuda-gdb> r
    
  6. ブレークポイントの 1 つに到達すると、デバッガーが提供するコマンドを最大限に活用して、変数の検査、メモリの表示、またはレジスタの検査を行うことができます。

    ブレークポイントから続行するには、次のように入力します。

    <cuda-gdb> continue
    
  7. 最後のブレークポイントで停止した後、次のように入力します。

    <cuda-gdb> continue

    コードの実行が終了し、MATLAB で結果を検証できます。

  8. MATLAB プロンプトから、次のように入力して、デバッガーに制御を戻すことができます。

    >> dbmex stop
    

    あるいは、MATLAB の実行を終了する場合、次のように入力します。

    >> quit
    

    デバッガーが終了したら、次のように入力します。

    <cuda-gdb> quit
    

    Linux プロンプトに戻ります。

CUDA デバッガーの詳細については、NVIDIA のドキュメンテーションを参照してください。

参考

| | | |

関連するトピック