使用 VS2013 编译 CUDA 程序时,可能会遇到以下问题:
1 、 error MSB3721: "D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/bin/nvcc.exe" -gencode=arch=compute_52,code=/"sm_52,compute_52/" --use-local-env --cl-version 2013 -ccbin "D:/Program Files/Microsoft Visual Studio 12.0/VC/bin/x86_amd64" -I"D:/Program Files/NVIDIA Corporation/CUDA Samples/v7.0/common/inc" -I"D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/include" -I"D:/Program Files/NVIDIA Corporation/CUDA Samples/v7.0/common/inc" -I"D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/include" -G --keep-dir x64/Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN32 -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o x64/Debug/kernel.cu.obj "C:/Users/MaoHeng_Lab/documents/visual studio 2013/Projects/CudaTest/CudaTest/kernel.cu"” 已退出,返回代码为 2 。
出现该问题的主要原因是:程序中有语法错误,只要修改掉所有的语法错误,就可以成功编译。
2 、 error MSB3721: "D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/bin/nvcc.exe" -gencode=arch=compute_52,code=/"sm_52,compute_52/" --use-local-env --cl-version 2013 -ccbin "D:/Program Files/Microsoft Visual Studio 12.0/VC/bin/x86_amd64" -I"D:/Program Files/NVIDIA Corporation/CUDA Samples/v7.0/common/inc" -I"D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/include" -I"D:/Program Files/NVIDIA Corporation/CUDA Samples/v7.0/common/inc" -I"D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0/include" -G --keep-dir x64/Debug -maxrregcount=0 --machine 64 --compile -cudart static -g -DWIN32 -DWIN32 -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o x64/Debug/kernel.cu.obj "C:/Users/MaoHeng_Lab/documents/visual studio 2013/Projects/CudaTest/CudaTest/kernel.cu"” 已退出,返回代码为 4 。
对于这个问题我之前调试了很长时间,因为我程序中使用到了 CUDA Sample 提供的 OpenGL ,结果编译时总是出现关于 GL.h , GLU.h 中出现错误,其中 GL.h , GLU.h 是 Windows 系统 SDK 自带文件。可能原因有:
( 1 ) VS 是否 include 这些文件;
( 2 )检查是否因为 x86 , x64 的编译环境不同引起的;
( 3 )很可能因为 CUDA 自带的 OpenGL 与系统中的 GL.h , GLU.h 的版本不匹配;
( 4 ) VS 中 CUDA 配置是否合理( VS 中属性页面中的配置)
( 1 )、( 2 )很好核查,对于( 3 )可能需要下载 OpenGL 的库再测试。下载 GLUT(https://www.opengl.org/resources/libraries/) ,之后再下载 GLEW(http://glew.sourceforge.net/) 。最后问题问题是在 VS 中 CUDA 配置存在问题。以下是修改之后的配置:
其中, IncludePath 是 VS 自定义的变量,几乎包含了系统中所有的头文件。一般可直接按照 VS 自定义的值。
CUDA_PATH_V7_0 是自定义环境变量,指向 D:/Program Files/NVIDIA GPU Computing/Toolkit/CUDA/v7.0 ,即安装完 CUDA 后 ToolKit 的目录。 NVCUDASAMPLES7_0_ROOT 为 D:/Program Files/NVIDIA Corporation/CUDA Samples/v7.0 ,即安装完 CUDA 后 Samples 的目录。
最关键的是设置 CUDA C++ ,在这里设置 include 和 lib 。
一定要注意要这是合适的 Code Generation ,我的显卡是 GTX970 ,支持 CUDA5.2 ,所以在这里我设为 compute_52,sm_52 。如果支持 2.0 ,则可设置为 compute_20,sm_20 。当然也可以设置多个,中间使用分号 (;) 分隔。
在链接处设置 lib 所在目录,其中看到的 CudaToolkitLibDir 是 CUDA 安装完 VS 工具包后自定义的,可以点该选项,弹出编辑,选择宏可以查看,如下所示:
之后写入 lib :
如果选择静态使用 cuda 运行时库,填写 cudart_static.lib ,否则选择动态使用 cuda 运行时库,填写 cudart.lib 。因为使用了 OpenGL ,则需要 OpenGL 的库: freeglut.lib , glew64.lib 。
之后, cuda 程序可以编译通过,能够正常运行。