27

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

编辑:

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

1>----- 构建开始:项目:CUDASandbox,配置:Debug x64 ------
1>编译...
1>template_gold.cpp
1>链接...
1>LIBCMT.lib(crt0.obj) : 错误 LNK2019: 函数 __tmainCRTStartup 中引用的未解析的外部符号主
1>D:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\x64\Debug\CUDASandbox.exe : 致命错误 LNK1120: 1 unresolved externals
1>构建日志保存在“file://d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\x64\Debug\BuildLog.htm”
1>CUDASandbox - 2 个错误,0 个警告
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
4

4 回答 4

45

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

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


CUDA 工具包 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 运行时库(右键单击项目并选择Properties,然后在Linker -> General添加$(CUDA_PATH)\lib\$(PlatformName)Additional Library Directories并在Linker -> Input添加cudart.libAdditional Dependencies),参见注释 [2] 和 [3]
  • 可选择将 CUDA 包含文件添加到搜索路径,如果您在 .cpp 文件(而不是 .cu 文件)中包含任何 CUDA 文件,则需要(右键单击项目并选择Properties,然后在C/C++ -> General添加附加包含目录$(CUDA_PATH)\include),请参阅注释 [3]
  • 然后只需构建您的项目,.cu 文件将被编译为 .obj 并自动添加到链接中

其他一些提示:

  • 更改代码生成以使用静态加载的 C 运行时以匹配 CUDA 运行时;右键单击项目并选择Properties,然后在C/C++ -> Code Generation中将Runtime Library更改为 /MT (或 /MTd 进行调试,在这种情况下,您需要在Runtime API -> Host -> Runtime中进行镜像库),见注[4]
  • 使用 SDK 中包含的 usertype.dat 文件启用语法高亮,请参阅 readme.txt<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

我还建议使用以下注册表项启用 Intellisense 支持(将 9.0 替换为 8.0 用于 VS2005 而不是 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,而是自己进行检查。Cutil 不受 NVIDIA 支持,它只是用来尝试使 SDK 中的示例专注于实际的程序和算法设计,并避免在每个示例中重复相同的内容(例如命令行解析)。如果您自己编写,那么您将有更好的控制,并且会知道发生了什么。例如,如果函数失败,cutilSafeCall包装器会调用exit()——一个真实的应用程序(而不是一个示例)可能应该更优雅地处理失败!


CUDA 工具包 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添加cudart.libAdditional Dependencies),请参见下面的注释 [2]
  • 可选择将 CUDA 包含文件添加到搜索路径,如果您在 .cpp 文件(而不是 .cu 文件)中包含任何 CUDA 文件,则需要(右键单击项目并选择Properties,然后在C/C++ -> General添加$(CUDA_INC_PATH)附加包含目录
  • 然后只需构建您的项目,.cu 文件将被编译为 .obj 并自动添加到链接中

其他一些提示:

  • 将代码生成更改为使用静态加载的 C 运行时以匹配 CUDA 运行时,右键单击项目并选择Properties,然后在C/C++ -> Code Generation中将Runtime Library更改为 /MT(或 /MTd 进行调试,其中如果您需要在CUDA Build Rule -> Hybrid CUDA/C++ Options中镜像此内容),请参阅注释 [4]
  • 使用 SDK 中包含的 usertype.dat 文件启用语法高亮,请参阅 readme.txt<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

我还建议使用以下注册表项启用 Intellisense 支持(将 9.0 替换为 8.0 用于 VS2005 而不是 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,而是自己进行检查。Cutil 不受 NVIDIA 支持,它只是用来尝试使 SDK 中的示例专注于实际的程序和算法设计,并避免在每个示例中重复相同的内容(例如命令行解析)。如果您自己编写,那么您将有更好的控制,并且会知道发生了什么。例如,如果函数失败,cutilSafeCall包装器会调用exit()——一个真实的应用程序(而不是一个示例)可能应该更优雅地处理失败!


笔记

  1. 您还可以使用特定于 Toolkit 版本的规则,例如NvCudaRuntimeApi.v3.2.rules. 这意味着不是在 %CUDA_PATH% 中查找 CUDA Toolkit,而是在 %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)或标准库函数的多重定义符号有任何错误,那么这应该是您的第一个嫌疑人。
于 2010-01-12T09:31:21.680 回答
4

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

当我需要启动一个新的 CUDA 程序时,我总是从 SDK 目录中复制和修改“模板”示例。这可能不是您正在寻找的内容,因为它不会重新开始,但它一种快速的方法,可以让一个支持 CUDA 的项目在 VS 中使用所有正确的项目/文件名工作......

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

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

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

于 2010-01-12T07:55:15.043 回答
3

您可能想看看本指南: http: //www.programmerfish.com/how-to-run-cuda-on-visual-studio-2008-vs08/

于 2010-08-05T10:24:33.507 回答