The Intel® Debugger for Heterogeneous Compute is a tool to debug parts of the code that gets executed on an Intel® integrated GPU applications remotely. The debugger runs on a host system and a debug agent (gdbserver-igfx) runs on the target system.
There are two options:
Required Hardware:
Two systems are required for debugging code running on the GPU. The main reason for this requirement is that video output from the GPU could be interrupted during debugging, which would make an IDE integrated debugger impossible to use on a single system.
The currently support target CPUs are Intel 4th, 5th and 6th Generation Core processors with integrated graphics. The detailed target system setup is detailed below.
The host system can be any stable, relatively recent Linux distribution with no special requirements to host hardware. For this description the host system is assumed to be CentOS 7, but other systems work as well.
Both systems should be able to communicate freely with each other over TCP/IP networking, ideally within the same sub-net and a Domain Name Server.
In addition, it is required to have the ability to elevate privileges using "sudo" or "su" commands for the purpose of installation of required packages.
For other prerequisites, new debugger features, hardware and software requirements, and known issues refer to the release notes .
Required Software Packages:
This target setup description uses CentOS* 7 as the base installation. Currently only 64-bit versions are supported.
Target:
sudo yum -y install epel-release sudo yum -y update sudo yum -y group install "Development Tools" sudo yum -y install pciutils redhat-lsb nfs-utils mesa-dri-drivers rpm-build redhat-rpm-config \ asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto audit-libs-devel binutils-devel elfutils-devel \ elfutils-libelf-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel net-tools \ cmake ncurses-devel wget dkms sudo usermod -a -G video $USER sudo reboot
Target:
mkdir shared sudo mkdir -p /export/shared sudo chown $USER.$USER /export/shared sudo sh -c 'echo "/export *(rw,fsid=0,insecure,no_subtree_check,async)" >>/etc/exports' sudo sh -c 'echo "/export/shared *(rw,nohide,insecure,no_subtree_check,async)" >>/etc/exports' sudo sh -c 'echo `pwd`/shared /export/shared none rw,bind 0 0 >>/etc/fstab' sudo mount -a sudo firewall-cmd --permanent --add-port=2049/tcpsudo systemctl enable rpcbind sudo systemctl enable nfs-server sudo systemctl enable nfs-lock sudo systemctl enable nfs-idmap sudo systemctl restart rpcbind sudo systemctl restart nfs-server sudo systemctl restart nfs-lock sudo systemctl restart nfs-idmap
Host:cd ~ mkdir shared sudo mount -t nfs4 igfx-target:/shared ~/shared
Host:
mkdir -p ~/shared/drivers cd ~/shared/drivers cp <driver-file-location>/intel-linux-media_<distribution>.<version-number>_64bit.tar.gz ./
If the latest packages installed on the target system have higher version numbers than the files provided with the driver package, edit the file install_sdk_UMD_CentOS.sh by adding --oldpackage to the parameters for rpm. So the line should read rpm -Uvh --oldpackage \.There can be a similar problem with the kernel rpm that gets created by the build_kernel_rpm_CentOS.sh script, if a newer kernel version already exists on the target system. In that case install the kernel rpm packages on the target using:
Target:
sudo rpm -i --oldpackage rpmbuild/RPMS/x86_64/kernel-3.10.0-229.1.2.47109.MSSr6.el7.centos.x86_64.rpm rpmbuild/RPMS/x86_64/kernel-devel-3.10.0-229.1.2.47109.MSSr6.el7.centos.x86_64.rpm
Target:
sudo firewall-cmd --permanent --add-port=10000/tcp sudo firewall-cmd --permanent --add-port=61000-61100/tcp sudo firewall-cmd --permanent --add-port=10001/tcp
Host:
cp /opt/intel/debugger_2018/gdb/targets/idhc/install/*.rpm ~/shared
Target:
cd ~/shared sudo rpm -i gdbserver-igfx-7.6.1-1.x86_64.rpm libelfdwarf-1.0-1.x86_64.rpm libigfxdbg-1.0-1.x86_64.rpm gdbserver-ia-7.6.1-1.x86_64.rpm igfxdcd-dkms-1.0-1.x86_64.rpm sudo dkms add -m igfxdcd -v 1.0 sudo dkms build -m igfxdcd -v 1.0 sudo dkms install -m igfxdcd -v 1.0 sudo modprobe igfxdcd
Assumed for this setup is a standard installation of CentOS* 7.1 as a desktop system with development tools installed.
Host:
cd ~ tar xfz eclipse-cpp-mars-1-linux-gtk-x86_64.tar.gz
Host:
cd ~ mkdir shared sudo mount -t nfs4 igfx-target:/shared ~/shared
Host:
mkdir -p ~/shared/lib cd ~/shared/lib cp /opt/intel/compilers_and_libraries/linux/lib/intel64/* .
The next step is to start Eclipse*.
cd ~/shared source /opt/intel/bin/compilervars.sh intel64 ~/eclipse/eclipse
At startup enter the workspace path that points into the shared directory: /home/$USER/shared/workspace.
You now need to add a C++ source file and a Makefile for the project.
/* Copyright 2016 Intel Corporation. All Rights Reserved. * The source code contained or described herein and all * documents related to the source code ("Material") are owned by * Intel Corporation or its suppliers or licensors. Title to the * Material remains with Intel Corporation or its suppliers and * licensors. The Material is protected by worldwide copyright * laws and treaty provisions. No part of the Material may be * used, copied, reproduced, modified, published, uploaded, * posted, transmitted, distributed, or disclosed in any way * except as expressly provided in the license provided with the * Materials. No license under any patent, copyright, trade * secret or other intellectual property right is granted to or * conferred upon you by disclosure or delivery of the Materials, * either expressly, by implication, inducement, estoppel or * otherwise, except as expressly provided in the license * provided with the Materials. */ #include <stdio.h> void matmult() { // Sample data int a[3][2] = { { 1, 2 },{ 3, 4 },{ 5, 6 } }; int b[2][3] = { { 6, 5, 4 },{ 3, 2, 1 } }; int c[3][3] = { { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 } }; // Offloaded code #pragma offload target(gfx) pin(a) pin(b) pin(c) _Cilk_for(int i = 0; i < 3; i++) { _Cilk_for(int j = 0; j < 3; j++) { for (int k = 0; k < 2; k++) { c[i][j] += a[i][k] * b[k][j]; } } } // CPU code for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%2d ", c[i][j]); } printf("\n"); } } int main(int argc, char *argv[]) { matmult(); return 0; }
all: matmult.cpp icpc -gdwarf-3 -qoffload-arch=haswell:visa3.1 -O0 matmult.cpp
The next step is to create a debug configuration.
Change the default launcher by clicking
Select other....
The host system is now ready for debugging. Do not click the Debug button yet, since debugging need to be started on the target system.
The final step in the system setup is to start debugging on the target system. Since the project files are already shared, there is no need to transfer any files.
The debugger server can be started, which launches the target program.
Target:
# Set up compiler runtime, if necessary export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user/shared/lib gdbserver-ia :10000 ~/shared/workspace/matmult/a.out
Now switch back to the host system and click Debug. The debugging session should start and execution will stop just inside the main() function.
At this point debugging should work as usual. To stop in any code on the GPU, insert a breakpoint inside the code for the GPU and continue the application, this means, the line containing the matrix multiplication's inner loop body:
c[i][j] += a[i][k] * b[k][j];
Once the host application starts offloading code, the GPU threads are automatically added to the debugging session and inserted breakpoints get triggered as the execution comes across them.
CentOS* 7 has a firewall enabled by default. If there is any problem with connections between the debugger and the debug server (from host to target) ensure the ports are opened in the firewall. Alternatively, disable the firewall.
Document | Description |
---|---|
GDB Manual | Contains descriptions of the GNU* Debugger (GDB) functions and interfaces including Intel-extended features for the Intel® Debugger for Heterogeneous Compute |
GDB Manual in Info format | To read the GDB Manual in the Info format, use the following command: info gdb-igfx |
GDB man pages | To access the GDB man pages, set the environment variables by sourcing the compiler environment script, compilervars.sh, and use the following command: man gdb-igfx |
Intel® Parallel Studio XE 2018 Composer Edition C++ - Debug Solutions Release Notes |
Contains the most up-to-date information about the product, including:
|
Intel® Parallel Studio XE product page | Intel® Parallel Studio XE product page. See this page for support and online documentation. |
No license (express or implied, by estoppel or otherwise) to any intellectual property rights is granted by this document. Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade. This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice. Contact your Intel representative to obtain the latest forecast, schedule, specifications and roadmaps. The products and services described may contain defects or errors known as errata which may cause deviations from published specifications. Current characterized errata are available on request.
Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and/or other countries.
*Other names and brands may be claimed as the property of others.
© Intel Corporation