第一种方法
VS2010下配置CUDA 4.0
Posted on06月 14, 2011byxuanmanstein
cuda4.0 正式发布了,一直没时间弄。之前一直在vs2008下用cuda wizard。现在实验室配了GTX580,需要把之前在笔记本GT540M上跑的程序再跑一遍,体验下性能的飙升,正好学学把4.0和VS2010配好。
汇总网上几篇帖子,总结一下。只实验win7 x64 下 编release x64的程序。
编译cutil64。默认装好的SDK下没编译cutil64.dll。需要自己编 一下,但是工程都是现成的:C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common,有2005 2008 2010各种版本的sln 直接cutil_vs2010.sln,双击编译,注意是release x64版的,如果最后执行程序是还是提示不到cutil64.dll,注意把它放到个能到的路径下。
改path变量。
“工具-》选项-》文本编辑器”改扩展名
新建个项目。项目属性->自定义生成,选4.0

改cuda_conv.vcxproj。
到:
<ImportGroup Label=”ExtensionSettings”>
</ImportGroup>
替换成
<ImportGroup Label=”ExtensionSettings”>
<Import Project=”$(VCTargetsPath)\BuildCustomizations\CUDA 4.0.props” />
</ImportGroup>
这步很关键,如果不改的话,下一步做不成。
添加.cu的文件,每个.cu的文件上点右键,点属性:在”常规”里把项类型从”不参与生成”改成CUDA C/C++:

特别说明:
如果不做3,在5这步可以看见这个界面,但是没有CUDA C/C++这个选项;
    如果做了3但不做4,在5这步看不见这个界面。
配置项目属性里的C++路径 inc lib bin啊,还有linker里的附加依赖项cudart.lib、cutil64.lib,这些和普通的C++程序没区别,就是别忘了多了一个CUDA C/C++,对照自己的显卡,改下计算能力,目标平台什么的。对这些我是喜欢VS2010的风格,写了一个CUDA的属性文件,每次新建工程在属性管理器 里添加进来就行了,省得以前每次都要设一遍。

然后程序就能运行了,visual assert X高亮什么的参考别人的帖子就行了。网上很多人说不成功,估计卡不知道第4 、5步吧。
最后,GTX580确实NB,比GT540M还快了8倍左右,比C++的MKL程序快66倍,已经和别人论文里写的提升倍率差不多了,可能改改程序还能提高吧。
平台
型号
频率
核心数量
每帧图像平均耗时
笔记本CPU
I5 480M
2.66GHz
2CPU
4线程
Matlab
4.5s
MKL(C++)
660ms
笔记本GPU
GT540M
672MHz
96SP
CUDA C
80ms
台式机GPU
GTX580
772MHz
512SP
CUDA C
10ms
不过,实验室插GTX580的台式机是个DELL的图形工作站,06年的老货,CPU虽然8个核
的至强,编译选项也开了”多处理器生成”,但是编译 过程特别慢,明显不如现在笔记本里双核的i5 480M。对比GPU的执行速度差异,CPU的编译速度差距显得很有趣,核多不干活,鸡多不下蛋。
【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环境下工作。
  设置解决方案
  创建一个包含两个项目的解决方案,需要两个项目是因为一个目标是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.件中,大多数代码修复了编译警告,需要做的是声明一个使用host_vector构造的类,然后有一些方法执行CUDA代码并返回结果。
  1:#pragma once
  2:#pragma warning(push)
  3:#pragma warning(disable: 4996)      // Thrust's use of strerror
  4:#pragma warning(disable: 4251)      // STL class exports
  5: #include"thrust/host_vector.h"
  6: #include"thrust/device_vector.h"
  7:#pragma warning(pop)
  8:
  9:// See:support.microsoft/default.aspx?scid=KB;EN-US;168958
  10://      msdn.microsoft/en-us/library/esew7y1w.aspx
  11://      www.unknownroad/rtfm/VisualStudio/warningC4251.html
  12:
  13:#if defined(__CUDACC__)
  14: #  define DECLSPECIFIER  __declspec(dllexport)
  15: #  define EXPIMP_TEMPLATE
  16:#else
  17: #  define DECLSPECIFIER  __declspec(dllimport)
  18: #  define EXPIMP_TEMPLATEextern
  19:#endif
  20:
  21:#pragma once
  22:#pragma warning(push)
  23:#pragma warning(disable: 4231)
  24: EXPIMP_TEMPLATE templateclass
  25:    DECLSPECIFIER thrust::device_vector<unsignedlong>;
  26: EXPIMP_TEMPLATE templateclass
visual studio和vs code的区别  27:    DECLSPECIFIER thrust::detail::vector_base<unsignedlong,
  28:        thrust::device_malloc_allocator<unsignedlong>>;
  29:#pragma warning(pop)
  30:
  31:class DECLSPECIFIER Hello
  32:{
  33:private:
  34:    thrust::device_vector<unsignedlong> m_device_data;
  35:
  36:public:
  37:    Hello(const thrust::host_vector<unsignedlong>& data);
  38:    unsignedlong Sum();
  39:    unsignedlong Max();
  40: };

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。