如何在Visual Studio 2008中启动一个新的CUDA项目?
这是一个令人难以置信的基本问题,但是如何在Visual Studio 2008中启动一个新的CUDA项目? 我已经发现了大量有关CUDA相关事宜的文档,但没有提到如何开始一个新的项目。 我正在使用Windows 7 x64 Visual Studio 2008 C ++。 我真的很想find一些真正基本的Hello World应用程序来获得一个基本的程序编译和运行。
编辑:
我尝试了你的步骤汤姆。 我设置了一个控制台应用 然后,我删除了默认的.cpp文件,并将其复制到模板项目的三个文件中,以便编译。 当我编译,template_gold.cpp抱怨没有包含stdafx.h,所以我包括了。 现在构build失败,这个:
1> ------开始构build:项目:CUDASandbox,configuration:debuggingx64 ------ 1>正在编译... 1> template_gold.cpp 1>链接... 1> LIBCMT.lib(crt0.obj):错误LNK2019:在函数__tmainCRTStartup中引用的未parsing的外部符号main 1> D:\ Stuff \ Programming \ Visual Studio 2008 \ Projects \ CUDASandbox \ x64 \ Debug \ CUDASandbox.exe:致命错误LNK1120:1个未parsing的外部 1>生成日志保存在“file:// d:\ Stuff \ Programming \ Visual Studio 2008 \ Projects \ CUDASandbox \ CUDASandbox \ x64 \ Debug \ BuildLog.htm” 1> CUDASandbox - 2个错误,0个警告(s) ==========构build:0成功,1失败,0最新,0跳过==========
注释随着CUDA Toolkit 3.2版本的发布,NVIDIA现在将规则文件与工具包(而不是SDK)一起包含在内。 因此,我将这个答案分成两部分,为您的工具包版本使用正确的说明。
注意这些说明适用于Visual Studio 2005和2008.对于Visual Studio 2010,请参阅此答案 。
CUDA TOOLKIT 3.2及更高版本
我build议使用NVIDIA提供的NvCudaRuntimeApi.rules
文件(或者NvCudaDriverApi.rules
如果使用驱动程序API的话),这个文件和工具包一起发布,并以友好的方式支持最新的编译器标志。 我个人build议不要使用VS向导,但只是因为我真的不认为你需要它。
规则文件(安装到Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults
目录中)“教导”Visual Studio如何编译和链接项目中的任何.cu文件到您的应用程序中。
- 使用标准MS向导创build一个新项目(例如,一个空的控制台项目)
- 在.c或.cpp文件中实现您的主机(串行)代码
- 在.cu文件中实现你的包装和内核
- 添加
NvCudaRuntimeApi.rules
(右键单击项目, 自定义构build规则 ,勾选相关框),请参阅注释1 - 添加CUDA运行时库(右键单击项目并select属性 ,然后在链接器 – >常规添加
$(CUDA_PATH)\lib\$(PlatformName)
到其他库目录和链接器 – >input添加cudart.lib
到额外的依赖关系 ),见注释[2]和[3] - (可选)将CUDA包含文件添加到searchpath,如果在.cpp文件中包含任何CUDA文件(与.cu文件相对),则需要添加CUDA包含文件(右键单击项目并select“ 属性” ,然后在“ C / C ++ – >常规”
$(CUDA_PATH)\include
到其他包含目录中 ),请参阅注释[3] - 然后build立你的项目和.cu文件将被编译为.obj并自动添加到链接
其他一些提示:
- 将代码生成更改为使用静态加载的C运行时来匹配CUDA运行时; 右键单击项目并select属性 ,然后在C / C ++ – >代码生成中将运行时库更改为/ MT(或/ MTd进行debugging,在这种情况下,您需要在运行时API中将此镜像– >主机 – >运行时图书馆 ),见注[4]
- 使用随SDK提供的usertype.dat文件启用语法突出显示,请参阅
<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8
我还build议使用以下registry项来启用Intellisense支持(用VS2005代替9.0,代替VS2008):
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++] "NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"
顺便提一句,我会主张尽可能避免cutil ,而不是自己的检查。 NVIDIA并不支持Cutil,它只是用来保持SDK中的例子集中在实际的程序和algorithmdevise上,并避免在每个例子中重复相同的事情(例如命令行parsing)。 如果你自己写,那么你将会有更好的控制,并知道发生了什么。 例如,如果函数失败, cutilSafeCall
包装调用exit()
– 真正的应用程序(而不是示例)应该可以更优雅地处理失败!
CUDA TOOLKIT 3.1及更早版本
我将使用NVIDIA提供的SDK的Cuda.rules
文件,这是与工具包一起发布的,并以友好的方式支持最新的编译器标志。 我个人build议不要使用VS向导,但只是因为我真的不认为你需要它。
规则文件(在SDK的C \ common目录中)“教”Visual Studio如何编译和链接项目中的任何.cu文件到应用程序中。
- 使用标准MS向导创build一个新项目(例如,一个空的控制台项目)
- 在.c或.cpp文件中实现您的主机(串行)代码
- 在.cu文件中实现你的包装和内核
- 添加
Cuda.rules
(右键单击该项目,“ 自定义构build规则” ,浏览规则文件并确保其被勾选) - 添加CUDA运行时库(右键单击项目并select属性 ,然后在链接器 – >常规添加
$(CUDA_LIB_PATH)
到其他库目录和链接器 – >input添加cudart.lib
到其他依赖项 ),请参阅注释[ 2] - (可选)将CUDA包含文件添加到searchpath,如果在.cpp文件中包含任何CUDA文件(与.cu文件相对),则需要添加CUDA包含文件(右键单击项目并select“ 属性” ,然后在“ C / C ++ – >常规”
$(CUDA_INC_PATH)
到其他包含目录 ) - 然后build立你的项目和.cu文件将被编译为.obj并自动添加到链接
其他一些提示:
- 将代码生成更改为使用静态加载的C运行时匹配CUDA运行时,右键单击项目并select属性 ,然后在C / C ++ – >代码生成中将运行时库更改为/ MT(或/ MTd进行debugging,其中如果您需要在CUDA构build规则 – >混合CUDA / C ++选项 )中进行镜像,请参阅注释[4]
- 使用SDK附带的usertype.dat文件启用语法突出显示,请参阅
<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8
我还build议使用以下registry项来启用Intellisense支持(用VS2005代替9.0,代替VS2008):
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++] "NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"
顺便提一句,我会主张尽可能避免cutil ,而不是自己的检查。 NVIDIA并不支持Cutil,它只是用来保持SDK中的例子集中在实际的程序和algorithmdevise上,并避免在每个例子中重复相同的事情(例如命令行parsing)。 如果你自己写,那么你将会有更好的控制,并知道发生了什么。 例如,如果函数失败, cutilSafeCall
包装调用exit()
– 真正的应用程序(而不是示例)应该可以更优雅地处理失败!
注意
- 您也可以使用工具包版本特定的规则,例如
NvCudaRuntimeApi.v3.2.rules
。 这意味着,不是在%CUDA_PATH%中查找CUDA工具包,而是在%CUDA_PATH_V3_2%中查找,这意味着您可以在系统上安装多个版本的CUDA工具包,并且不同的项目可以以不同的版本为目标。 另见注释[3]。 - 规则文件不能修改C / C ++编译和链接器设置,因为它只是为CUDA代码添加编译设置。 因此您需要手动执行此步骤。 请记住为所有configuration做!
- 如果要稳定在特定的CUDA工具包版本上,则应该用CUDA_PATH_V3_2replaceCUDA_PATH。 另见注1 。
- 具有不匹配的C运行时版本可能会导致各种问题; 特别是如果你有关于LIBCMT的任何错误(例如,
LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs
)或者为标准库函数增加定义的符号,那么这应该是你的第一个嫌疑犯。
真是个好问题! 对于那里的所有CUDA文档,这是我一直认为的一个明显的遗漏……事实上,我真的很高兴我find了这篇文章,因为在使用CUDA很长一段时间之后,find一个正式的, 正确的方式让VS从头开始生成一个CUDA程序。
当我需要启动一个新的CUDA程序时,我总是复制并修改SDK目录中的“ 模板 ”示例。 这可能不是你正在寻找的东西,因为它不是新鲜的,但它是一个快速的方法来获得一个CUDA的项目在VS工作与所有正确的项目/文件名称…
- 从SDK中复制“ 模板 ”示例,并重命名目录 – 目录中唯一必需的内容是源代码和VS .sln和.vcproj文件
- 重命名.sln和.vcproj文件
- 在文本编辑器中打开.sln文件,并在文件的第三行中重命名Projectvariables和.vcproj文件名
- 在文本编辑器中打开.vcproj文件,并在文件的前几行重命名Name和RootNamespacevariables
- 用VS打开项目,打开属性页面(右键单击解决scheme资源pipe理器窗格中的项目名称,select“属性”)
- 更改属性页面中的输出文件名(在configuration属性 – >链接器 – >常规下)…在更改文件名之前,我从configuration下拉菜单中select“所有configuration” ,从平台下拉菜单中select“x64”因为我在64位系统上
- 更改属性页中的程序数据库文件名(在configuration属性 – >连接器 – >debugging下)…在更改文件名之前,我在下拉列表中select“Debug”和“x64” 。
- 安装CUDA VS向导。 它将设置VS并添加CUDA项目到“新项目”菜单。
- 确保安装了x64编译器(必须在VS安装过程中进行检查)。
- 检查你是否有x64库,包括nvcc目录,并在searchpath。
- 使用CUDA模板创build新项目。
- 将项目types更改为x64,将CUDA设置更改为Native(如果您有nv cuda启用的卡),否则将进行仿真。
- 该模板将创build自定义构build规则,使用默认编译器编译带有nvcc和其他文件的.cu文件。
- 如果vs正在尝试使用C / C ++编译器编译.cu文件,请在解决scheme资源pipe理器中单击该文件,并禁用该文件的编译(文件图标上的红点)
有关在VS2008上安装CUDA向导的其他信息可以在这里和这里find
[编辑]
如果您不想使用向导,则必须手动设置CUDA lib / include / nvccpath,并为每个新的CUDA程序添加自定义构build规则。 有关更多信息,请参阅Tom's Answer。
你可能想看看这个指南: http : //www.programmerfish.com/how-to-run-cuda-on-visual-studio-2008-vs08/