最近学习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”,
接下来手动添加
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,新建项目
利用向导,会自动生成一段kernel累加代码,在代码main函数最后添加一行system(“pause”);
编译运行,打印输出如图所示
恭喜,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);