首页 » 程序媛 » 正文

CUDA学习笔记(一)——关于GPU并行计算(parallel programming)

发表于: Wonder's Land · 2017-3-22 ·  254 views  ·  0 replies 

一、前言

如果你要耕地,你会选择哪种方式?2头健壮的公牛或是1024只小鸡?(If you were plowing a field,which would you rather use?Two strong oxen or 1024 chickens)

——美国超级计算机之父西摩·克雷(American super computer designer Seymour Cray)


并行运算就是通过将大的问题分解成小块并同时运行这些小块以此解决他们。

现代的GPU满足:

(1)包含上千个运算单元(或说运算器,ALU),能够运行上千个算术运算;

(2)能够使数以万计的并行块同时高效工作,一个现代的GPU大概能运行多达65000的并发线程;

(3)包含上百个处理器,来满足不只为单一标量处理器的编程方式。

以上称作GPU编程或者GPGPU


二、技术趋势

近些年来,随着特征尺寸的变小,晶体管变得 更小,运行更快,能耗更低,集成数量更多,总之,我们每年都有更多的可供计算的资源。理论上来说,由于晶体管的改进,处理器设计者能够增加处理器的时钟频率,使他们越来越快。从历史上来看,时钟性能的主要驱动因素之一就是时钟速度的提升,然而最近十几年,时钟速度却基本保持不变。


 那么应该创造什么样的处理器呢?

传统CPU有非常复杂的控制硬件,这允许性能灵活,但随着硬件越来越复杂,在电力和设计方面代价日益昂贵。所以在固定电量下使得效益最好,就倾向于构建更为简单的控制结构而代替的用晶体管去支持更多数据路径中的计算,即构建数据路径的方式是用GPU制造出大量的并行单元。单个的单元小而简单高效,但可以大量地放入单个芯片。而对这些单元进行编程使其可以协同工作正是(并行运算)parallel programming的研究内容。


所以打算制造一个高性能也就是能效更好的处理器时,需要优化的因素有哪些?

一个是最大程度地缩小执行时间(lagency),执行时间是指完成一项任务的时间,可以用比如秒等时间单位来衡量;另一个是增加吞吐量(throughput),吞吐量是指每个单位时间完成的任务量,可用比如每小时完成的工作来衡量。


两者的优化目标并不一定一致。

举个例子,当我们需要去银行办理柜台业务时,我们需要排长队等待,但希望快点办完快点离开,即我们希望呆在银行的时间越短越好,而银行应该是希望每天的总服务量最多,所以他就只放几个人在柜台前为长队服务,这样使他的员工永远忙碌 没有一刻停止服务,这样员工的总服务量之和就是最多的。这就好像传统的CPU优化执行时间,它试图优化每个具体任务的消耗时间,相反的,GPU选择优化吞吐量,这是一种截然不同却和计算机领域的技术趋势(推荐一篇文章lantency lags bandwidth,作者是加州大学伯克利分校的教授 David Patterson ,发表于2004年,里面有许多优化吞吐量的应用,这是一种正确的方式)相一致的一种方法。再举个例子,比如在计算机图形中,我们更关心的是每秒的像素量而不是某个具体像素的执行时间,如果可以将像素的吞吐量提高的话哪怕适当影响单个像素执行时间的增加也是可以考虑的。


 但是二者的优化趋势也不是对立的。

改进滞后时间往往可以增加吞吐量而增加吞吐量也可以带动滞后时间的减少。但GP设计师优先考虑吞吐量。


三、鉴于这些技术发展趋势,归纳一下GPU设计师所做决定的特点


  • GPU有许多简单的计算单元,可以协作执行大量的计算

一般情况下,GPU愿意牺牲控制来交换计算,即选择更简单的控制复杂性和更多的计算能力,这一决定的结果是基于程序员对机器的考量,可能GPU编程模型比CPU有更多的限制。


  • GPU有一个显式编程模型

当我们用GPU进行编程时,我们知道它有非常多的处理器,会用到且必须用到这些处理器去编程,不用假装只有一个处理器然后假设通过一个复杂的控制链映射到许多处理器上。


  • GPU优化吞吐量而不是执行时间

它愿意以任何单一个体计算的执行时间增加为代价换取每单位时间内更多的计算,因而非常适合那些吞吐量为最重要指标的应用领域。


四、从软件开发者角度看待GPU

以上解释了GPU为什么是现在的样子,从开发者角度看,并行编程其实对GPU和CPU都很重要。举个例子:如果我们有一个8核的Intel Ivy Bridge 处理器,每核有8宽位AVX矢量操作,每核支持两个同时运行的线程,则这个处理器有8*8*2=128的并行度,如果在这个处理器上运行完全串行的C程序,就意味着使用了才不到1%的机器能力。虽然并行程序比串行程序复杂且难,但是相对于获得的潜在性能,这些附加的复杂度值得的。


五、“精神面包”集锦


  • 知识点1

硬件设计师让计算机运行速度更快的传统方式有哪些?(what are three traditional ways that hardware designers make computer run faster?)

答:第一种方式是更快的时钟频率(faster clocks),第二种方式是每个时钟周期进行更多工作(more work per clock cycle),第三种方式是更多的处理器(more processors),而第三种方式有关于并行程序(parallel programming)


  • 知识点2

当前,我们的处理器一代比一代快,不是因为晶体管的运行越来越快而是因为有了更多的晶体管参与了运算。没有提高时钟频率的原因是大量(约十亿个)的晶体管的运转将产生大量的热量,而无法使这些处理器保持冷却。电力是最主要的驱动因素也是所有尺寸的现代处理器设计最重要的因素。结果是处理器的设计转为用电少而高效的设计而不是运行快却低效的设计。


  • 知识点3

计算机设计师们现今用来制造能效更好的芯片的技术是更多更简单的处理器(more,simpler processors)


  • 知识点4

关于执行时间(latency)和吞吐量(throughput)的一个小辨析示例:        我们要从A地去往相距A地4500km的B地,可选择小汽车或者公交车两种交通方式,小汽车载客量是2人,时速200km,而公交车载客量是40人,时速50km,那么二者的“latency”和”throughput“各是多少呢?

Latency(A->B): 小汽车需要22.5h,公交车需要90h

Throughput(A->B): 小汽车是2/22.5=0.089人/h,公交车是0.44人/h

本文链接: http://wonderlee.me/2708.html
1 like+
«上一篇: 该分类没有了

相关文章

WordPress改造之修改上传文件大小限制

wp默认上传文件的限制是2M,放到现在这个信息爆炸的时代估...

每天都有新发现之灵析实习日记

kind : 每日动态,only一两句 一百种关于社会的听闻不如一...

OpenGL实现基本图元的绘制——Lab1_3

接Lab1_2 在掌握了画直线和圆弧等基本图元的画法之后,我们...

OpenGL实现基本图元的绘制——Lab1_2

接lab1_1 第二部分 实现圆弧的正负法和Bresenham算法 关于...

OpenGL实现基本图元的绘制——Lab1_1

关于OpenGL OpenGL(全写Open Graphics Library)是个定义...

Angular学习笔记(2)15/12/26

补充Angular历史 由谷歌员工Miško Hevery 从09年开始开发的...