我使用cmake gui工具在vs2013中配置我的cuda项目。 CMakeLists.txt如下:
project(CUDA_PART)
# required cmake version
cmake_minimum_required(VERSION 3.0)
include_directories(${CUDA_PART_SOURCE_DIR}/common)
# packages
find_package(CUDA REQUIRED)
# nvcc flags
set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
set(CUDA_VERBOSE_BUILD ON)
#FILE(GLOB SOURCES "*.cu" "*.cpp" "*.c" "*.h")
CUDA_ADD_EXECUTABLE(CUDA_PART hist_gpu_shmem_atomics.cu)
.cu文件来自 Cuda示例源代码hist_gpu_shmem_atomics.cu
有两个问题:
在histo_kernel <<<blocks * 2, 256 >>>(dev_buffer, SIZE, dev_histo);
行之后发生“无效的设备功能”错误。
当我使用CUDA调试工具进行调试时,它无法在设备代码中触发断点。
但是当我在visual studio 2013中使用cuda项目寺创建一个具有相同代码的项目时。它工作正常!
那么,CMakeLists.txt中有什么问题吗?
操作系统:Win7 64位; GPU :GTX960; CUDA :CUDA 7.5; VS :2013(和也是2010)
CUDA_NVCC_FLAGES结果为-gencode=arch=compute_20,code=\"sm_20,compute_20\"
它等于:
-gencode=arch=compute_20,code=sm_20 \
-gencode=arch=compute_20,code=compute_20
所以,我猜它会生成2个版本的机器代码:第一个(SASS)具有虚拟和真实架构,第二个(PTX)只有虚拟架构。由于我的GTX960是cc5.2设备,它选择第二个(PTX)并将其转换为合适的SASS。
答案 0 :(得分:1)
这是一个问题:
set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
这些标志将导致nvcc为cc 2.0设备(仅限)生成SASS代码(仅限)。这样的cc2.0 SASS代码不能在cc5.2设备(GTX960)上运行。 &#34;设备功能无效&#34;正是在这种情况下尝试启动内核时会出现的错误。由于内核永远不会启动,因此尝试在设备代码中点击断点将无法正常工作。
我不是CMake专家,所以可能有其他更明智的方法,但尝试解决此问题的一种可能方法可能是:
set(CUDA_NVCC_FLAGS -gencode arch=compute_52,code=sm_52;-G;-g)
应为您的cc5.2设备生成代码。毫无疑问,这里有其他可能的设置,您可能需要阅读this或nvcc manual以获取有关针对特定设备的编译选项的更多背景信息。
另请注意-G
生成设备调试代码,如果这是您想要的,这很好。但是,它通常比没有该开关编译的代码运行得慢。但是,如果要进行调试,则必须进行该切换。