README

第1章 简介

GPU带给计算领域以巨大变革,这已在历史上留下了浓墨重彩的一笔。我喜欢饶有兴趣地阅读这类文字,因为我很早就参与其中了。在20世纪90年代中期,我任职于微软。当时英特尔和AMD正在引入第一批用以加速浮点计算的多媒体指令集,我领导一个开发小组开发Direct3D产品。英特尔为了阻止移植他们的CPU计算能力到三维栅格化任务,他们尝试跟微软合作出售使用他们多媒体扩展(MMX)指令集的光栅处理器,但最终失败了。当MMX光栅处理器运行在尚未发布的奔腾2处理器上时,我们发现其速度仅是正在出售的不起眼的S3 Virge GX光栅处理器的一半。那时我就知道这种努力注定是要失败的。

就Direct3D 6.0而言,我们与CPU厂商一起将他们的代码集成到我们的几何流水线(geometry pipeline),使开发人员可以以透明的方式使用来自英特尔和AMD的新指令集,并受益于厂商优化的代码执行路径。游戏开发人员接受了新的几何流水线,但由于新的指令集被用来生成GPU硬件的几何流水线所需要的顶点数据,因此,它没能阻止将CPU计算能力输送给GPU的持续迁移。

在那个时期,GPU上的晶体管数量超过了CPU上的数量。转折点在 199719981997\sim 1998 年间,当时奔腾2和英伟达RIVA TNT的晶体管数量都约为800万个。随后,GeForce 256(1500万个晶体管)、GeForce 2(2800

万个晶体管)和 GeForce 3(6300 万个晶体管)的晶体管数量均超过了当时的 CPU。此外,两种设备之间的差异越来越清楚:大部分的 CPU 芯片面积是为了支持缓存,而大部分的 GPU 芯片面积是为了逻辑。英特尔能够添加大量新的扩展指令集(MMX、SSE、SSE2 等),而增加的面积代价几乎可以忽略不计。GPU 是专为并行吞吐处理而设计的,它们的小规模缓存是为了带来更多的带宽聚合(bandwidth aggregation)而不是为了减少指令延迟。

虽然ATI和英伟达等公司一直在生产越来越快速和越来越强大的GPU,CPU厂商仍然在摩尔定律(Moore’s Law)[1]的指引下追求更高的时钟速率。第一款奔腾处理器(1993年)的时钟速率为60MHz,而启用MMX的奔腾处理器(1997年)的时钟速率为200MHz。到20世纪末,时钟速率已超过1000MHz。但此后不久,计算史上发生了一桩重大事件:摩尔定律碰了钉子。晶体管将继续变小,但时钟速率可能不会再继续增加。

这一事件并非意料之外。英特尔的Pat Gelsinger在2001年美国电气和电子工程师协会(IEEE)举办的固态电路会议上发表主题演讲,曾表示:如果继续目前的设计思路,芯片会在2010年跟核反应堆一样热,而到2015年将达到太阳表面的热度。在未来,性能将来自“同步多线程”(simultaneous multithreading,SMT)技术,可能要通过把多个CPU核心集成到一个芯片上来达到目的。事实上,CPU厂商已经

这么做了。今天,很难找到一个只有单个CPU核心的桌面PC。几十年来,摩尔定律带给软件开发人员搭便车(freeride)的机会:提高CPU时钟频率,几乎根本不用软件开发人员操心,就允许程序运行更快。但这种好事将成为过去。多核心CPU需要多线程应用程序。只有当应用程序可以并行化时,众多CPU核心才能带来预期的高性能。

GPU的定位很好地利用了摩尔定律的新趋势。虽然那些未曾考虑并行化的CPU应用程序将需要大量的重构(如果它们有并行化的可能),然而在图形应用程序上已经采用了可以利用各独立像素之间固有的并行模式的思路。对于GPU而言,通过增加执行核心的数量来提高性能是一个很自然的手段。事实上,GPU设计者往往倾向于添加更多的核心而不是更强大的核心。他们摒弃了以最大限度地提高时钟频率(GPU的发展路线从来不是、现在依然不是靠制造接近晶体管电路极限的时钟频率)、预测执行(speculative execution)、分支预测(branch prediction)和存储转发(store forwarding)等为代表的CPU厂商认为理所当然的策略。为了防止更加强大的处理器受限于I/O速度(I/O bound),GPU设计者结合内存控制器,并与内存厂商一起研制可以远远超过CPU可用带宽很多的GPU内存带宽。

但是,GPU的强劲计算能力对于非图形开发者来说很难利用。一些充满探索精神的程序员借助如Direct3D和OpenGL的图形API,通过迷惑图形硬件来执行非图形的计算任务。这一方法被冠以专门的术语:通

用GPU编程(general-purpose GPU programming,GPGPU)。但GPU的大部分计算潜力仍一直处于未发掘状态,直到CUDA的出现改变了这一切。Ian Buck当时在斯坦福大学开展一项名为Brook的项目,意在简化GPGPU应用程序的开发过程。Buck后来进入英伟达并领导开发了一套新的开发工具,这使得GPU上非图形应用程序的开发更容易。这个英伟达的专用工具套装就是CUDA。CUDA允许C语言程序员使用一些简单易用的语言扩展编写GPU并行代码。

自2007年推出以来,CUDA一直深受好评。数以万计使用该技术的研究论文已被发表。它已被用于多个商业软件包,跨度从Adobe的CS5到Manifold的地理信息系统(geographic information system, GIS)。对于适合的工作任务,运行在支持CUDA的GPU上,相比同年代CPU,可以获得 54005\sim 400 倍不等的加速。这些加速的来源各不相同。有的加速是因为GPU有更多的核心;有的是因为有更高的内存带宽;还有一些是因为应用程序可以利用在CPU中不曾有的专门GPU硬件,例如可以更快计算超越函数的纹理硬件或特殊函数单元(SFU)。但并非所有的应用程序都可以采用CUDA实现。更确切地说,并非所有的并行应用程序都可以采用CUDA实现。但CUDA已使用在各种应用中,比任何其他的GPU计算技术的应用更广泛。我希望本书可以帮助有一定CUDA基础的开发者更有效地使用CUDA。

[1] 摩尔定律主要有三种不同说法:集成电路芯片上所集成的电路的数目,每隔18个月就翻一倍;微处理器的性能每隔18个月提高一倍,或价格下降一半;用一美元所能买到的计算机性能,每隔18个月翻一倍。——译者注