How do I start a new CUDA project in Visual Studio 2008?

Mr *_*ell 27 c++ cuda visual-studio

This is an incredibly basic question, but how do I start a new CUDA project in Visual Studio 2008? I have found tons and tons of documentation about CUDA related matters, but nothing about how to start a new project. I am working with Windows 7 x64 Visual Studio 2008 C++. I would really like to find some sort of really really basic Hello World app to just get a basic program compiling and running.

Edit:

I tried your steps Tom. I setup a console app. I then deleted the default .cpp it drops in and copied over the three files from the template project just to have something to compile. When I compile that, template_gold.cpp complained about not having stdafx.h included, so i included that. Now the build fails with this:

1>------ Build started: Project: CUDASandbox, Configuration: Debug x64 ------
1>Compiling...
1>template_gold.cpp
1>Linking...
1>LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
1>D:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\x64\Debug\CUDASandbox.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\x64\Debug\BuildLog.htm"
1>CUDASandbox - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Tom*_*Tom 45

注意随着CUDA Toolkit 3.2版的发布,NVIDIA现在包含带有Toolkit的规则文件而不是SDK.因此,我将这个答案分成两半,使用适用于您的Toolkit版本的正确说明.

注意这些说明适用于Visual Studio 2005和2008.对于Visual Studio 2010,请参阅此答案.


CUDA TOOLKIT 3.2及更高版本

我建议使用NVIDIA提供的NvCudaRuntimeApi.rules文件(或者NvCudaDriverApi.rules如果使用驱动程序API),它随工具包一起发布,并以友好的方式支持最新的编译器标志.就个人而言,我建议不要使用VS向导,但这只是因为我真的不认为你需要它.

规则文件(安装到Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults目录中)"教"Visual Studio如何编译和链接项目中的任何.cu文件到您的应用程序中.

  • 使用标准MS向导创建一个新项目(例如一个空的控制台项目)
  • 在.c或.cpp文件中实现主机(串行)代码
  • 在.cu文件中实现包装器和内核
  • 添加NvCudaRuntimeApi.rules(右键单击项目,自定义构建规则,勾选相关框),请参阅注释1
  • 添加CUDA运行时库(右键单击项目并选择" 属性",然后选择" 链接器" - >"常规"添加$(CUDA_PATH)\lib\$(PlatformName)到" 附加库目录"和" 链接器" - >"输入"添加cudart.lib到" 附加依赖项"),请参阅注释[2]和[3]
  • (可选)将CUDA包含文件添加到搜索路径中,如果在.cpp文件中包含任何CUDA文件(而不是.cu文件),则需要这些文件(右键单击项目并选择" 属性",然后在" C/C++"中 - >"常规"添加$(CUDA_PATH)\include附加包含目录),见说明[3]
  • 然后只需构建您的项目,.cu文件将被编译为.obj并自动添加到链接中

其他一些提示:

  • 更改代码生成以使用静态加载的C运行时来匹配CUDA运行时; 右键单击项目并选择Properties,然后在C/C++中 - >代码生成运行时库更改为/ MT(或/ MTd进行调试,在这种情况下,您需要在运行时API中镜像它- >主机 - >运行时图书馆),见注[4]
  • 使用SDK附带的usertype.dat文件启用语法突出显示,请参阅中的readme.txt <sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

我还建议使用以下注册表项启用Intellisense支持(对于VS2005而不是VS2008,将9.0替换为8.0):

[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"
Run Code Online (Sandbox Code Playgroud)

顺便提一句,如果可能的话,我会提倡避免使用cutil,而是自己检查.NVIDIA不支持Cutil,它仅用于尝试将SDK中的示例集中在实际程序和算法设计上,并避免在每个示例中重复相同的事情(例如命令行解析).如果你自己编写,那么你将拥有更好的控制权并且会知道发生了什么.例如,如果函数失败,cutilSafeCall包装器会调用exit()- 真正的应用程序(而不是样本)应该可以更优雅地处理失败!


CUDA TOOLKIT 3.1及更早版本

我将使用Cuda.rulesNVIDIA提供的文件和SDK,它与工具包一起发布,并以友好的方式支持最新的编译器标志.就个人而言,我建议不要使用VS向导,但这只是因为我真的不认为你需要它.

规则文件(在SDK 的C\common目录中)"教"Visual Studio如何编译和链接项目中的任何.cu文件到您的应用程序中.

  • 使用标准MS向导创建一个新项目(例如一个空的控制台项目)
  • 在.c或.cpp文件中实现主机(串行)代码
  • 在.cu文件中实现包装器和内核
  • 添加Cuda.rules(右键单击项目,自定义构建规则,浏览规则文件并确保勾选)
  • 添加CUDA运行时库(右键单击项目并选择Properties,然后在Linker中 - > General添加$(CUDA_LIB_PATH)Additional Library Directories和在Linker中 - > Input add cudart.libto Additional Dependencies)
  • (可选)将CUDA包含文件添加到搜索路径中,如果在.cpp文件中包含任何CUDA文件(而不是.cu文件),则需要这些文件(右键单击项目并选择" 属性",然后在" C/C++"中 - >"常规"添加$(CUDA_INC_PATH)附加包含目录)
  • 然后只需构建您的项目,.cu文件将被编译为.obj并自动添加到链接中

其他一些提示:

  • 更改代码生成以使用静态加载的C运行时来匹配CUDA运行时,右键单击项目并选择Properties,然后在C/C++中 - >代码生成运行时库更改为/ MT(或/ MTd进行调试,其中你需要在CUDA构建规则 - >混合CUDA/C++选项中镜像这个,参见注释[4]
  • 使用SDK附带的usertype.dat文件启用语法突出显示,请参阅中的readme.txt <sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

我还建议使用以下注册表项启用Intellisense支持(对于VS2005而不是VS2008,将9.0替换为8.0):

[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"
Run Code Online (Sandbox Code Playgroud)

顺便提一句,如果可能的话,我会提倡避免使用cutil,而是自己检查.NVIDIA不支持Cutil,它仅用于尝试将SDK中的示例集中在实际程序和算法设计上,并避免在每个示例中重复相同的事情(例如命令行解析).如果你自己编写,那么你将拥有更好的控制权并且会知道发生了什么.例如,如果函数失败,cutilSafeCall包装器会调用exit()- 真正的应用程序(而不是样本)应该可以更优雅地处理失败!


注意

  1. 您还可以使用特定于Toolkit的版本规则NvCudaRuntimeApi.v3.2.rules.这意味着不是在%CUDA_PATH%中查找CUDA工具包,而是查看%CUDA_PATH_V3_2%,这反过来意味着您可以在系统上安装多个版本的CUDA Toolkit,并且不同的项目可以针对不同的版本.另见注释[3].
  2. 规则文件不能修改C/C++编译和链接器设置,因为它只是添加CUDA代码的编译设置.因此,您需要手动执行此步骤.记得为所有配置做到这一点!
  3. 如果要稳定特定的CUDA Toolkit版本,则应将CUDA_PATH替换为CUDA_PATH_V3_2.另见注1.
  4. 具有不匹配的C运行时版本可能会导致各种问题; 特别是如果您对LIBCMT(例如LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs)或标准库函数的多重定义符号有任何错误,那么这应该是您的第一个嫌疑人.