29

技术资讯 | 深度学习的基石-GPU异构并行加速

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=Mzg4MTE5NTIxOQ%3D%3D&%3Bmid=2247483989&%3Bidx=1&%3Bsn=a0f85ca05d569a9457c6bd22eda5a7f8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

i2iAjiz.jpg!web

01

异构计算的兴起

从英特尔1971年开发出第一个商用处理器Intel 4004开始,微处理器所带来的计算机和互联网革命开始改变着我们的世界。同时,英特尔创始人之一的戈登·摩尔提出了一个广为流传的摩尔定律: 每24个月会将芯片的性能提高一倍

y2MFnqZ.png!web

随着互联网的爆炸式发展和信息化的普及,尤其近几年机器学习、深度学习、无人驾驶、气象预测、工业仿真等领域的快速发展和崛起。通用CPU在处理海量计算、海量数据时暴露出越来越多的 性能瓶颈

●并行度低

●带宽小

●时延高

uYZVba6.png!web 

面对越来越多的多元化的计算需求,越来越多的场景开始引入诸如GPU、FPGA等硬件进行加速,异构计算开始兴起。

所谓 异构计算 (Heterogeneous Computing) ,主要指不同类型的指令集和体系架构的计算单元组成一个混合的系统执行计算的特殊方式。

特别在人工智能领域,目前以CPU + GPU为代表的异构计算已成为加速AI创新的新一代计算架构。

0 2

GPU的加速原理

从上述图片中可以看出,CPU的摩尔定律基本失效。当前工艺水平已不断接近物理极限,发展步履维艰,提升主频已难以维持。只能从多核考虑,而CPU的多核也因为大量的cache及控制器占据了大部分的芯片面积,也难以再延续摩尔定律。

高并行,高带宽的异构计算 成为必然的选择 。作为当前高并行计算的通用方案,GPU正以超摩尔的速度在快速迭代。

本文主要从以下两个方面对其加速原理做一些浅显概述,抛砖引玉:

2.1 硬件架构 

●数以千计的计算核心

● 高带宽

GPU一推出就包含了比CPU更多的处理单元,更大的带宽;当前CPU最多也只有几十个核,但即使是普通级别的GPU就包含了成百上千个处理单元,高端的甚至更多,这对于大量重复处理过程有着天生的优势。 下图展示了CPU和GPU架构的对比:

eEza6fR.png!web 

看的出:GPU与CPU在内部设计上也有许多相似处,都有控制器,计算单元(ALU),Cache。同时,在结构上也有着很明显的差异。

CPU为了适应更复杂的环境和降低访问延迟,大部分面积都给了控制器和寄存器。

与之相比, GPU 拥有更多的ALU用于数据处理,而非数据高速缓存和流控制,这样的结构适合密集型数据的并行处理,即在一个时刻可以并行处理多个数据;这里引用一张网上针对 GPU与CPU的计算能力对比 测试结果:

Nn677vy.jpg!web

可以看出,尽管是用的GForce的游戏级显卡,单精度与双精度的计算能力仍然远高出CPU的处理能力。

硬件结构上的差异,直接反馈到计算性能上的不同。从上图中可以反应出GPU的计算性能的巨大差距。

当然,上面的图只是方便对比CPU与GPU在架构上的异同,我们看一下当前Nvidia最强算力的V100硬件架构图感受一下:

jI3QreZ.jpg!web   Volta v100架构

可以看出,满屏都是密集的计算单元。

Nvidia为其堆了84个SM (流多处理器) ,5376个FP32核心,5376个INT32核心、2688个FP64核心、672个Tensor核心,336个纹理单元,6144KB的L2缓存...

这其中的每一个核心,其实就相当于一个简化版的CPU,GPU通过数以千计的计算核心来隐藏数据的访问延迟。

当然,影响性能的不仅只是计算核心的多少,内存架构也是一个不可忽视的因素,其内存模型如下:

reu67v6.png!web 

与CPU类似,GPU为了提升带宽,也设计了多层级的临近缓存结构,如:寄存器、共享内存、L1缓存、L2缓存、纹理内存、常量内存、全局显存,其存取速度从寄存器到全局显存依次递减:

rQBVNzU.png!web

程序设计时,合理使用上述内存,可以有效提升GPU的利用率和吞吐率。

2.2 并行计算引擎 

为充分利用GPU的计算核心,Nvidia同时还推出了基于C扩展的通用并行计算架构——CUDA,利用CUDA技术,可以将那些GPU内的处理核心调度起来,成为线程处理器去解决数据的密集计算。

该架构极大的降低了开发人员操作GPU的开发门槛,方便解决一些复杂的计算问题,其编程模型如下:

uyaEBvn.png!web

 

CUDA编程模型是基于C的扩展,所以上手相对比较容易,Nvidia同时也提供了比较丰富的API和基础的运行库,方便开发和复用。

当然如果需要自己写核函数,还是需要系统的进行学习,CUDA开发容易,写好较难,需要对其硬件及软件架构都比较了解,才能设计出一个高效的高并发程序。

对于并行计算引擎,主要有以下三个层面的并行:

● 基于网格的流并行;

基于线程块不需要通信的粗粒度并行

●  基于块内线程可以通信的细粒度并行

在具体介绍前,先了解一下GPU的线程模型:

zy6Vzmi.png!web 

其线程组织与硬件的对应关系大致如下:

FbAFFnr.png!web

 

2.2.1 流并行 

GPU中的流并行可以理解为CPU上的任务并行,即每个流都可以看作是一个独立的任务。

每个流中的代码执行顺序类似于CPU上的队列,严格按照操作加入顺序执行。只要GPU支持设备重叠功能,则GPU在执行一个核函数的同时,可以同时在设备与主机之间执行复制操作。

将操作放入流的队列时应采用宽度优先方式而非深度优先,即多个流交叉添加,这样我们就可以隐藏掉数据在主机和设备端的数据传输时间,从而提升GPU的利用率。

q2YvArr.png!web

 

2.2.2 块并行 

块并行可以类似理解为CPU的多进程模型。在执行时,GPU的任务分配单元将网格分配到GPU,GPU根据启动配置信息将块分配到SM上。

任务分配单元使用轮询策略: 轮询查看SM是否还有足够的资源来执行新的块,如果有则给SM分配一个新的块,如果没有则查看下一个SM。

决定能否分配的因素有:每个块使用的共享存储器大小,寄存器大小,以及其它的一些限制条件;所以程序员可以通过调整块内线程数,每个线程使用的寄存器和共享存储器来进行隐式的块分配控制,不同块之间的执行没有顺序,完全并行。

2.2.3 线程并行  

线程并行我们应该比较熟悉。在CUDA中,warp是SM执行的最小单位,由SM以连续的方式自动进行分组,所以对程序员来说是透明的,同一个 warp 里的 thread,加载不同的数据,执行相同的指令,即单指令多线程模型,它的大小可能会随着硬件的发展而变化。当前每个warp由32个线程组成,同一个warp是严格串行的,因此在warp内是无须同步的。

在一个SM中可能同时有来自不同块的warp。 当一个块中的warp在进行访存或者同步等高延迟操作时,另一个warp可以占用SM中的计算资源。 这样在SM内就实现了简单的乱序执行。

当GPU资源比较充足时,所有的线程束都能并发执行。 理论上,一个SM里的thread越 多,越能隐藏latency,但同时,也会让每个thread能使用的资源更少。 因此,在写代码或优化时要做一些取舍和均衡。

zeiAby6.jpg!web

03

总结

随着大数据,人工智能等计算产业的演进,以及5G的普及、物联网等新技术的推动,面对数据的爆炸式增长,对算力增长的长期需求将会不断催生更多的异构计算单元,计算多元化的趋势将会获得更加广泛的发展空间,如CPU+FPGA,CPU+ASIC,或者AMD已融合了CPU+GPU的APU等异构架构,大数据和AI唤醒了异构计算的兴起,异构计算的发展会促进更多行业的发展和变革。

投稿 | 机器学习平台

编辑 | sea

排版 | sea

往期推荐

YfiUjeI.jpg!web

RNVNVzU.jpg!web

Znuiii7.jpg!web

eIjYBzV.gif

J3IZbi7.jpg!web

r6zY3yR.gif

在看点一下 大家都知道


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK