注:随着的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()
如果函数失败 - 一个真正的应用程序(而不是一个样品)可能应该处理失败更优雅!
注
- 您还可以使用特定的工具包版本规则福乐如
NvCudaRuntimeApi.v3.2.rules
。这意味着,不是在%CUDA_PATH%中查找CUDA工具包,而是在%CUDA_PATH_V3_2%中查找,这意味着您可以在系统上安装多个版本的CUDA Toolkit,并且不同的项目可以定位不同的版本。另见注[3]。
- 规则文件无法修改C/C++编译和链接器设置,因为它只是为CUDA代码添加编译设置。因此您需要手动执行此步骤。请记住为所有配置做!
- 如果您想稳定在特定的CUDA工具包版本上,那么您应该用CUDA_PATH_V3_2替换CUDA_PATH。另见注释1。
- 具有不匹配的C运行时版本可能会导致各种问题;特别是如果您对LIBCMT有任何错误(例如
LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs
)或为标准库函数多次定义符号,那么这应该是您的第一个嫌疑犯。
来源
2010-01-12 09:31:21
Tom
我评论过我的文章,回复您的编辑。 – Tom 2010-01-13 09:24:03
(夸耀)嘿,我用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