繁体   English   中英

如何在Visual Studio 2008中启动新的CUDA项目?

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

这是一个非常基本的问题,但如何在Visual Studio 2008中启动新的CUDA项目? 我已经找到了大量关于CUDA相关问题的文档,但没有关于如何开始新项目的文档。 我正在使用Windows 7 x64 Visual Studio 2008 C ++。 我真的想找到一些真正非常基本的Hello World应用程序来获得基本程序的编译和运行。

编辑:

我尝试了你的步骤汤姆。 我设置了一个控制台应用。 然后我删除了默认的.cpp,它从模板项目中删除并复制了三个文件,只是为了编译。 当我编译它时,template_gold.cpp抱怨没有包含stdafx.h,所以我把它包括在内。 现在构建失败了:

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 ==========

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

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


CUDA TOOLKIT 3.2及更高版本

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

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

  • 使用标准MS向导创建一个新项目(例如一个空的控制台项目)
  • 在.c或.cpp文件中实现主机(串行)代码
  • 在.cu文件中实现包装器和内核
  • 添加NvCudaRuntimeApi.rules (右键单击项目, 自定义构建规则 ,勾选相关框),参见注释1
  • 添加CUDA运行时库(右键单击项目并选择Properties ,然后选择Linker - > General add $(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文件启用语法突出显示,请参阅<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"

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


CUDA TOOLKIT 3.1及更早版本

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

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

  • 使用标准MS向导创建一个新项目(例如一个空的控制台项目)
  • 在.c或.cpp文件中实现主机(串行)代码
  • 在.cu文件中实现包装器和内核
  • 添加Cuda.rules (右键单击项目, 自定义构建规则 ,浏览规则文件并确保勾选)
  • 添加CUDA运行时库(右键单击项目并选择Properties ,然后选择Linker - > General add $(CUDA_LIB_PATH)Additional Library DirectoriesLinker - > Input add cudart.libAdditional Dependencies ),参见注释[ 2]下面
  • (可选)将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文件启用语法突出显示,请参阅<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"

顺便提一句,如果可能的话,我会提倡避免使用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 )或多个定义的符号用于标准库函数,那么这应该是你的第一个嫌疑人。

真是个好问题! 对于那里的所有CUDA文档,我一直认为这是一个明显的遗漏...事实上,我很高兴我找到了这篇文章,因为在使用CUDA很长一段时间后,我仍然没有找到了一个正式的, 正确的方法让VS从头开始制作CUDA程序。

当我需要启动一个新的CUDA程序时,我总是只复制并修改SDK目录中的“ 模板 ”示例。 这可能不是你想要的,因为它没有重新开始,但它一个快速的方法来获得一个支持CUDA的项目在VS中使用所有正确的项目/文件名...

  1. 从SDK中复制“ 模板 ”示例,并重命名目录 - 目录中唯一必需的内容是源代码和VS .sln和.vcproj文件
  2. 重命名.sln和.vcproj文件
  3. 在文本编辑器中打开.sln文件,并在文件的第3行重命名Project变量和.vcproj文件名
  4. 在文本编辑器中打开.vcproj文件,并在文件的前几行重命名NameRootNamespace变量
  5. 使用VS打开项目,然后打开属性页(右键单击解决方案资源管理器窗格中的项目名称,选择“属性”)
  6. 更改属性页中的输出文件名(在配置属性 - >链接器 - >常规下)...在更改文件名之前,我从配置下拉选择“所有配置” ,从平台拉出“x64” -因为我在64位系统上
  7. 更改属性页中的程序数据库文件名(在配置属性 - >链接器 - >调试下)...在更改文件名之前,我在下拉列表中选择“Debug”“x64”
  • 安装CUDA VS向导。 它将设置VS并将CUDA项目添加到“新项目”菜单中。
  • 确保安装了x64编译器(必须在VS安装期间进行检查)。
  • 检查您是否有x64库,包括,nvcc目录和搜索路径。
  • 使用CUDA模板创建新项目。
  • 将项目类型更改为x64,将CUDA设置更改为Native(如果您具有nv cuda-enabled卡)或其他模拟。
  • 该模板将创建自定义构建规则,使用nvcc和其他具有默认编译器的文件来编译.cu文件。
  • if,vs正在尝试使用C / C ++编译器编译.cu文件,在解决方案资源管理器中单击该文件并禁用该文件的编译(文件图标上的红点)

有关在VS2008上安装CUDA向导的其他信息,请访问 此处此处

[编辑]
如果您不想使用向导,则必须手动设置CUDA lib / include / nvcc路径,并为每个新的CUDA程序添加自定义构建规则。 有关其他信息,请参阅Tom's Answer。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM