内容简介本书是每个软件开发人员学习并行编程的权威教程,书中并没有过多地介绍理论,而是给出了并行程序员所面临的一些挑战及其解决方案,并对当前现实中的并行API的用法给出了一些实例。书中引入了一种完整的、易于访问的模式语言,帮助任何有经验的开发人员编写高效的并行代码。通过学习本书,读者将意识到模式是掌握并行编程的最佳方式。本书不仅适用于大专院校计算机科学相关专业的师生,而且也特别适用于各类软件开发人员。
前 言 当您把它盖好了,他们就会出现。(“If you build it,they will come”,这句话是凯文科斯纳在成名片Field of Dreams里面的知名对白,片中主角相信如果他盖好了棒球场,黑袜事件的主角就会出现。他也相信只要把玉米田推掉,盖成棒球场,他家就是天堂!) 我们构建了多处理器工作站、超大规模并行巨型计算机、位于每一个部门中的集群,但针对这些奇妙机器进行编程的程序员们却还没有出现。少数乐于迎接挑战的程序员已经证明:大多数类型的问题可以采用并行计算机解决,但普通程序员,特别是那些生活得很好的专业程序员,他们忽略了并行计算机。他们这样做,是一种冒险。并行计算机正在逐渐成为主流。多线程微处理器、多核心CPU、多处理器PC、集群、并行游戏控制台……,并行计算机正逐渐占领整个计算世界。计算机行业准备向整个市场推出能够全速运行并行程序的硬件。但谁将编写这些程序呢? 这是一个老生常谈的问题。即使在20世纪80年代早期,当“killer micros”开始攻击传统的向量巨型计算机时,我们极度担心如何吸引普通的程序员编写并行程序。我们尝试了所有能够想到的方法:高级硬件抽象、隐含的并行编程语言、并行语言扩展和可移植的消息传递库。但是,在经过多年的努力之后,事实是“他们”并没有出现。绝大多数程序员都并不致力于并行软件的编写。 常见的观点是:您不能将新技巧告诉老的程序员,因此直到老的程序员逐渐退出、新一代的程序员出现时,这个问题才能够得到解决。 但我们不接受这种悲观主义思想。多年以来,程序员在采用新的软件技术方面已经表现出了非凡的能力。看一看众多的Fortran老程序员现在正在编写完美的、具有高级的面向对象设计的Java程序,我们就知道了这一点。问题并非出在老程序员身上而是出在老的并行计算专家身上和他们采用的创建一个能够容纳并行程序员的池子的方式。 这正是本书的切入点。我们想抓住优秀并行程序员如何思考并行算法的本质,并以一种专业程序员能够乐于掌握的方式提供对这种本质的理解。我们完成这个任务所采用的技术是一种模式语言。之所以这样选择,不是因为我们想设计模式,以寻找一种新领域,而是因为模式已经被证明为适用于并行编程。例如,模式在面向对象设计领域非常高效。它们已经提供了一种专家能用于讨论设计元素的通用语言,并且能够帮助程序员高效地掌握面向对象的设计。 本书包含了并行编程模式语言。书中的前两章介绍了并行计算中的一些主要概念,这两章集中介绍了用于模式语言的一些并行计算概念和术语,而不是详尽介绍整个领域。在后4章中介绍了模式语言本身,分别讲解了创建一个并行程序的如下4个阶段: ● 寻找并发性 程序员工作于问题领域,识别能够应用的并发性,并用于算法设计中。 ● 算法结构 程序员工作于高级结构,组织一个并行算法。 ● 支持结构 将算法转变为源代码,考虑如何组织并行程序,并考虑如何管理共享数据的技术。 ● 实现机制 最后一步是寻找特定的软件构造,实现并行程序。 这些模式构成了4个设计空间,它们是紧密相联的。从顶部(寻找并发性)开始,依次经历每一种模式,到达底部(实现机制)时,您将获得并行程序的一个详细设计。 如果目标是一个并行程序,您所需要的就不只是一个并行算法。您也需要一种编程环境和一种用于解释程序源代码中的并发性的符号。程序员过去曾经面对大量混淆的并行编程环境。幸运的是,随着时间的推进,并行编程团体已经聚合为3种主要的编程环境: ● OpenMP 一种简单的语言,它扩展了C、C++或Fortran,主要为共享存储器计算机编写并行程序。 ● MPI 一种消息传递库,用于集群和其他分布式存储器计算机。 ● Java 一种面向对象的编程语言,它具有支持共享存储器计算机上的并行编程的语言特征,并具有支持分布式计算的标准类库。 许多读者可能已经熟悉这些编程语言中的一种或几种,但为了方便那些对并行计算完全陌生的读者,我们在附录中介绍了这些编程环境。 我们已经在这种模式语言上花费了多年的时间。现在将其归纳为一本书,这样人们就能够使用它,这对于我们来说,也是一件令人兴奋的开发,但并不是这种努力的结束。我们期望其他人有他们自己的思想,能够提出用于并行编程的更好的新模式。我们确信可能遗漏了某些重要特征,这些特征实际上从属于这种模式语言。我们欢迎变更,期望能够有更大的并行计算团体重述这种语言。以后我们将继续更新并改进这种模式语言,直到它真正代表并行计算社区的一致观点。我们将开展实际的工作——使用这种模式语言指导创建较好的并行编程环境,并帮助人们使用这些技术,以编写并行软件。我们将永不停歇,直到串行软件已经非常稀少的那一天。 ——Tim Mattson,Olympia,Washington,2004年4月 ——Beverly Sanders,Gainesville,Florida,2004年4月 ——Berna Massingill,San Antonio,Texas,2004年4月