Tutorial: Debugging with Intel® Distribution for GDB*
The array-transform sample contains a simple kernel, as shown below:
54 h.parallel_for(data_range, [=](id<1> index) { 55 size_t id0 = GetDim(index, 0); 56 int element = in[index]; // breakpoint-here 57 int result = element + 50; 58 if (id0 % 2 == 0) { 59 result = result + 50; // then-branch 60 } else { 61 result = -1; // else-branch 62 } 63 out[index] = result; 64 });
Define a breakpoint at line 56:
break 56
Expected output:
Breakpoint 1 at 0x405800: file /path/to/array-transform.cpp, line 56.
Run the program:
run cpu
When the thread hits the breakpoint, you should see the following output:
Starting program: <path_to_array-transform> cpu [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [New Thread 0x7ffff37dc700 (LWP 21540)] [New Thread 0x7fffdba79700 (LWP 21605)] [New Thread 0x7fffdb678700 (LWP 21606)] [New Thread 0x7fffdb277700 (LWP 21607)] [SYCL] Using device: [Intel® Core™ i7-7567U CPU @ 3.50GHz] from [Intel® OpenCL] [Switching to Thread 0x7fffdb678700 (LWP 21606)] Thread 4 "array-transform" hit Breakpoint 1, main::$_1::operator()<omitted> at array-transform.cpp:56 56 int element = in[index]; // breakpoint-here
Now you can issue the usual Intel® Distribution for GDB* commands to inspect the local variables, print a stack trace, and get information on threads.
Keep debugging and display the value of the index variable:
print index
Expected output:
$1 = cl::sycl::id<1> = {24}
Continue debugging:
continue
You should see the next breakpoint hit event, which comes from another thread.
Continuing. [Switching to Thread 0x7fffdba79700 (LWP 21605)] Thread 3 "array-transform" hit Breakpoint 1, main::$_1::operator()<omitted> at array-transform.cpp:56 56 int element = in[index]; // breakpoint-here
If you print the value of the index variable now, the output will differ from the previous one:
$2 = cl::sycl::id<1> = {32}
To print data elements, use the bracket operator of the accessor:
print in[index]
Expected output:
$3 = 132
You can also print the accessor contents the following ways:
print in
Expected output:
$4 = {<omitted>, MData = 0x7fffffffd3e0}
x /4dw acc_in.MData
Expected output:
0x7fffffffde30: 100 101 102 103where the x command examines the memory contents at the given address and /4dw specifies that the examination output must contain four items in decimal format, word-length each.