2010-01-12 73 views
27

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

编辑:

我试过你的步骤汤姆。我设置了一个控制台程序。然后我删除了默认的.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 ========== 
+0

我评论过我的文章,回复您的编辑。 – Tom 2010-01-13 09:24:03

+0

(夸耀)嘿,我用20行批处理文件构建它们(根本没有触及IDE)! ;)见:http://stackoverflow.com/questions/9518403/smallest-possible-complete-set-of-source-and-batch-files-to-build-a-cuda-app-via/9526602#9526602 – mlvljr 2012-03-02 03:12:11

回答

45

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

这些说明适用于Visual Studio 2005和2008年对Visual Studio 2010中看到this answer。由NVIDIA提供的


CUDA工具包3.2和更高版本

我建议使用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文件),则需要添加CUDA包含文件(右键单击项目并选择属性,然后在C/C++ - >一般$(CUDA_PATH)\include加到另外包括Ë目录),见注[3]
  • 然后,只需建立自己的项目和.CU文件将被编译成.OBJ并添加到链接自动

其他一些提示:

  • 将代码生成更改为使用静态加载的C运行时来匹配CUDA运行时;右键单击该项目并选择属性,然后在C/C++ - >代码生成运行时库改为/ MT(或/ MTD进行调试,在这种情况下,你需要在镜像此运行API - >主机 - >运行时库),见注[4]
  • 启用语法高亮使用usertype.dat文件包含SDK,看到的readme.txt在<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8

我还建议使用以下注册表项来启用Intellisense支持(使用VS2005而不是VS2008将8.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工具包3.1和早期

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

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

  • 使用标准的MS向导(如一个空控制台项目)创建一个新项目
  • 实现你的主机以.c或.cpp文件(串行)代码
  • 在.CU实现你的包装和内核文件
  • 添加Cuda.rules(右键单击该项目,自定义生成规则,浏览规则文件,并确保它被选中)
  • 添加CUDA运行时库(右键单击该项目并选择PROPERT IES,然后在接头 - >普通添加$(CUDA_LIB_PATH)附加库目录链接器 - >输入添加cudart.lib附加依赖​​),参见[2]下面
  • 音符任选地添加CUDA包含文件的搜索路径,需要如果您在您的.cpp文件的任何CUDA文件(而不是.CU文件)(右键单击该项目并选择属性,然后在C/C++ - >常规添加$(CUDA_INC_PATH)附加包含Directorie小号
  • 然后,只需建立自己的项目和.CU文件将被编译成.OBJ和自动

其他一些提示添加到链接:

  • 更改代码生成使用静态加载C运行时相匹配的CUDA运行时,右键单击该项目并选择属性,然后在C/C++ - >代码生成运行时库改为/ MT(或/ MTD FO r调试,在这种情况下,您需要将其镜像到CUDA构建规则 - >混合CUDA/C++选项),请参阅注释[4]
  • 使用SDK随附的usertype.dat文件启用语法高亮显示,请参阅在

我还建议启用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如果可能的话,而不是推出自己的检查。 NVIDIA不支持Cutil,它只是试图让SDK中的示例着重于实际的程序和算法设计,并避免在每个示例中重复相同的事情(例如命令行解析)。如果你自己写,那么你将拥有更好的控制能力,并知道发生了什么。例如,cutilSafeCall包装要求exit()如果函数失败 - 一个真正的应用程序(而不是一个样品)可能应该处理失败更优雅!


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

我试过你的设置,并有一些问题。我编辑了我的原始帖子的细节。 – 2010-01-13 05:03:24

+0

当您创建新的控制台项目时,应该选择创建一个空的项目。看起来你可能已经选择使用预编译头文件,这应该是可能的,但是从一个空项目开始更简单。链接错误说它无法找到* main *,这是在.cpp还是.cu文件中?它似乎还没有构建.cu文件,请检查CUDA构建规则是否已启用(在* Custom Build Rules *对话框中的旁边有一个勾号)。 – Tom 2010-01-13 09:22:40

+0

好的,从一个空的项目开始似乎有所帮助。谢谢。我关于这个问题的观点并不是一个好的长期解决方案。然而,在这一点上,我只想获得我自己的项目编译,所以我使用的是nVidia提供的基本模板代码,它使用了cutil的东西。现在我收到错误:indentifer“cutilBankChecker”未定义 – 2010-01-14 01:30:36

3
  • 安装CUDA VS向导。它将设置VS并将CUDA项目添加到“新项目”菜单。
  • 确保安装了x64编译器(必须在VS安装过程中进行检查)。
  • 检查您是否有x64库,包括nvcc dir并在搜索路径中。
  • 使用CUDA模板创建新项目。
  • 将项目类型更改为x64并将CUDA设置更改为本机(如果您有nv cuda启用的卡)或其他方式进行仿真。
  • 该模板将创建自定义构建规则,该规则使用默认编译器编译带有nvcc和其他文件的.cu文件。
  • 如果VS试图编译.CU用C/C++编译器的文件,单击Solution Explorer中该文件并禁用编辑该文件(在文件的图标红点)

有关安装CUDA其他信息在VS2008的向导可以发现herehere

[编辑]
如果你不想使用你的向导设置CUDA的lib /包括手动/ NVCC路径,并添加自定义生成规则到每一个新的CUDA程序。有关其他信息,请参阅Tom's Answer。

+0

没有CUDA向导,你如何做到这一点? – 2010-01-13 05:05:07

+0

感谢您关于设置路径的注意事项,我已将详细信息添加到我的答案中以获得完整性。 – Tom 2010-01-14 09:57:08

4

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

当我需要启动一个新的CUDA程序时,我总是复制并修改SDK目录中的“模板”示例。这可能不是你正在寻找的东西,因为它并不是最新的,但它是一种快速获得在VS中工作的具有CUDA功能的项目以及所有正确的项目/文件名...

  1. 充分利用“模板”从SDK示例的副本,并重新命名目录 - 目录中的唯一必要内容的源代码和VS的.sln和的.vcproj文件
  2. 重命名.sln和.vcproj文件
  3. 在文本编辑器中打开.sln文件,并将其重命名为项目变量和。vcproj文件名的文件
  4. 在文本编辑器中.vcproj文件的第3行,并重新命名名称RootNamespace变量在文件
  5. 打开与VS项目的前几行,并打开属性页(右键单击在Solution Explorer窗格中的项目名称,选择“属性”)在属性页
  6. 更改输出文件名(在配置属性 - >链接器 - >常规)。 ..在我改变文件名之前,我选择了“All Configurations”配置上拉下来,“64”从Platform下拉,因为我是一个64位系统
  7. 更改的属性页的程序数据库文件名字(在配置属性 - >链接 - >调试)...在更改文件名之前,我选择“调试”“x64”在下拉菜单中。
相关问题