According to the OpenCL™ standard, work items are executed concurrently. If a work group contains more than one work item, the debugger stops on a breakpoint in every running work item.
When a kernel is compiled with a -g
option, the compiler
generates three implicit variables that define the current work item by
mapping to global ID within NDRange . Each variable corresponds with one
dimension in the three-dimensional NDRange:
__ocl_dbg_gid0
__ocl_dbg_gid1
__ocl_dbg_gid2
You can use these variables to set conditional breakpoints on a specific work item (or work items).
To set conditional breakpoints, use the native GDB* or LLDB* commands for conditional breakpoints.
Consider the following example of using conditional breakpoints with
the __ocl_dbg_gid0
variable:
(gdb) break kernel.cl:3 if (__ocl_dbg_gid0 == 2)
y
) when you see the following message,
because at this moment, a kernel code does not exist, and it will
be generated only after you run an application:
Make breakpoint pending on future shared library load? (y or [n]) y
Expected output for this example:
Breakpoint 3 (kernel.cl:3 if (__ocl_dbg_gid0 == 2)) pending.
(gdb) run
If the application successfully stopped on the breakpoint, you will see the following message with a status of the application and a line where the breakpoint was placed:
[Switching to Thread 0x7fffcffff700 (LWP 26115)] Thread 20 "host_program" hit Breakpoint 1, main_kernel (buf_in=0x1834280 "", buf_out=0x186c880 "") at kernel.cl:3 3 size_t workdim = get_work_dim();
__ocl_dbg_gid0
variable to identify
a global ID for a specified NDRange dimension. To print the global
ID, use the following command:
(gdb) print __ocl_dbg_gid0
Expected output for this example:
$0 = 2