Debug CUDA MEX Functions
You can debug your generated CUDA® MEX function using MATLAB® or a CUDA debugger. To debug your CUDA MEX functions in MATLAB, use the disp
function to inspect the contents of
your MEX function variables. You cannot use save
to debug MEX
function variables because code generation does not support it. Code generation does not
support declaration of save
as extrinsic. You can also use the
fprintf
function to inspect the contents of your MEX function
variables.
Debug CUDA MEX Functions by Using a Debugger
This example shows how to debug CUDA MEX functions using a debugger.
Consider an entry-point function
foo
that squares each element of a matrixx
and scales the result by a factor of1/(i+j)
, wherei,j
are the row and column indexes.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
To build a CUDA MEX function with debugging symbols included, set the MEX configuration object property
EnableDebugging
to1
.Alternatively, you can debug your MEX function by executing this command:cfg = coder.gpuConfig('mex'); cfg.EnableDebugging = 1; input = rand(32); codegen -config cfg -args {input} foo
codegen -g -args {input} foo
You can debug the generated CUDA MEX (foo_mex
) by using the Visual Studio®
CUDA debugger on Windows® or the CUDA
GNU® debugger cuda-gdb
on Linux® systems.
Debug on Microsoft Windows Platforms
This example shows the general steps to debug foo_mex
by using
the NVIDIA® Nsight Visual Studio Edition CUDA Debugger. For specific information about using Nsight VSE, refer to
NVIDIA documentation.
After generating the CUDA MEX function, start Visual Studio. Do not exit your MATLAB session.
Attach the debugger to the running MATLAB process by selecting Debug > Attach to Process or press
Ctrl + Alt + p
in Visual Studio. For more information, refer to your Visual Studio documentation.Set breakpoints in code. Select Debug > New Breakpoint in Visual Studio. For more information, refer to your Visual Studio documentation.
Open MATLAB and type:
out = foo_mex(input);
foo.cu
is opened in the Visual Studio CUDA debugger at the first breakpoint.If you select Debug > Continue, code execution completes and the results can be verified in MATLAB.
Debug on Linux Platforms
The CUDA
GNU Debugger cuda-gdb
, available for Linux systems as part of the CUDA Toolkit installation, provides complete source code debugging,
including the ability to set breakpoints, examine variables, and step through the
source code line-by-line.
In this procedure, the MATLAB command prompt >>
is shown in front of
MATLAB commands, and linux>
represents a Linux prompt; your system might show a different prompt. The debugger prompt
is <cuda-gdb>
.
To debug with
cuda-gdb
, at the Linux prompt, start thecuda-gdb
debugger using thematlab
function-D
option.linux> matlab -Dcuda-gdb
Tell
cuda-gdb
to stop for debugging.<cuda-gdb> handle SIGSEGV SIGBUS nostop noprint <cuda-gdb> handle SIGUSR1 stop print
Start MATLAB without the Java® Virtual Machine (JVM®) by using the
-nojvm
startup flag.<cuda-gdb> run -nojvm
In MATLAB, enable debugging with the
dbmex
function and run your binary MEX file.>> dbmex on >> out = foo_mex(rand(32));
You are ready to start debugging.
It is often convenient to set a breakpoint at
mexFunction
so you stop at the beginning of the gateway routine.<cuda-gdb> break mexFunction <cuda-gdb> r
Once you hit one of your breakpoints, you can make full use of any commands the debugger provides to examine variables, display memory, or inspect registers.
To proceed from a breakpoint, type:
<cuda-gdb> continue
After stopping at the last breakpoint, type:
<cuda-gdb> continue
Code execution finishes and the results can be verified on MATLAB.
From the MATLAB prompt you can return control to the debugger by typing:
>> dbmex stop
Or, if you are finished running MATLAB, type:
>> quit
When you are finished with the debugger, type:
<cuda-gdb> quit
You return to the Linux prompt.
For more information on CUDA debugger, refer to NVIDIA documentation.
See Also
dbmex
| codegen
| coder.gpuConfig
| coder.gpu.kernelfun
| gpucoder