GPU Debugging: Challenges and Opportunities

ID 672523
Updated 6/30/2017
Version Latest
Public

author-image

By

From GPU Debugging: Challenges and Opportunities presented at the International Workshop on OpenCL (IWOCL) 2017.

GPU debugging support matches the OpenCL™ 2.0 GPU/CPU driver package for Linux* (64-bit) from OpenCL™ Drivers and Runtimes for Intel® Architecture with the notable exception of processors based on the Broadwell architecture. 

Basic concepts to keep in mind for GPU debugging

  • There are "host" and "target" components.  Host = where you interact with the debugger, target = where the application is run 
  • There are 3 components: gdbserver, the application to be debugged, and the gdb session.
  • The gdb session and application can be on the same or different machines
  • Breakpoints in the graphics driver can affect screen rendering.  You cannot debug on the same system that is rendering your screen.
  • However, non-graphical connections (such as with SSH) are unaffected. The "host" can be connected to remotely as well for gdb's text interface.

Abbreviations used:

KMD - Kernel Mode Driver

RT = OpenCL Runtime

DCD – Debug Companion Driver

  • Ring-0 driver, provides low-level gfx access
  • Run control flow, breakpoints, etc

DSL – Debug Support Library

  • Ring-3 debugger driver (shared library)
  • Loaded into the gdbserver process

DSL <--> DCD

  • Communicate via IOCTLs

How to set up a debugging session

The simplest option is to use ssh for steps 1,2, and 3.  However, gdb can be run locally as well.  The target steps (1 and 2) should be run remotely because GPU breakpoints can cause rendering hangs.

1. launch gdbserver

/usr/bin/gdbserver-igfx :1234 --attach 123

2. launch the application

export IGFXDBG_OVERRIDE_CLIENT_PID=123
./gemm

Note: there is an automatic breakpoint at the first kernel launch

3. launch GDB

source /opt/intel/opencl-sdk/gt_debugger_2016.0/bin/debuggervars.sh

/opt/intel/opencl-sdk/gt_debugger_2016.0/bin/launch_gdb.sh –tui

In GDB

target remote :1234
continue
x/i $pc

GDB should now be able to step through the kernel code.