このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
CUDA MEX 関数のデバッグ
生成された CUDA® MEX 関数は、MATLAB® または CUDA デバッガーを使用してデバッグできます。MATLAB で CUDA MEX 関数をデバッグするには、関数 disp
を使用して MEX 関数の変数の内容を調べます。コード生成ではサポートされないため、save
を使用して MEX 関数の変数をデバッグすることはできません。コード生成では、save
を外部関数として宣言することをサポートしていません。関数 fprintf
を使用して、MEX 関数の変数の内容を調べることもできます。
デバッガーを使用した CUDA MEX 関数のデバッグ
この例では、デバッガーを使用して CUDA MEX 関数をデバッグする方法を示します。
行列
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
デバッグ シンボルを含む CUDA MEX 関数をビルドするには、MEX 構成オブジェクトのプロパティ
EnableDebugging
を1
に設定します。または、次のコマンドを実行して MEX 関数をデバッグすることもできます。cfg = coder.gpuConfig('mex'); cfg.EnableDebugging = 1; input = rand(32); codegen -config cfg -args {input} foo
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 のドキュメントを参照してください。
CUDA MEX 関数を生成した後、Visual Studio を起動します。MATLAB セッションは終了しないでください。
[Debug] 、 [Attach to Process] を選択するか、Visual Studio で
Ctrl + Alt + p
を押して、実行中の MATLAB プロセスにデバッガーを接続します。詳細については、Visual Studio のドキュメントを参照してください。コードにブレークポイントを設定します。Visual Studio で [Debug] 、 [New Breakpoint] を選択します。詳細については、Visual Studio のドキュメントを参照してください。
MATLAB を開き、次のように入力します。
out = foo_mex(input);
Visual Studio CUDA デバッガーで、
foo.cu
が最初のブレークポイントで開かれます。[Debug] 、 [Continue] を選択すると、コードの実行が完了し、MATLAB で結果を検証できます。
Linux プラットフォームでのデバッグ
CUDA Toolkit インストールの一部として Linux システムで利用可能な CUDA GNU デバッガー cuda-gdb
は、ブレークポイントの設定、変数の検査、ソース コードの行ごとのステップ実行などの包括的なソース コード デバッグを用意しています。
この手順では、MATLAB コマンド プロンプト >>
を MATLAB コマンドの前に表示しています。また、linux>
は Linux プロンプトを表しています。システムによっては異なるプロンプトが表示される場合があります。デバッガーのプロンプトは <cuda-gdb>
です。
cuda-gdb
でデバッグするには、Linux プロンプトで、関数matlab
の-D
オプションを使用してcuda-gdb
デバッガーを起動します。linux> matlab -Dcuda-gdb
デバッグのために停止するように
cuda-gdb
に指示します。<cuda-gdb> handle SIGSEGV SIGBUS nostop noprint <cuda-gdb> handle SIGUSR1 stop print
起動フラグ
-nojvm
を使用して、Java® 仮想マシン (JVM™) なしで MATLAB を起動します。<cuda-gdb> run -nojvm
MATLAB で、関数
dbmex
を使用してデバッグを有効にし、バイナリ MEX ファイルを実行します。>> dbmex on >> out = foo_mex(rand(32));
これで、デバッグを開始する準備が整いました。
通常は、
mexFunction
でブレークポイントを設定して、ゲートウェイ ルーチンの最初で停止するようにすると便利です。<cuda-gdb> break mexFunction <cuda-gdb> r
ブレークポイントの 1 つに到達すると、デバッガーが提供するコマンドを最大限に活用して、変数の検査、メモリの表示、またはレジスタの検査を行うことができます。
ブレークポイントから続行するには、次のように入力します。
<cuda-gdb> continue
最後のブレークポイントで停止した後、次のように入力します。
<cuda-gdb> continue
コードの実行が終了し、MATLAB で結果を検証できます。
MATLAB プロンプトから、次のように入力して、デバッガーに制御を戻すことができます。
>> dbmex stop
あるいは、MATLAB の実行を終了する場合、次のように入力します。
>> quit
デバッガーが終了したら、次のように入力します。
<cuda-gdb> quit
Linux プロンプトに戻ります。
CUDA デバッガーの詳細については、NVIDIA のドキュメンテーションを参照してください。
参考
dbmex
| codegen
| coder.gpuConfig
| coder.gpu.kernelfun
| gpucoder