cuda|在Visual Studio中使用CUDA和Thrust

http://cuda.it168.com/a2011/0622/1208/000001208129_all.shtml
【IT168 专稿】我正在建立一些新的CUDA原型项目,旨在弄清楚如何最好地使用CUDA 4.0,我把它写成一个快速教程,教你如何使用Visual Studio 2010中的CUDA和最新的C++0x特性编写一个简单的应用程序。
因为目前CUDA SDK要求项目使用v90工具集(Visual Studio 2008)编译,解决方案需要两个项目,一个包括CUDA目标v90的DLL项目,一个目标v100(Visual Studio 2010)包含C++代码的项目。
安装依赖
确保你安装了以下依赖软件包
● Visual Studio 2010和2008 SP1(CUDA需要)
● Parallel NSight 1.51
● CUDA 4.0 RC或3.2,以及Thrust
本文引用的例子全部使用的是CUDA 4.0 RC,如果你没有安装CUDA 4.0,它们也可以在3.2环境下工作。
设置解决方案
【cuda|在Visual Studio中使用CUDA和Thrust】创建一个包含两个项目的解决方案,需要两个项目是因为一个目标是v100(Visual Studio 2010)编译器,允许使用最新的C++0x语言功能,另一个目标是v90(Visual Studio 2008)编译器,因为CUDA需要它。
1)创建一个Win32控制台应用程序,取名HelloWorld,在向导的所有设置窗口全部保留默认设置,这个项目将包含应用程序的主入口点和所有Windows特定代码,如管理线程要用到的并行模式库(Parallel Patterns Library,PPL)。

▲图 1 创建一个Win32控制台应用程序
2)创建第二个Win32项目,取名HelloWorldCuda,这个DLL将包含你的CUDA代码,在应用程序设置窗口,应用程序类型选择DLL,并选中空白项目复选框。

▲图 2 创建一个Win32项目

▲图 3 在附加选项中,选中“空白项目”

配置CUDA项目
在HelloWorldCuda项目有很多设置需要配置。
3)配置HelloWorldCuda项目
3.1)选择“项目”*“生成自定义”菜单选项,在对话框中选择CUDA 4.0项目,这一步会添加对CUDA C/C++文件的支持,但在项目属性的生成设置窗口显示之前,还需要一个.cu规则文件,如果你没有CUDA 4.0,那么请使用3.2规则。

▲图 4 在生成自定义对话框中选择CUDA 4.0
3.2)添加两个新文件到项目中,一个名为Hello.cpp的C++文件(.cpp)和一个名为Hello.h的头文件(.h),将.cpp文件重命名为Hello.cu,你的解决方案树形结构看起来应该像下图这样:

▲图 5 解决方案树形结构
3.3)选择Hello.cu文件,打开它的属性窗口,在“常规”选项卡中,将“项目类型”修改为“CUDA C/C++”。

▲图 6 将项目类型设为CUDA C/C++
3.4)选择项目,打开属性窗口(Alt+回车),在“常规”选项卡,将“平台工具集”字段设为“v90”,如果你不能这样设置,可能是因为没有安装Visual Studio 2008的缘故,再次提醒,CUDA需要它。

▲图 7 设置平台工具集
3.5)打开“链接程序”*“常规”属性窗口,在“附加库目录”字段添加“$(CUDA_PATH_V4_0)\lib\$(Platform); ”。

▲图 8 设置附加库目录
现在应该可以看到CUDA C/C++属性选项卡了。
3.6)打开“链接程序”*“输入”属性窗口,在“附加依赖”字段添加“cudart.lib; ”。

▲图 9 设置附加依赖
3.7)确保你的项目总是按正确的顺序生成,在HelloWorld项目上点击右键,选择“项目依赖”,选中旁边的HelloWorldCuda复选框,这样会强制HelloWorldCuda项目在HelloWorld之前生成。
4)至此,生成解决方案应该没有任何警告或错误了。

添加一些CUDA/Thrust代码
现在是时候添加一些代码了,我们需要在HelloWorldCuda DLL中增加一些CUDA代码,并输出它,以便HelloWorld应用程序可以执行它。
5)配置HelloWorld项目,它需要链接HelloWorldCuda,也要能够访问与之对应的头文件。
5.1)打开“链接程序”*“常规”属性窗口,在“附加库目录”字段增加“..\$(Configuration); $(CUDA_PATH_V4_0)\lib\$(Platform); ”。

▲图 10 设置附加库目录
5.2)打开“链接程序”*“输入”属性窗口,在“附加依赖”字段增加“cudart.lib; HelloWorldCuda.lib; ”。

▲图 11 设置附加依赖
5.3)打开“C/C++”*“常规”属性窗口,在“附加包含目录”字段增加“..\HelloWorldCuda\; $(CUDA_PATH_V4_0)\Include; ”。

▲图 12 设置附加包含目录
5.4)单击“项目”*“项目依赖”菜单选项,选中HelloWorldCuda复选框,让CUDA项目成为Win32主应用程序项目的依赖。

▲图 13 让HelloWorldCuda成为HelloWorld项目的依赖
6)现在是时候写一点代码了。CUDA 4.0引入了Thrust,因此我计划在给出的例子中使用Thrust,如果你没有使用4.0,那你需要下载最新的Thrust库,将其拷贝到CUDA SDK包括文件“%CUDA_PATH%\include\thrust”下。
我们所举的例子是一个Hello World应用程序,因此代码非常简单,它是Thrust项目主页上第一个示例的变种。
添加下面的类声明到Hello.h文件中,大多数代码修复了编译警告,需要做的是声明一个使用host_vector构造的类,然后有一些方法执行CUDA代码并返回结果。

    推荐阅读