使用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程序可以编译通过,能够正常运行。