使用cmake为vs2013配置cuda项目并获得“无效的设备功能”错误

时间:2015-10-14 13:11:55

标签: c++ visual-studio-2010 visual-studio-2013 cuda cmake

我使用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

有两个问题:

  1. histo_kernel <<<blocks * 2, 256 >>>(dev_buffer, SIZE, dev_histo);行之后发生“无效的设备功能”错误。

  2. 当我使用CUDA调试工具进行调试时,它无法在设备代码中触发断点。

  3. 但是当我在visual studio 2013中使用cuda项目寺创建一个具有相同代码的项目时。它工作正常!

    那么,CMakeLists.txt中有什么问题吗?

    操作系统:Win7 64位; GPU :GTX960; CUDA :CUDA 7.5; VS :2013(和也是2010)

    当我使用时在vs2013中设置“代码生成”如下: the properties of a project use cuda project temple

    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。

1 个答案:

答案 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设备生成代码。毫无疑问,这里有其他可能的设置,您可能需要阅读thisnvcc manual以获取有关针对特定设备的编译选项的更多背景信息。

另请注意-G生成设备调试代码,如果这是您想要的,这很好。但是,它通常比没有该开关编译的代码运行得慢。但是,如果要进行调试,则必须进行该切换。