一、前言
区块链,深度学习发展迅猛,GPU登上了舞台。
二、GPU是什么?
GPU即 Graphics Process Unit,译为“图形处理器”。GPU是显示卡的核心部件,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。今天的GPU不仅具备高质量和高性能图形处理能力,还可用于通用计算。今天,GPU已经不再局限于3D图形处理了,GPU通用计算技术发展已经引起业界不少的关注,事实也证明在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍乃至于上百倍于CPU的性能,GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。
三、GPU原理
下图对CPU与GPU中的逻辑架构进行了对比。其中Control是控制器、ALU算术逻辑单元、Cache是cpu内部缓存、DRAM就是内存。可以看到GPU设计者将更多的晶体管用作执行单元,而不是像CPU那样用作复杂的控制单元和缓存。从实际来看,CPU芯片空间的5%是ALU,而GPU空间的40%是ALU。这也是导致GPU计算能力超强的原因。
四、GPU查看
1、Linux查看显卡信息:lspci | grep -i vga
2、使用nvidia GPU可以:lspci | grep -i nvidia
3、Nvidia自带一个命令行工具可以查看显存的使用情况:nvidia-smi
表头释义:
Fan:显示风扇转速,数值0到100%之间,如果计算机不是通过风扇冷却或风扇坏了,显示出来就是N/A;
Temp:显卡内部的温度,单位是摄氏度;
Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
Pwr:能耗表示;
Bus-Id:涉及GPU总线的相关信息;
Disp.A:是Display Active的意思,表示GPU的显示是否初始化;
Memory Usage:显存的使用率;
Volatile GPU-Util:浮动的GPU利用率;
Compute M:计算模式;
4、如果要周期性的输出显卡的使用情况,可以用watch指令实现:watch -n 10 nvidia-smi //命令行参数-n后边跟的是执行命令的周期,以s为单位。
五、GPU编程库
GPU计算能力这么强,被广泛使用!比如挖矿(比特币)、图形图像处理、数值模拟、机器学习算法训练等等,那我们怎么发挥GPU超强的计算能力呢?---编程!
怎么进行GPU编程呢?现在GPU形形色色,比如Nvidia、AMD、Intel都推出了自己的GPU,其中最为流行的就是Nvidia的GPU,其还推出了CUDA并行编程库。然而每个GPU生产公司都推出自己的编程库显然让学习成本上升很多,因此苹果公司就推出了标准OpenCL,说各个生产商都支持我的标准,只要有一套OpenCL的编程库就能对各类型的GPU芯片适用。当然了,OpenCL做到通用不是没有代价的,会带来一定程度的性能损失,在Nvidia的GPU上,CUDA性能明显比OpenCL高出一大截。目前CUDA和OpenCL是最主流的两个GPU编程库。
从编程语言角度看,CUDA和OpenCL都是原生支持C/C++的,其它语言想要访问还有些麻烦,比如Java,需要通过JNI来访问CUDA或者OpenCL。基于JNI,现今有各种Java版本的GPU编程库,比如JCUDA等。另一种思路就是语言还是由java来编写,通过一种工具将java转换成C。
参考资料:
1、《GPU的介绍 以及原理的分析》https://blog.csdn.net/u013165704/article/details/80569424
2、《GPU加速原理&技术介绍》https://blog.csdn.net/weiweigfkd/article/details/23051255