一、CUDA安装与环境配置
Linux环境下的CUDA的安装
因为之前的博客中有涉及到这一部分所以这里就不在详述。ubuntu16.04 Server install CUDA
不过我们在linux下使用GPU编程的时候有时候会遇到nvidia驱动挂掉的情况,这个时候我们需要修复它,在之前的博客中我们使用dkms来进行管理的方法。nvidia驱动挂掉
在linux下面我们经常会使用nvidia-smi指令对GPU的使用情况进行监测,但是有时候GPU监测时会不准确或者有时候程序退出了但是现存还被占用着,这种情况之前的博客也有解决方法。GPU监测时问题解决
Windows环境下的CUDA安装
Windows环境下的安装,我们需要先安装Visual Studio编译器用于后面的编程使用,然后去nvidia的官网查找适用与该版本的Visual Studio的CUDA版本,剩下就比较简单了,直接开始安装,安装软件会自动帮你配置好环境变量等,安装好就可以直接使用了。可以去安装的VS中直接建立CUDA的工程进行编程使用了。
二、GPU硬件
掌握部门的硬件知识,可以有助于我们更好的编写CUDA程序,可以更好的优化CUDA程序的性能。
首先我们需要先知道一些基本的一些专业名词:
英文 | 中文 |
---|---|
Stream Processor(SP) | 流处理器 |
Stream MultiProcessor(SM) | 流处理器组 |
Thread | 线程 |
Block | 线程块 |
Grid | 线程网格 |
Warp | 线程束 |
shared memory | 共享内存 |
kernel function | 核函数 |
SP(Stream Processor)和SM(Stream MultiProcessor)是硬件层面的,Thread、Block、grid和warp是软件层面上的。
SP(streaming processor):最基本的处理单元,也称为CUDA core。最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。
SM(Stream MultiProcessor):多个SP加上其他的一些资源组成一个SM。也叫GPU大核,其他资源如:warp scheduler,register,shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads。因此,这些有限的资源就使每个SM中active warps有非常严格的限制,也就限制了并行能力。
thread:一个CUDA的并行程序会被以许多个threads来执行。
block:数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信。
grid:多个blocks则会再构成grid。
warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT。
注
对于硬件结构的图网上有很多,还有CUDA的指导手册中也有很多,这里为了简单就先不列出来了,如果未来有时间有兴趣,将会进一步进行优化。也可以去参看后面第四部分中的参考中的网址进行参考。
三、使用代码获取GPU的参数信息
因为我们对于不用的GPU型号,其构架等信息都不一样,如果我们要想优化一个更好的CUDA程序,我们就需要更好的了解我们的硬件信息,然后根据其进行一些优化处理。对于GPU硬件参数的获取,当然我们可以根据GPU提供的手册进行查找,我们也可以使用程序进行查找。
我们可以使用cudaGetDeviceCount()函数来查看当前计算机中拥有多少个GPU设备,然后可以对每个设备进行迭代,并查询各个设备的相关信息。CUDA运行的时将返回一个cudaDeviceProp类型结构,其中包含了设备的相关属性。
在cudaDeviceProp结构中包含以下信息(本人的CUDA版本是8.0):
1 | struct __device_builtin__ cudaDeviceProp |
使用CUDA程序读取GPU参数:
1 | //CUDA头文件 |
四、参考
《GPU高性能编程CUDA实战》
https://blog.csdn.net/zhangfuliang123/article/details/78115163