2大规模并行处理器编程实战 处理器供应商已经转变了处理器的处理模型,即在每个芯片中采用多个处理单元(称为处理 器内核,Processor Core)提升处理能力,这种转变在软件开发人员社区中产生了巨大的影响 [Sutter,20051. 从传统意义上来讲,绝大部分软件应用程序都是用串行方式编写的,冯·诺依曼(o Neumann)早在1945年的开创性报告中已经描述过这一观点。这些串行程序的顺序执行过 程符合人们的顺序思维习惯,容易被人们理解。从计算机发展史上看,每产生一代新的微 处理器,计算机用户习惯性地期待程序的运行变得更加快速,但用户的这种期待从现在起 变得很难实现。一个串行程序只能在其中一个微处理器内核中运行,目前的运行速度已经 到达一个瓶颈阶段,很难再有所突破。运行速度的限制使得应用程序开发人员很难随着引 入新一代微处理器而在其软件中引进新的特性与功能,从而阻碍了整个计算机行业的发展 进程。 而每一代微处理器产生的同时也会对应用软件的性能提出更高的要求,于是并行程序 应运而生,它采用多线程协作的执行方式使程序运行更加快速。这种新的设计方式(并行程 序设计)的发展极大地推动了产业的进步,甚至称为“并行革命(concurrency revolution)” [Sutter,2005]。现在运用并行程序设计已经不足为奇,并行程序在高性能计算领域已经发 展了近十年。但这些并行程序只能在昂贵的大型计算机上运行,而只有少数高端的应用程 序值得用这么昂贵的计算机,因此也只有少数开发人员能运用并行程序设计。既然新的微 处理器都是并行计算机,并行程序就应该随之得到广泛的应用,从而开发出更多的并行应 用程序。这需要大量的软件开发人员掌握并行程序设计,这也正是本书的出发点。 1.1 GPU与并行计算机 自2003年以来,半导体行业在设计微处理器时形成了两个主要方向[Hwu,2008]。多 核(multicore)方向试图把串行程序移植在多核上,运行时仍然能保持串行程序的执行速度。 多核时代从双核处理器开始,内核的数量大致随半导体生产工艺的改进而翻倍。目前多核 处理器最好的例子就是Intel公司生产的酷睿i7系列微处理器,它的处理器有4个内核, 每个内核都是独立的、多指令流出的微处理器,每个内核能执行x86指令集中的所有指令: 每个处理器由两个硬件线程来支持超线程,这种设计使得串行程序的执行速度得以最大化。 相比之下,众核(many-core)方向则更侧重于执行并行应用程序时的吞吐量。众核由大