运行环境:Ubuntu 16.04
NVIDIA GeForce 960
CUDA 8.0
在学习《CUDA高性能并行计算》第二、三章的过程中,编写了 dist_v1_cuda 和 dist_v2_cuda 两个程序。按照书上的运行步骤,在源文件的目录下运行
make
cuda-gdb main.exe
run
执行命令run以后,终端报错
All CUDA devices are used for display and cannot be used while debugging. (error code = CUDBG_ERROR_ALL_DEVICES_WATCHDOGGED(0x18)
本文的解决方法依据Stack Overflow上的回答给出:All CUDA devices are used for display: Can not debug my CUDA-code from within desktop environment
解决方法1:
因为本人所用的计算机只有一块独立显卡,且显卡被X-server占用(即All CUDA devices are used for display),所以显卡无法被用于程序的调试。X-server是Linux里面图形接口服务器的简称。所以最“简单”的解决方案应该是再多装一块显卡(doge)。
解决方法2:
依据上述链接中的第一条回答
在运行
cuda-gdb main.exe
这句命令之前,运行以下命令
export CUDA_DEBUGGER_SOFTWARE_PREEMPTION=1
对环境变量进行修改,这样可以使得程序正常运行及退出,但终端不会显示任何调试信息
根据上述链接中给出的问题描述
Somehow it seems that my X-Server is blocking my NVIDIA GPU because if I switch to another virtual console (CTRL+ALT+F1) I am able to run my code using cuda-gdb.
在Ubuntu图形界面下,按下Ctrl+Alt+F1,进入虚拟控制台,解除Linux系统对GPU的占用。在虚拟控制台下对CUDA程序进行调试,可以正常输出调试结果。
解决方法4(推荐):
使用Qt编译和运行程序,针对dist_v1_cuda,本人所使用的CMakeLists如下
cmake_minimum_required(VERSION 2.8)
project(dist_v1_cuda)
FIND_PACKAGE(CUDA REQUIRED)
cuda_add_executable(${PROJECT_NAME} "kernel.cu")
针对书中的flashlight程序(使用OpenGL进行显示),本人所使用的CMakeLists如下
cmake_minimum_required(VERSION 2.8)
project(dist_v2_cuda)
find_package(CUDA REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(GLEW REQUIRED)
include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS})
file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp *.cuh)
file(GLOB CURRENT_SOURCES *.cpp *.cu)
source_group("Include" FILES ${CURRENT_HEADERS})
source_group("Source" FILES ${CURRENT_SOURCES})
cuda_add_executable(dist_v2_cuda ${CURRENT_HEADERS} ${CURRENT_SOURCES})
target_link_libraries(dist_v2_cuda ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${GLEW_LIBRARY} )