开始接触CUDA,我安装好后完全不知道怎么运行demo,当然也没有见到详细的安装说明。下面说说我的经验。

Platform:Win XP64

IDE:VS2008

1 获取可访问以下网址:

http://www.nvidia.com/object/cuda_get.html

共需下载3个应用程序,分别是:

1>     CUDA Driver

2>     CUDA Toolkit

3>     CUDA SDK code samples

可以选择合适的操作系统,例如我选的是WIN XP 64-bit。

2 安装

a)         其中CUDA Driver是为了使CUDA和硬件交互,CUDA 2.2中驱动文件版本是185.85,我原来的显卡驱动是17*.*,所以需要安装升级。

b)        接下来安装Toolkit,里面是一些头文件和库,nVidia的编译器,还有帮助文档。安装后,会自动在系统的环境变量里注册路径

CUDA_BIN_PATH (defaults to C:/CUDA/bin) contains the compiler executables and runtime libraries.

CUDA_INC_PATH (defaults to C:/CUDA/include) contains the include files needed to compile CUDA programs.

CUDA_LIB_PATH (defaults to C:/CUDA/lib) contains the libraries needed for linking CUDA codes.

c)        然后安装SDK,里面有很多示例和模版,可以参照。安装后进入/NVIDIA CUDA SDK/common文件夹,将Release.sln(2005)或Release_vc90.sln(2008)编译。新生成的.lib和.dll会在/NVIDIA CUDA SDK/common/lib里。

3 使用

以Visual Studio 2008 TeamSuite为例:

1)         文本编辑

由于CUDA使用的源文件是.cu文件,因此默认情况下VS不会识别它里面的语法,会把它当成普通的txt文件。

Tools->options,左侧树形图展开Text Editor,在File Extension子项中:

Extension:cu              Editor:Microsoft Visual C++

点击Add,这样cu文件就会被当做cpp文件显示了。由于VS不会立即更新,需要重新启动VS。

2)        路径包含

Tools->options,左侧树形图展开Projects and Solutions,选VC++ Directories子项,

Platform:     x64(默认是win32,但是我的是x64,所以需要选这个)

Show directories for:

       Include files添加:

a)         C:/CUDA/include

b)        C:/Documents and Settings/All Users/Application Data/NVIDIA Corporation/NVIDIA CUDA SDK/common/inc

Library files添加:

a)         C:/CUDA/lib

b)        C:/Documents and Settings/All Users/Application Data/NVIDIA Corporation/NVIDIA CUDA SDK/common/lib

3)        编译配置

Build->Configuration Manager,

Active Solution Configuration:Release(or Debug)

Active Solution Platform:       x64(如果没有需要new一个)

Project->Custom Build Rules,Find existing,找到/NVIDIA CUDA SDK/common/cuda.rules,打开,并在左侧勾选上,这样就可以调用nvcc来编译cu文件了。

在工程上点右键->Properties,左侧树形控件Configuration Properties->Linker->Input,在右侧Additional Dependencies里添加”cudart.lib cutil64.lib”(不包括引号),这样基本上编译就不会出问题了。

      如果是driver API,需要添加”cuda.lib cudart.lib”,头文件#include <cuda.h>,#include <cuda_runtime.h>

4)        运行

运行时可能出现某个dll无法找到的情况,这是需要将dll复制到解决方案编译下的exe所在文件夹,或者干脆复制到system32里。 

 

当前我所用的显卡详细信息:

CUDA device's Name: GeForce 8500 GT
Multi-Processors : 4
canMapHostMemory : 0
clockRate : 1188000
computeMode : 0
deviceOverlap : 1
integrated : 0
kernelExecTimeoutEnabled : 1
compute capa : 1 1
maxGridsize : 2358912
maxThreadsDim : 2358900
maxThreadsPerBlock : 512
memPitch : 262144
regsPerBlock : 8192
sharedMemPerBlock : 16384
textureAlignment : 256
totalConstMem : 65536
totalGlobalMem : 133890048
warpSize : 32

 

CUDA下在Host端分配的几种内存模式

Pageable VS Pinned

        平时我们使用的内存都是Pageable(交换页)的,而另一个模式就是Pinned(Page-locked),实质是强制让系统在物理内存中完成内存申请和释放的工作,不参与页交换,从而提高系统效率,需要使用cudaHostAlloc和cudaFreeHost来分配和释放。

    优点
        1、带宽更高
        2、内核处理和内存拷贝可同时进行
        3、可以内存映射(mapped)
    缺点
        使用pinned会减少系统内存的可用量,进而影响系统性能。

 

在Pinned模式下又有以下几种属性:

Write-combining

缺省的话pinned拥有cacheable属性,可以用cudaHostAllocWriteCombined标志替代

    优点
        1、可以释放L1和L2资源,让缓存应用于别的地方
        2、write-combining在通过PCIE总线传输时不会被检测,大约可提高

             40%的性能

    缺点
        无法读取或读取极慢。

 

Portable

对于多线程,只能分配pinned的线程可以得到好处,如果想让别的线程也共享,需要cudaHostAllocPortable标志。

Mapped

传入cudaHostAllocMapped标识可以让宿主与设备内存映射(某些设备支持),这样设备和宿主共用一块内存,在内核函数中可以用cudaHostGetDevicePointer得到指针,不同的宿主线程得到的指针是不同的。

    优点
        不用在设备中分配和拷贝内存,数据在需要的时候被内核隐式传输

        不需要用Stream来异步执行,内核函数自动在执行的同时异步传输

    缺点

        由于内存共享,内存访问必须同步

 

CUDA的一些配置

         曾经装了winxp64 + nvidia driver19*.* + VS2008(sp1),感觉很卡,所以一直用cuda2.2. 最近装了win7,发现对190以上版本的驱动兼容性很好,就装了cuda2.3,本来想体验一下VS2010 beta2,但是后来从微软工作人员处得知MSBuild还存在一些bug,无法正常使用cuda,并且暂时不能给我补丁,无奈之下换回VS2008,不做傻乎乎吃螃蟹的人了。

        在使用cuda2.3的时候,有时候可能会进行win32和x64的切换,我把几个常见问题罗列如下:

1、在VS2008里如何设置文件路径?

     答:Tools》options》Projects and Solutions》VC++ Directories,右侧添加

                                                               win32                                                     x64

           Executable files                       C:/CUDA/bin                                    C:/CUDA/bin64

           Include files                             C:/CUDA/include                              C:/CUDA/include

           Library files                              C:/CUDA/lib                                     C:/CUDA/lib64

2、弹出错误fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

     答:这是由于我使用的是64位toolkit,默认编译成64位的obj文件,所以在win32模式下会弹出此错误。

           打开project的property pages,在CUDA Build Rules v2.3.0(因为已经勾选了cuda.rules)》

           General》Extra Options里面填写--machine 32,意思是生成32位的obj文件。具体参数可参看

           nvcc的说明文档。

3、我的win32模式虽然编译通过,但是运行时会出现the application was unable to start correctly(oxc000007b)的错误提示。

     答:不知道路径设置在哪里有错误,原因是启动时找到的cudart.dll版本错误,将C:/CUDA/bin中的

           cudart.dll拷贝到本工程的文件夹,即可正确运行。暂时猜测是运行了系统环境变量里的(待验证)。

4、错误或警告defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library

     答:这是由于使用运行库的版本不一致导致的,解决方案也很简单,就是你引用的所有的库都要用同一版本,

           例如/MT, 或/MTd等等。在project的property pages中,C/C++》Code Generation》Runtime

           library 和 CUDA Build Rules v2.3.0》Hybird CUDA/C++》Runtime Library中的设置要一致。

 

vs2010添加cuda.rules


        最近试用vs2010 beta2, cuda2.3. 发现原来vs2008里面的custom build rules已经不见了. 取而代之的是build customizations.

        这里的配置只接受*.targets文件,并不支持*.rules文件。解决方法如下:

        直接用vs2010 打开原来的sln文件,接着会进行版本转换,当遇到老版本里面包含的rules文件时,会自动在该文件夹生成targets,xml,props文件。

        这样在新的工程里,右键单击项目,build customizations=》find existing=》找到相应的targets文件即可。

 

        如果想更方便的使用,可以将其放入 /Program Files (x86)/MSBuild/Microsoft.Cpp/v4.0/BuildCustomizations文件夹。

这样IDE就会自动将其添加到列表中了。


        最近试用vs2010 beta2, cuda2.3. 发现原来vs2008里面的custom build rules已经不见了. 取而代之的是build customizations.

        这里的配置只接受*.targets文件,并不支持*.rules文件。解决方法如下:

        直接用vs2010 打开原来的sln文件,接着会进行版本转换,当遇到老版本里面包含的rules文件时,会自动在该文件夹生成targets,xml,props文件。

        这样在新的工程里,右键单击项目,build customizations=》find existing=》找到相应的targets文件即可。

 

        如果想更方便的使用,可以将其放入 /Program Files (x86)/MSBuild/Microsoft.Cpp/v4.0/BuildCustomizations文件夹。

这样IDE就会自动将其添加到列表中了。