GPU编程——CUDA在VS2010下环境搭建

时间:2022-09-07 13:34:35

        最近学习GPU编程,现将GPU开发所需的的开发环境搭建过程总结如下,GPU编程首先离不开CUDA(NVIDIA显卡),GPU和CUDA在这里就不过多介绍。学习GPU编程,离不开一本好书的辅导,在这里向大家推荐一下《GPU高性能编程CUDA实战》。

        学习GPU编程,首先需要一个具有NVIDIA显卡的电脑,其他的显卡(例如ATI)是不支持CUDA编程的,有了硬件平台,接下来就是对开发环境的搭建。这里采用的是CUDA5.0 + VS2010,VS2010的安装在这里就不过多的进行介绍,CUDA可以到NVIDIADeveloper Zone去下载,下载地址为https://developer.nvidia.com/cuda-downloads。 CUDA安装好以后,安装程序也会自动在系统环境变量内修改“PATH”,

GPU编程——CUDA在VS2010下环境搭建GPU编程——CUDA在VS2010下环境搭建

接下来手动添加

CUDA_BIN_PATH  %CUDA_PATH%\bin

CUDA_LIB_PATH  %CUDA_PATH%\lib\Win32

CUDA_SDK_BIN  %CUDA_SDK_PATH%\bin\Win32

CUDA_SDK_LIB  %CUDA_SDK_PATH%\common\lib\Win32


        VS项目测试:

        打开VS,新建项目

GPU编程——CUDA在VS2010下环境搭建

利用向导,会自动生成一段kernel累加代码,在代码main函数最后添加一行system(“pause”);

GPU编程——CUDA在VS2010下环境搭建

编译运行,打印输出如图所示

GPU编程——CUDA在VS2010下环境搭建GPU编程——CUDA在VS2010下环境搭建

       恭喜,cuda已经在您的机器上安装成功了。

       通过函数getDeviceProperties()来获得设备的属性,在cudaDeviceProp结构中包含了以下信息:

struct cudaDeviceProp

{

      charname[256];                 //标识设备的ASCII字符串

      size_ttotalGlobalMem;          //设备上全局内存的总量,单位为字节

      size_tsharedMemPerBlock;   //在一个线程块(Block)中可使用的共享内存总量,单位为字节

      intregsPerBlock;           //每个线程块中可用的32位寄存器数量

      intwarpSize;                 //在一个线程束(warp)中包含的线程数量

      size_tmemPitch;           /在内存复制中最大的修正量(Pitch),单位为字节

      intmaxThreadsPerBlock;      //在一个线程块中包含的最大线程数目

      intmaxThreadsDim[3];         //在多维线程块数组中,每一维包含的最大线程数量

      intmaxGridSize [3];       //在一个线程格(Grid)中,每一维可以包含的线程块的数量

      size_ttotalConstMem;         //常量内存的总量

      intmajor;               //设备计算功能集的主版本号

      intminor;               //设备计算功能集的次版本号

      intclockRate;                //

      size_ttextureAlignment;  //设备的纹理对齐要求

      intdeviceoverlap;          //一个布尔类型值,表示设备是否可以同时执行一个cudaMemory()调用和一个核函数调用

      intmultiProcessorCount; //设备上多处理器的数量

      intkernelExecTimeoutEnabled;    //一个布尔值,表示该设备上执行的核函数是否存在运行时限制

      intintegrated;               //一个布尔值,表示设备是否是一个集成的GPU

      intcanMapHostMemory;      //一个布尔值,表示设备是否将主机内存映射到cuda设备地址空间

      intcomputeMode;         //表示设备的计算模式:默认,独占或禁止

      intmaxTexture1D;         //一维纹理的最大大小

      intmaxTexture2D[2];           //二维纹理的最大维数

      intmaxTexture3D[3];           //三维纹理的最大维数

      intmaxTexture2DArray[3];    //二维纹理数组的最大维数

      intconcurrentKernels ;         //一个布尔值,表示设备是否支持在同一个上下文中同时执行多个核函数

};

        如果有多个显卡设备,可以通过函数cudaGetDeviceCount()获得显卡设备的数量,也可以通过下面代码进行自动选择最佳匹配的显卡设备。

<span style="white-space:pre"></span>int gpu_device_num = 0;
cudaGetDeviceCount(&gpu_device_num);
printf("gpu device num = %d\r\n",gpu_device_num);

cudaDeviceProp prop;
int dev;
cudaGetDevice(&dev);
printf("ID of current CUDA device: %d\r\n ",dev);
memset(&prop,0,sizeof(cudaDeviceProp));
prop.major = 1;
prop.minor = 3;
cudaChooseDevice(&dev,&prop);
printf("ID of CUDA device closest to reversion 1.3: %d\r\n",dev);
cudaSetDevice(dev);
cudaGetDeviceProperties(&prop,dev);