前言



近年来,并行编程技术的发展非常迅速,与此同时,社会对并行编程技能的
需求和应用也日益广泛,这主要受到以下几方面因素的推动:首先,多核/众核
处理器、GPU、深度学习处理器等新型体系结构快速发展,其编程方法与传统并
行编程相比有较大的差异,这推动并行编程模型及编程语言/接口出现了诸多变
化;其次,人工智能、云计算、大数据分析等新兴应用对并行计算有着很高的要
求,推动并行编程的应用领域从传统的科学/工程计算向更多的领域拓展;最后,
高性能计算机系统的规模不断增大,异构体系结构已成为主流,这使得高性能应
用软件的并行规模(进程/线程个数)越来越大,且需要适配多种异构体系结构,
给大规模并行程序的编写提出了更高的要求。

目前,国内很多高校都开设了“并行程序设计”和“并行计算”课程,但缺
少系统地、全面地介绍并行编程语言/接口的教材,这也是本书的编写初衷。与已
有的一些并行编程教材和参考书相比,本书在内容编写上注重体现以下几个特点。

1. 注重编程能力训练

编程类课程的首要目标不是让学生记住多少概念或者接口函数,而是真正掌
握编程技能,在面对实际问题时,能够编写满足需求的并行程序。有鉴于此,本书
在介绍并行编程语言/接口时,同步给出了很多示例程序。例如,在介绍并行接口
函数时,除了介绍函数功能和参数外,还给出了调用该函数的示例代码,这种代码
虽然只有几行,但可以帮助初学者更清晰地了解如何在程序中使用该函数;又如,
在介绍每种编程语言/接口的过程中,穿插介绍了多个相对完整的示例程序,可以
帮助读者了解如何在程序中综合使用并行编程接口。此外,每章所附的习题也以编
程为主,考虑到编写完整程序的工作量较大,很多习题只要求写出代码段落,以此
帮助读者掌握并行编程接口的实际用法。

2. 体现编程语言的新特性

一方面,本书在介绍OpenMP、Pthreads、MPI等较为成熟的编程语言/接口
时,注意体现这些语言/接口的新特性,如OpenMP中的task构造、MPI如何使
用多线程,以及单边通信接口等;另一方面,本书单独用一章内容介绍了主流的
CUDA、OpenCL、OpenACC异构编程接口,帮助读者全面了解新型异构体系结
构的并行编程方法。

3. 反映自主高性能处理器的并行编程

我国超算技术在近年来取得了长足的进步,基于自主高性能处理器的高性能



并行程序设计

VIII

计算机系统已经达到世界领先水平。为了满足国内并行编程用户在国产超算系统上编程的
需求、推动国产超算应用生态发展,本书在异构系统并行编程这一章中专门介绍了申威处
理器的Athread编程接口,以及OpenACC在申威处理器上的编程方法。

4. 以简单易懂的方式阐述算法

数值算法不是本书的核心内容,要了解这方面的内容通常可以学习独立的课程和专门
的教材,但在介绍并行编程时,不可避免地会涉及多种常用数值算法。有鉴于此,本书第
6章介绍了一些典型应用算法,考虑到本书的读者主要来自计算机专业,在编写这部分内
容时编者遵守“重在掌握算法思路和原理”的原则,尽量避免算法的形式化描述、推导、
证明等相对晦涩的表述,而试图用相对简单易懂的方式阐述算法原理,以近年来在稀疏线
性方程组求解中应用广泛的共轭梯度法为例,要全面介绍算法的形式化描述、推导及证明
需要使用大量的篇幅,但这反而会影响读者了解这种算法的思路和原理。

下图显示了各章之间,以及它们与并行计算系统之间的关系。总体上编者建议教师按
照第1~6章的顺序开展教学,第6章中部分算法的内容在前面几章已有所涉及,如矩阵乘
法、LU分解等。因此,可以在讲授第2~4章时结合并行应用算法展开这部分内容,或者
将之与编程习题相结合。需要注意的是,第2~4章教学过程中宜选择相对简单的并行应用
算法,以使学生集中精力学习和掌握各种编程语言/接口的使用和编程方法。



随着逐渐成稿,本书先后两年作为北京航空航天大学计算机学院的研究生专业课“并行
程序设计”的内部讲义被使用。在此过程中,多名博士生和硕士生参与了编写工作,包括林
放、孙庆骁、刘静怡、唐世泽、陈邦铎、程衍尚。在此对他们的辛勤工作表示感谢!本书的
立项和出版离不开钱德沛院士和清华大学出版社的大力支持,在此亦表示深深的感谢!

编 者

2024年1月