使用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程序可以編譯通過,能夠正常運行。