本书由戈登·贝尔奖获得者及其团队撰写,为高性能计算的入门读者构建了多路径的学习曲线,夯实基础的同时注重培养实践技能。书中首先介绍基础知识,包括执行模型、体系结构、性能度量、商品集群等;接着讲解吞吐量计算、共享内存计算、消息传递计算和加速GPU计算,围绕这些模型的概念、细节及编程实践展开讨论;然后引导读者构建重要的程序,涵盖并行算法、库、可视化及性能优化等;最后,考虑真实系统环境,讨论了操作系统、大容量存储、文件系统及MapReduce算法等。
本书的目的
高性能计算(HPC)是一个多学科领域,结合了硬件技术和架构、操作系统、编程工具、软件以及最终用户问题和算法。为了有能力参与HPC活动,需要一些必要的概念、知识和技能,通常需要在相关机构进行学习,这些机构拥有专家、设施和任务目标,但这样的机构并不太多。无论一个人的目标是与特定的最终用户领域(如科学、工程、医学或商业应用)相关联,还是专注于使超级计算有效地支持系统技术和方法,入门级从业者必须紧密结合广泛的、清晰的且相互关联和依存的领域,而且需要了解其协同作用才能领悟这些专业知识。学习材料可能很容易就找到十几本书和手册,但即使它们组合在一起,也无法提供充分体现整个领域的必要视角,无法成为指导学生获得足够专业知识的有效途径。
本书旨在弥合无数狭隘的焦点问题来源与跨越和互连各种学科(构成HPC领域)的单一来源需求之间的差距。它是一本入门级读物,需要最少的预备知识,提供了对这些领域及其相互影响(使超级计算成为一个跨学科领域)的完整理解。从实践的角度来看,本书针对并行编程、调试、性能监控、系统资源使用和工具以及结果可视化等有用的技术来培养读者的特定技能。这些技能涉及的基础概念相对而言变化较小,而关于硬件和软件系统组件的详细属性的知识更有可能随着时间的推移而发展。
本书支持单学期课程,以便初学者为超级计算中的各种角色做好准备,实现他们所选择的职业目标。它适合致力于使用超级计算机来解决科学、工程或社会领域等应用需求的未来的计算科学家。它为系统设计人员和工程师提供硬件和软件的可能目标功能的基本描述。对于希望研究超级计算本身的研究人员,作为传统系统和实践的介绍性演示,以及作为这个激动人心的探索领域面临的挑战的代表,本书也是一本基础读物。本书同样适合那些为超级计算环境提供技术支持的人员,例如数据中心和系统管理员、操作员和管理人员。在提供给未来的专业人员时,本书可以以多种方式来使用。它可为超级计算提供基础信息,为课堂教学提供一系列讲座内容。它使用大量示例来说明实际操作方法,所有这些都可以在并行计算机上执行,以及在实践时指导学生进行练习。它通过易于学习的风格明确了技能组合和训练方法。概念以详细且易于理解的形式呈现,以揭示方法背后的“原因”,并根据基本事实、相关因素和敏感性协助未来用户进行决策。最后,本书在同一上下文中统一了与多个子学科相关的许多事实,这些子学科组合构成了超级计算领域。
本书的组织结构
本书可以满足读者最初的好奇心、兴趣和参与HPC活动所需技能要求,通过学习本书,可以最终搭建起知识、能力和熟练程度之间的桥梁。对于追求各种潜在专业路径的人来说,本书是一个起点,其中这些路径在先进系统的性质和用途方面具有共同的基础。无论读者是否最终能够搭建硬件或软件系统,他们都能使用此类系统作为追求科学、工程、商业或安全等其他领域的关键工具来进行研究,从而有助于设计和推动支持当前HPC发展的未来方法,或管理、经营和维护供其他用户使用的HPC系统。本书的各个章节构成了一个无缝的主题流,每个主题都可以从前导主题中受益,同时也为后续主题提供基础。因此,本书按HPC使用的早期基本技能的顺序讲解主要主题,即使有可能过早涉及需要深入理解这些复杂系统及其使用才能掌握的基础概念。必要时,书中会给出主题的介绍性描述,其中包含足够的信息以帮助读者了解其他相关的主题,但只在后面的章节中进行更深入的回顾。通过学习多样化的相互关联的主题领域,读者的理解力和能力可以逐步增强。
本书是关于计算性能的。对于当前和下一代系统,这意味着可以利用工作负载并行性来实现可扩展性和管理数据的方法,从而实现操作效率。下面列出了4个主要的总体主题领域。
系统硬件架构和支持技术。
编程模型、接口和方法。
系统软件环境、支持和工具。
并行算法和分布式数据结构。
基于逻辑流程,本书给出了一目了然的教学组织结构。但HPC还有另一个方面:组织与协调并行性和数据管理的替代策略,以及有助于每个组件层的角色。
本书介绍了4种主要策略。
作业流并行性、吞吐量或容量计算。
顺序进程的通信或消息传递。
多线程共享内存。
SIMD或图形处理单元(GPU)加速。
从教学角度来看,作者希望传达三种信息以促进学习过程,并希望也能让读者得到享受。基础层面是概念,建立对基本原则的理解以帮助学习HPC的形式和功能。接下来会介绍许多基本信息及文化(什么人、什么事情、什么时候),这些事实构成了必要的知识集合,提供了该领域的框架。最后讲授一些实践技能。诚然,这三个层面彼此并不交叉。在每种情况下,本书都将案例的所有材料以这三种形式之一的方式来呈现。例如,标题以“的基础”结尾的章节(例如“OpenMP的基础”)被精心设计为具有教程演示风格的模块,以便简化学习。虽然概念和知识的混合是不可避免的,但是我们会单独强调其中的一项。这种区别的重要性在于,虽然关于这个快速发展的领域的大部分知识将会改变,甚至在某些情况下已经过时,但基本概念随着时间的推移而保持不变,即使某些特定机器或语言的细节可能变得无关紧要,但这些知识也将帮助读者加强对相关领域的长期理解。
本书首先根据4个独立的并行计算模型来组织章节,然后根据基本概念对每个模型展开讨论,重点关注支持它们的系统体系结构的相关知识,以及针对每类系统进行编程的相关技能。在准备本书内容时,一些初始材料(包括介绍性章节)构成了本书的基本前提和背景。4个并行计算模型中的每一个都是根据概念、知识细节和编程技巧来描述的。虽然本书涵盖了理解和编程HPC系统所需的大部分有用信息,但忽略了与环境和工具相关的一些交叉主题,这些主题也是系统完整上下文的一个重要甚至普遍的方面。但是,对这些主题的介绍超出了初学者学习的范围。毕竟,本书目的是为读者提供高效的工作能力,以便在专业工作场所利用超级计算机实现各种目的。因此,本书以有效的顺序给出了许多重要且有用的工具和使用方法。最后,读者可以清楚地了解HPC应用的广泛领域,并且在这个背景下选择贴合本书的主题。这可以用来指导未来的计划,以及根据读者的最终职业目标选择更高级的课程。本书的总体结构和流程总结如下。
Ⅰ.绪论和基本思想(第1~4章)
这些章节介绍基础知识,主要包括:执行模型,体系结构的概念、性能和并行度量,以及并行计算系统(商品集群)的主流类型等。通过使用专门的基准测试程序来提供运行并行程序的初次实验,这些基准测试程序可以在不同的HPC系统之间进行测量和比较。正是在这些章节中,我们首先为读者营造了一种历史感,帮助初学者了解对领域有贡献的思想演变过程以及该领域的文化。
Ⅱ.针对作业流并行的吞吐量计算(第5章和第11章)
在利用并行计算机的最简单方法中,广泛使用的吞吐量计算(也称为容量计算)足以满足许多目标和工作流。可以证明它是效率最高的,因为它通常表现出最粗粒度的任务和最少的控制开销。我们将介绍管理作业流工作负载时广泛使用的中间件,如SLURM和PBS,包括独立作业和相关集的管理等案例,例如参数扫描和蒙特卡罗模拟应用程序。
Ⅲ.共享内存的多线程计算(第6章和第7章)
用户并行处理的主要模型之一是共享内存上下文的任务(或线程)并行。所有用户数据都可以由任何用户线程直接访问,并且顺序一致性由硬件高速缓存一致性来保证。本书的这部分描述了这种并行执行模型、共享内存多处理器的特性以及OpenMP并行编程语言。
Ⅳ.消息传递计算(第8章)
对于可在单个应用上使用100万个或更多个处理器核的真正可扩展并行计算而言,分布式内存架构和顺序进程执行模型间的通信是主流方法。本书的这部分建立在一些主题的基础之上,包括用于SMP的节点,以及先前针对吞吐量计算描述的集群方法等,并添加了消息传递、聚合操作和全局同步的语义。这一章介绍了消息传递接口(MPI),这是最广泛用于可扩展科学和工程应用的编程接口。
Ⅴ.加速GPU计算(第15章和第16章)
对于某些广泛使用的数据流模式,专用核心的更高级结构可以提供卓越的性能和能源效率。这种在最一般意义上被分类为“加速器”的子系统可以多次加速应用程序,有时可以获得超过一个数量级的加速。这些加速器也被称为GPGPU,它们通常采用附加阵列处理器的形式,但在某些情况下集成在单插槽封装甚至相同的芯片中。本书的这部分描述了GPU结构、可用产品和编程,重点是编程接口OpenACC。
Ⅵ.构建重要的程序(第9、10、12~14章)
至此,读者要非常了解HPC的主要模式,了解主要编程接口的规则,并具有在这些框架内使用基本并行函数的实践经验。但是对于更复杂、更尖端、更有用或者说更专业的超级计算程序来说,还需要许多其他方法和工具。本书的这部分会将HPC新手从初学者级别提升到有一定能力的学徒级别。这里介绍了几个关键主题和技能,帮助学生掌握关于系统设计和应用的必要能力。在这些技能之中,首要的是针对各种需求的各类并行算法。其中许多已经在称为“库”的集合中提供了,如果使用得当,它们可以为应用程序开发人员节省大量时间。要使程序从初稿发展到最终正确有效的形式,需要采用并行调试的组合方法,以通过操作监控来确定答案的正确性和性能优化。这里介绍了有关工具和方法,包括所需的详细技能组合。最后,HPC运行往往会在单次执行中产生大量的数据,多达太字节(terabyte,即1012字节)或拍字节(petabyte,即1015字节)。从大量数据集生成图像甚至视频的科学可视化,是我们了解计算的模拟结果的唯一实用方法。本部分提供了用于此目的的广泛使用的工具示例,并对其基本技术进行了说明,使读者能掌握用法。
Ⅶ.使用真实系统(第11、17~20章)
HPC系统并不是在真空中运行的,如果不与外界连接则没有什么价值。在本书中,读者可以看到系统环境的必要部分,这些章节对操作系统及其与外部世界的接口进行了有针对性的全面描述。特别是在硬件和软件级别描述了大容量存储,它通过文件系统持久存储大块数据。作为使用文件系统的示例,我们详细描述了MapReduce算法,它对于大数据问题非常流行。文件系统还可通过检查点-重启方法提高可靠性。在系统可能发生故障的情况下,该技术周期性地将应用程序的中间数据状态的快照存储在大容量存储器上。如果发生这种情况,应用程序可以不必从头开始重新启动,而是在最后一个已知的良好检查点重新启动,从而节省了大量时间来获得解决方案。
Ⅷ.下一步(第21章)
到了这里,读者已经学完了关于HPC的介绍性内容,但是接下来去哪里?这些系统及其应用领域还有很多,可以纳入任何单独的教科书中,本书已经做了很好的铺垫工作。学生可以清楚地了解前面的内容,并根据个人的兴趣或目标,明确下一步要了解哪些方面。这一章列出了超出本书范围的HPC领域,并突出了与不同专业目标相关的不同领域。但是接下来还有另一个方面:HPC领域会走向哪里?因为这一领域正在迅速变化,本章最后概述了HPC面临的挑战及推动它继续发展的机遇。
目标读者
本书面向具有不同背景的广大读者,希望每个人都能够成功地学习这些主题。具有C语言编程知识是最基本的先决条件,并且需要熟悉类UNIX操作系统,而且能操作。但据了解,这些要求对某些人来说可能过于严格。因此,本书的附录包括两个教程。附录A讲解C编程语言,包含足够多的细节知识。但它并不是计算机编程的入门读物,因为我们预期读者有使用Python、Java、Fortran或MATLAB等其他编程语言编写程序的经验。附录B提供了完成本书中所有任务所需的用户界面相关知识和技术。
本书可为广泛的读者群体提供服务,包括(但不限于):
研究科学家。
科学、工程和社会领域的计算科学家。
HPC研究人员。
未来的工程师和HPC系统开发人员。
HPC系统管理员和数据中心经理。
如何使用本书
本书旨在根据特定读者的需求,提供多种不同的学习和讲授方法。
要想一开始就对HPC有全面深入的了解,可以从头到尾阅读本书。本书章节的顺序是经过精心组织的,每章都建立在前几章的基础上,涉及相关的概念、知识和技能。文中的示例足以代表这些知识点,以便读者顺利掌握。
另一方面,可以阅读以“的基础”为标题的章节,以将本书作为一本教程来学习。这些章节旨在以最少的背景和上下文信息培养读者的技能。
通过选择关键章节可以实现重点阅读。本书呈现了4种并行计算模型:吞吐量、消息传递、共享内存和基于加速器。但在某些情况下,读者或教育工作者只需要了解其中一个,因此读者可能只需要沉浸在所需章节的子集中。例如,课程可以使用OpenMP或MPI,但不需要同时使用两者。对于基本的作业流并行,这两者都可以跳过,而是专注于SLURM或PBS进行吞吐量计算。