前 言探险家最重要的任务之一就是为后来者画一张地图。这对我们这些在科技领域不断开拓的人来说尤其如此。我们在本书中的目标是为那些刚刚开始学习并行和高性能计算的人以及那些想要扩大知识面的人提供一个路线图。高性能计算是一个快速变化的领域,其中的语言和技术一直在变化。出于这个原因,我们将关注长期保持稳定的基本面。对于用于CPU 和GPU 的计算机语言,我们强调跨许多语言的通用模式,以便你可以快速地为当前任务选择最合适的语言。本书的目标读者本书适用于本科阶段高年级的并行计算课程,也可以作为从事计算工作的专业人员的最新文献。如果你对性能感兴趣,无论是运行时间、规模还是处理能力,本书都将为你提供改进应用程序和超越竞争对手的工具。随着处理器达到规模、热量以及功率的极限,我们不能指望下一代计算机来加快运行我们的应用程序。越来越多的高技能和知识渊博的程序员对于从当今的应用程序中获得最大性能至关重要。在本书中,我们可以了解当今高性能计算硬件的关键思想。这些是为了性能而编程的基本真理。这些主题构成了整本书的基础。在高性能计算中,关键不在于编写代码的速度有多快,而在于代码运行的有多快。这一想法总结了为高性能计算编写应用程序意味着什么。
对于大多数其他应用程序,关注的重点是如何能够快速地完成编写应用程序的过程。如今,计算机语言的设计通常是为了提高编程速度,而不是提高代码的性能。虽然这种编程方法长期以来一直存在于高性能计算应用程序,但它还没有得到广泛的记录或描述。在第4 章中,我们将在最近被称为面向数据设计的编程方法中讨论这一点。一切都与内存有关:将多少内容加载到内存以及加载的频率。即使你知道可用内存和内存操作几乎总是性能的瓶颈,但我们依旧倾向于花大量时间考虑浮点操作。目前大多数计算硬件对于每个内存负载能够执行50 个浮点操作,因此浮点操作已经是次要的了。在几乎每一章中,我们都使用了STREAM 基准测试,这是一个内存性能测试,用来验证我们是否从硬件和编程语言中获得了合理的性能。如果加载一个值,则得到8 或16。这就像买鸡蛋一样。你不可能每次只买一个。内存负载由512 位的高速缓存行完成。对于8 字节的双精度值linux makefile,无论是否需要,都将加载8 个值。所以在编程过程中,让你的程序一次使用多个值而不是一个值,而且最好是使用8 个连续的值,这样可以获得最佳性能。如果代码中存在任何缺陷,并行执行时将暴露它们。与串行运行的应用程序相比,在高性能计算中需要更多地关注代码质量。
代码质量将贯穿整个并行化生命周期。使用并行化,你更有可能在程序中触发缺陷,而且还会发现调试并行程序更具挑战性,特别是在大规模使用并行的情况下。我们将在第2 章中介绍提高编程质量的方法,并在整个章节中都一直使用可以提高编程质量的工具,最后,在第17 章中,我们列出了其他优秀的用于提高编程质量的工具。这些关键主题不局限于硬件类型,对于CPU 环境和GPU 环境都同样适用。同时支持CPU 与GPU 是因为在现实中运行高性能程序往往受到物理硬件的限制,不可能所有的硬件都有GPU 环境。本书内容的基本路线图这本书并不要求你具备任何并行编程的知识,但希望你最好是一位熟练的程序员,并且熟悉高性能编译语言,如C、C++或Fortran;同时也希望你对计算术语、操作系统基础知识和网络有一定的了解,并且能够完成其他的计算机操作,比如安装软件和完成轻量化的系统任务管理。计算硬件的知识或许是对读者最重要的要求。我们建议打开计算机,查看每个组件,并了解其物理特性。本书由组成高性能世界的以下四部分组成。● 第Ⅰ部分:并行计算介绍(第1~5 章)● 第Ⅱ部分:CPU:并行的主力(第6~8 章)● 第Ⅲ部分:GPU:加速应用程序运行(第9~13 章)● 第Ⅳ部分:高性能计算生态系统(第14~17 章)本书设计的主体顺序是面向处理高性能计算项目的人员。
例如,对于应用程序项目,在项目开始之前,了解第2 章中介绍的软件工程主题是必要的。一旦软件工程就位,接下来就要决定数据结构和算法。然后是使用CPU 或GPU 进行实现。最后,为应用程序使用并行文件系统或高性能计算系统的其他特有特性。另一方面,我们的一些读者对获得并行编程的基本技能更感兴趣,可能想直接进入MPI 或OpenMP 章节。今天,并行计算的技术如此丰富,所以不要止步于此。比如从可以将应用程序的速度提高一个数量级的GPUunix网络编程 电子书,到可以提高代码质量或指出需要优化的代码段的工具——潜在的收益仅受你的时间和专业知识的限制。如果你将本书作为并行计算课程的教材,那么本书所提供的内容足够支撑两个学期的时间。你可将本书当作并行与高性能计算的知识集合linux vi命令,可根据自己的情况来选择学习的主题,并制定课程目标,比如下面列出的自定义学习目标的例子:● 第1 章提供了并行计算的介绍。● 第3 章讲解测量硬件和应用程序性能的方法。● 第4.1~4.2 节描述面向数据的编程设计概念、多维数组和缓存基础知识。● 第7 章讨论OpenMP(Open Multi-Processing)以获得节点上的并行性。● 第8 章介绍消息传递接口(Message Passing Interface,MPI)unix网络编程 电子书,用于实现跨多个节点的分布式并行。
● 第14.1~14.5 节介绍关联性与流程布局的概念。● 第9 章和第10 章描述了GPU 硬件和编程模型。● 第11.1~11.2 节主要介绍如何使用OpenACC 让应用程序在GPU 上运行。你可以将算法、向量化、并行文件处理或更多GPU 语言等主题添加到上面的列表中,也可以删除某个主题,以便将更多时间花在其他主题上。还有一些额外的章节将吸引学生继续探索并行计算的世界。关于代码如果不实际编写代码并运行它,就无法学习并行计算。为此,我们在书中提供了大量的例子。这些例子可扫描封底二维码下载。你可以下载这些示例的完整集合或单独按章节进行下载。在这些示例代码、所涉及的软件和硬件当中不可避免地会有缺陷和错误。如果你发现了错误或不完整的内容,我们鼓励你对示例进行反馈。我们已经合并了一些来自读者的更改请求,对此我们非常感激。此外,源代码存储库是查找修正和讨论源代码的最佳地方。参考资料和习题答案可扫描封底二维码下载。软件与硬件需求也许并行和高性能计算的最大挑战是所用到的广泛的硬件和软件。在过去,这些专门的系统只能在特定的环境下使用。最近,硬件和软件变得更加大众化,甚至在台式机或笔记本电脑上都可以广泛使用。
这是一个重大转变,可让高性能计算程序更容易开发。然而,硬件和软件环境的设置仍然是该任务中最困难的部分。如果你可以访问已经配置好的并行计算集群,我们鼓励你利用它。最后,你可能希望设置自己的计算环境。这些示例在Linux 或UNIX 系统上是最容易使用的,但许多情况下也可在Windows 和macOS 上运行,只是需要做一些额外更改。如果你发现某个示例不能在系统上运行,我们提供了Docker 容器模板和VirtualBox 设置脚本作为替代方案。关于GPU 的练习,需要使用来自不同硬件制造商的GPU,包括NVIDIA、AMD Radeon 和Intel。安装GPU 图形驱动程序仍然是设置本地运行环境遇到的最大困难。一些GPU 语言也可以在CPU上工作,从而允许在本地环境中为你没有的硬件开发代码。你可能还会发现在CPU 上调试更加容易,但是为了看到真实性能,你还必须安装GPU 硬件。其他需要特殊安装的示例包括批处理系统和并行文件示例。为了更加接近真实情况,批处理系统需要在多台笔记本电脑或者工作站上进行设置。类似地,并行文件示例最适合使用像Lustre 这样的专门文件系统,但其他的基本示例可在单独的笔记本电脑或工作站上运行。
关于封面插图本书封面上的人物插图标题是M’de de brosses à Vienne,即《维也纳的刷子销售商》。该插图取自 Jacques Grasset de Saint-Sauveur(1757—1810 年)收集的各国礼服画集,名为Costumes de Différents Pays,于1797 年在法国出版。其中的每幅插图都是经手工精细绘制并上色的。Jacques Grassetde Saint-Sauveur 丰富多样的收藏生动地提醒我们,仅在200 年前,世界上的城镇和地区在文化上存在很大的差异。那时,人们彼此隔绝,说着不同的方言或语言;无论是在街上还是在乡下,只要看他们的衣着,就很容易看出他们住在哪里,从事什么职业或处于什么地位。从那时起,我们的着装方式发生了变化,当时非常丰富的地域多样性已经消失。现在,已很难区分不同国家的居民,更不用说不同的城镇或地区了。也许我们已经用文化的多样性换取了更多样化的个人生活——当然,指的是更多样化和快节奏的技术生活。在当前这个电脑书籍同质化严重的时代,Manning 出版社用两个世纪前地区生活的丰富多样性的书籍封面来庆祝电脑行业的发明创造和首创精神,这些书被Jacques Grasset de Saint-Sauveur 的图片重新赋予了生命。
more >