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

Posted

技术标签:

【中文标题】如何在 Visual Studio 2008 中启动新的 CUDA 项目?【英文标题】:How do I start a new CUDA project in Visual Studio 2008? 【发布时间】:2011-01-04 00:16:11 【问题描述】:

这是一个非常基本的问题,但是如何在 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 跳过 ==========

【问题讨论】:

我对我的帖子发表了评论,并对您的编辑做出了回应。 (吹嘘)嘿,我正在用一个 20 行的批处理文件构建它们(根本没有接触 IDE)! ;) 见:***.com/questions/9518403/… 【参考方案1】:

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

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


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 添加到Additional Include Directories),参见注释[3] 然后只需构建您的项目,.cu 文件将被编译为 .obj 并自动添加到链接中

其他一些提示:

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

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


CUDA 工具包 3.1 及更早版本

我会使用 NVIDIA 提供的 Cuda.rules 文件和 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.lib 添加到 Additional Dependencies),请参阅下面的注释 [2] 可选地将 CUDA 包含文件添加到搜索路径中,如果您在 .cpp 文件(而不是 .cu 文件)中包含任何 CUDA 文件,则需要(右键单击项目并选择 Properties ,然后在 C/C++ -> General 中将 $(CUDA_INC_PATH) 添加到 Additional Include Directories) 然后只需构建您的项目,.cu 文件将被编译为 .obj 并自动添加到链接中

其他一些提示:

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

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


注意

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

【讨论】:

我尝试了您的设置,但遇到了一些问题。我用详细信息编辑了我的原始帖子。 新建控制台项目时,应选择创建空项目。看起来您可能选择了使用预编译的头文件,这应该是可能的,但从一个空项目开始更简单。链接错误说它找不到 main,这是在 .cpp 还是 .cu 文件中? .cu 文件似乎也没有被构建,检查 CUDA 构建规则是否已启用(在 自定义构建规则 对话框中旁边有一个勾号)。 好的,从一个空项目开始似乎有帮助。谢谢你。我同意你的观点,即 cutil 不是一个好的长期解决方案。但是此时我只想编译我自己的项目,所以我使用 nVidia 随 sdk 提供的基本模板代码,它使用了 cutil 的东西。现在我收到错误:indentifer "cutilBankChecker" is undefined 很多cutil功能是通过在线函数或宏提供的,但有些是由静态库cutil32D.lib提供的(或64位,或没有D为发布模式)。确保您已经构建了 cutil 并正在与 lib 链接。或者,抛弃 cutil! Tom:感谢您提供了非常丰富的回复!您能否指出 NvCudaRuntimeApi.rules 和 Cuda.rules 之间的区别以及为什么首选前者?【参考方案2】:

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

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

    从 SDK 复制“template”示例,并重命名目录 -- 目录中唯一的必要内容是源代码和 VS .sln和 .vcproj 文件 重命名 .sln 和 .vcproj 文件 在文本编辑器中打开 .sln 文件,并在文件的第 3 行重命名 Project 变量和 .vcproj 文件名 在文本编辑器中打开 .vcproj 文件,并在文件的前几行重命名 NameRootNamespace 变量 用VS打开项目,打开属性页(在解决方案资源管理器窗格中右键项目名称,选择“属性”) 更改属性页中的输出文件名称(在配置属性 -> 链接器 -> 常规下)...在更改文件名之前,我选择 “所有配置” em> 来自配置下拉菜单,"x64" 来自平台下拉菜单,因为我使用的是 64 位系统 更改属性页中的程序数据库文件名称(在配置属性 -> 链接器 -> 调试下)...在更改文件名之前,我选择 “调试” em> 和 "x64" 在下拉菜单中。

【讨论】:

【参考方案3】: 安装 CUDA VS 向导。它将设置 VS 并将 CUDA 项目添加到“新项目”菜单。 确保已安装 x64 编译器(必须在 VS 安装期间检查)。 检查您是否有 x64 库、包含、nvcc 目录和搜索路径。 使用 CUDA 模板创建新项目。 将项目类型更改为 x64,将 CUDA 设置更改为 Native(如果您有支持 nv cuda 的卡)或模拟。 模板将创建自定义构建规则,使用 nvcc 编译 .cu 文件,使用默认编译器编译其他文件。 如果 vs 尝试使用 C/C++ 编译器编译 .cu 文件,请在解决方案资源管理器中单击该文件并禁用该文件的编译(文件图标上的红点)

关于在 VS2008 上安装 CUDA 向导的更多信息可以在 here 和 here 找到

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

【讨论】:

没有 CUDA 向导你怎么做? 感谢您对设置路径的说明,为了完整起见,我已将详细信息添加到我的答案中。【参考方案4】:

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

【讨论】:

以上是关于如何在 Visual Studio 2008 中启动新的 CUDA 项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点

visual studio 2008如何引用dll

如何在visual studio2008中创建,编译和运行C++程序,

如何在 Visual Studio 2008 中自动删除尾随空格?

Visual Studio 2008 / C#:如何在项目中查找死代码?

如何在 Visual Studio 2008 中折叠选定的代码块?