Breakpoints
A breakpoint makes your program stop whenever a certain point in the program is reached.
You can set breakpoints with the break
command to specify the place where your program should stop in the kernel. Define breakpoints by line numbers or function names.
- You have several ways to set breakpoints:
break <function>
break <filename>:<linenumber>
break <filename>:<function>
break … if <condition>
- See also:
Consider the followign kernel code. See the source file numba_dpex/examples/debug/simple_sum.py
:
15import dpctl
16import numpy as np
17
18import numba_dpex as dppy
19
20
21@dppy.kernel(debug=True)
22def data_parallel_sum(a, b, c):
23 i = dppy.get_global_id(0)
24 c[i] = a[i] + b[i] # Condition breakpoint location
25
26
27global_size = 10
28N = global_size
29
30a = np.array(np.random.random(N), dtype=np.float32)
31b = np.array(np.random.random(N), dtype=np.float32)
32c = np.ones_like(a)
33
34device = dpctl.SyclDevice("opencl:gpu")
35with dpctl.device_context(device):
36 data_parallel_sum[global_size, dppy.DEFAULT_LOCAL_SIZE](a, b, c)
37
38print("Done...")
break function
The debugger output:
$ NUMBA_OPT=0 gdb-oneapi -q python
(gdb) set breakpoint pending on
(gdb) break data_parallel_sum
(gdb) run simple_sum.py
...
Thread 2.2 hit Breakpoint 1, with SIMD lanes [0-7], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
Thread 2.3 hit Breakpoint 1, with SIMD lanes [0-1], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
...
Done...
break filename:linenumber
The debugger output:
$ NUMBA_OPT=0 gdb-oneapi -q python
(gdb) set breakpoint pending on
(gdb) break simple_sum.py:20
(gdb) run simple_sum.py
...
Thread 2.2 hit Breakpoint 1, with SIMD lanes [0-7], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
Thread 2.3 hit Breakpoint 1, with SIMD lanes [0-1], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
...
Done...
break filename:function
The debugger output:
$ NUMBA_OPT=0 gdb-oneapi -q python
(gdb) set breakpoint pending on
(gdb) break simple_sum.py:data_parallel_sum
(gdb) run simple_sum.py
...
Thread 2.2 hit Breakpoint 1, with SIMD lanes [0-7], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
Thread 2.3 hit Breakpoint 1, with SIMD lanes [0-1], __main__::data_parallel_sum () at simple_sum.py:20
20 @dppy.kernel(debug=True)
(gdb) continue
...
Done...
break … if cond
The debugger output:
$ NUMBA_OPT=0 gdb-oneapi -q python
(gdb) set breakpoint pending on
(gdb) break simple_sum.py:23 if i == 1
(gdb) run simple_sum.py
...
Thread 2.2 hit Breakpoint 1, with SIMD lane 1, __main__::data_parallel_sum () at simple_sum.py:23
23 c[i] = a[i] + b[i]
(gdb) print i
$1 = 1
(gdb) continue
...
Done...
Breakpoints with nested functions
Consider the followign kernel code. See the source file numba_dpex/examples/debug/simple_dppy_func.py
:
15import dpctl
16import numpy as np
17
18import numba_dpex as dppy
19
20
21@dppy.func(debug=True)
22def func_sum(a_in_func, b_in_func):
23 result = a_in_func + b_in_func
24 return result
25
26
27@dppy.kernel(debug=True)
28def kernel_sum(a_in_kernel, b_in_kernel, c_in_kernel):
29 i = dppy.get_global_id(0)
30 c_in_kernel[i] = func_sum(a_in_kernel[i], b_in_kernel[i])
31
32
33global_size = 10
34a = np.arange(global_size, dtype=np.float32)
35b = np.arange(global_size, dtype=np.float32)
36c = np.empty_like(a)
37
38device = dpctl.SyclDevice("opencl:gpu")
39with dpctl.device_context(device):
40 kernel_sum[global_size, dppy.DEFAULT_LOCAL_SIZE](a, b, c)
41
42print("Done...")
The debugger output:
$ NUMBA_OPT=0 gdb-oneapi -q python
(gdb) set breakpoint pending on
(gdb) break simple_dppy_func.py:func_sum
(gdb) run simple_dppy_func.py
...
Thread 2.2 hit Breakpoint 1, with SIMD lanes [0-7], __main__::func_sum () at simple_dppy_func.py:22
22 result = a_in_func + b_in_func
(gdb) continue
Thread 2.3 hit Breakpoint 1, with SIMD lanes [0-1], __main__::func_sum () at simple_dppy_func.py:22
22 result = a_in_func + b_in_func
(gdb) continue
...
Done...