人工智能中的并行与高性能计算——高性能计算架构导论

245 阅读41分钟

1.1 引言

高性能计算(HPC)作为一个专门领域,主要关注当时处理能力最强的机器,即超级计算机。传统上,每年会有两次评选,用以揭示全球处理能力最顶尖的计算机,这些结果发布于TOP500榜单[1]。随着处理速度需求的不断增长,大多数专家主要关注的领域是并行计算和高性能计算。随着机器学习(ML)、人工智能(AI)和深度学习(DL)时代的到来,高性能计算的发展也在发生变化,因此HPC成为研究的必要方向。我们无法忽视云计算带来的巨大变革。许多云服务商投入巨资开发大规模的高性能计算系统[2]。由于云系统可通过互联网便捷访问,在大多数应用领域,现今更多使用云环境执行任务,而非传统的专用高性能计算服务器。许多新的应用程序和硬件系统已成功设计用于云环境中的高性能计算应用程序。过去几十年间,大部分超级计算机逐步配备了更新的硬件支持系统,如现场可编程门阵列(FPGAs)、图形处理单元(GPUs)、量子处理器和存内处理(PIM)。借助这些异构支持系统,科学领域中的能源需求和应用性能都发生了显著变化。

1.2 高性能计算架构

高性能计算的最早发展可追溯到1975年Cray-1的推出[3]。此前,HPC的主要目标是学术研究和许多需要定制处理器、操作系统及编译器的工程应用。高性能计算架构的演进伴随着硬件和系统设计的重大进步,这些进步推动力来自对计算能力和效率日益增长的需求。HPC架构演化的关键阶段包括:

1.2.1 大型机与早期超级计算机(1950年代–1960年代)

大型机是最早期的高性能计算系统之一,主要聚焦于科学和商业应用中的大规模数据处理。1950年代,诸如Control Data Corporation (CDC) 6600等早期超级计算机问世,该机是首台达到千兆浮点运算性能的计算机。图1.1展示了大型机的集中式架构及早期超级计算机的矢量处理能力。大型机强调为通用计算共享资源,而早期超级计算机则专注于用于科学计算的专用处理器和高速互连。

在大型机和早期超级计算机时代,高性能计算见证了强大计算系统的发展,这些系统专为处理复杂且计算量巨大的任务设计。大型机以处理商业和管理类通用计算为主,早期超级计算机则专用于科学和工程计算。其架构多为集中式,配备单个强大处理器和共享内存,支持多用户并发访问数据。它们运行专有操作系统,针对可靠性和事务处理进行了优化,系统可扩展以应对大量事务,重点关注系统的可靠性和高可用性。大型机设计包含冗余组件和容错机制,主要用于银行、金融和大规模数据处理领域。

早期超级计算机则专门针对科学、工程和研究计算,采用矢量处理架构以高效处理数学运算,具备并行处理能力以实现任务的同时执行。这些系统通常运行专门为科学计算定制的操作系统,虽然扩展性不及大型机,但针对特定负载和紧耦合的并行系统进行了性能优化。它们使用矢量处理器快速执行重复数学操作,适合于模拟、天气建模及其他科学模拟。

大型机的特点是集中式处理能力,由单个大型计算机系统处理复杂的计算和数据任务。早期超级计算机如CDC 6600,采用类似的集中式处理模型,但更侧重于为科学研究应用实现高性能。大型机和早期超级计算机均采用为特定应用定制的硬件架构,常用于科学模拟、数学建模和数据密集型任务。以CDC 6600为例,其独特的矢量处理架构专为高效科学计算设计。早期超级计算机使用单指令多数据(SIMD)架构,可通过单一指令并行处理多个数据点,实现科学计算中的任务并行。Cray超级计算机等矢量处理器则是SIMD架构的典型代表,支持数据数组的并行处理。

大型机和早期超级计算机主要服务于科学研究和大规模计算,应用于国家实验室和科研机构,承担天气模拟、核模拟和航空航天工程等任务。该时期的计算范式主要是批处理模型,用户提交批量作业,系统按序处理,重点在于高效利用计算资源完成大规模科学计算。大型机和早期超级计算机的访问权限有限,通常仅供经过专业培训的研究人员和科学家使用。与这些系统交互需要深入理解当时的硬件及编程语言。此期间开发的编程语言为科学计算奠定基础,FORTRAN(公式翻译)和汇编语言是主要的编程工具。科学家和工程师使用这些语言开发算法和模拟程序,发挥大型机和超级计算机的计算能力。

大型机和早期超级计算机建设和维护成本高昂,主要目标是实现科学和工程应用的高性能,成本限制了其普及,但它们成为推动科学进步的重要工具。

image.png

1.2.2 矢量处理器(1970年代–1980年代)

矢量处理器开始崭露头角,能够对数组中的元素进行并行处理。1976年推出的Cray-1是著名的矢量超级计算机之一。这一时期出现了专门设计用于高效处理科学和工程模拟的矢量处理架构。这类处理器能够执行矢量操作,即对多个数据元素同时执行相同的操作。

这些处理器的主要组成部分包括内存子系统,用于管理数据存储和访问。矢量寄存器和标量寄存器分别用于存储矢量数据元素和单个数据元素(标量)值。矢量算术逻辑单元(ALU)执行矢量化的算术和逻辑操作,而标量ALU负责标量算术和逻辑操作。矢量流水线以流水线方式执行矢量指令实现并行处理,标量流水线以流水线方式执行标量指令。矢量处理器突破了标量处理的限制,实现了一条指令对多个数据元素的同时执行。这种矢量处理范式非常适合处理涉及大规模数据集的科学和数学计算。

Cray Research在矢量处理器的发展中起到了开创性作用。1976年推出的Cray-1便是围绕矢量处理原理构建的典型超级计算机。Cray超级计算机以其独特的圆柱形设计和矢量寄存器架构闻名,能够高效执行矢量操作。矢量处理器常采用流水线技术以增强并行性。流水线技术允许多条指令错落执行,提升整体吞吐量。流水线中指令执行阶段的重叠,缩短了单条操作的完成时间。

矢量处理器在科学和工程应用中表现尤为出色,如数值模拟、天气建模和有限元分析。矢量操作能力加速了科学研究中常见的数学算法处理。为支持高效的数据流,矢量处理器设计时重点考虑了高内存带宽,这对科学计算的高性能至关重要。矢量处理器允许程序员指定矢量长度和步幅,使其能灵活处理不同类型的数据结构。可变长度和步幅的矢量操作提升了矢量处理器的适用性。

矢量处理器的编程较为复杂,高效利用矢量指令需要深入理解硬件架构。软件必须针对矢量操作进行专门优化,才能充分发挥处理器性能。

该时代后期,逐渐出现了向并行处理架构的转变。虽然矢量处理器依然重要,但并行计算模型开始崭露头角。矢量处理的理念对后续高性能计算的发展持续产生影响,如SIMD架构和向量化技术以不同形式延续。

在此期间,国家在超级计算领域的竞争力常通过矢量超级计算机的性能来衡量。构建更快、更高效的矢量处理器成为提升计算能力的重点。矢量处理以其对并行性和数学运算的高效处理,在推动超级计算机能力提升方面发挥了关键作用,尤其是在科学和工程应用领域。

image.png

1.2.3 大规模并行处理(1980年代–1990年代)

随着大规模并行处理(MPP)系统的发展,向并行计算的转变逐渐加速。多个处理器协同工作,共同解决复杂问题。Connection Machine、Intel Paragon和Cray T3D是MPP架构的代表,它们通过并行性应对复杂计算任务。

图1.3展示了高性能计算中大规模并行处理系统关键组件的通用结构。主要组件包括内存子系统(存储),用于管理数据存储和访问。每个处理器(计算节点)可访问其本地内存。在MPP系统中,多个处理器同时工作,各自处理整体计算任务的一部分。所有处理器通过高速网络连接,支持处理器间的通信和数据交换。输入输出(I/O)子系统负责处理输入输出操作,将并行处理系统连接到外部设备和存储。

大规模并行处理的核心在于将计算任务分布到大量并行工作的处理器上,旨在克服单处理器系统的局限性,提高整体计算能力。MPP系统由多个紧密耦合的处理器组成,协同完成共同任务。处理器间通过高速互连实现通信和数据交换。MPP系统通常采用分布式内存模型,每个处理器拥有自己的私有内存。工作站间通过消息传递机制通信,使各自能独立处理问题的不同部分。

MPP架构设计注重可扩展性,支持通过增加处理器数量提升计算能力,适用于科学模拟、大规模数据处理等广泛应用。并行编程范式如并行虚拟机(PVM)和消息传递接口(MPI)在此时期日益重要,促进了能够高效利用并行系统能力的应用开发。

MPP系统通常包含多样化的处理器,每种处理器针对特定计算类型进行了优化,提升了处理各种负载的灵活性。MPP系统广泛应用于超级计算中心和研究机构,常用于大型科学模拟和计算。代表系统包括Cray T3D、Intel Paragon和IBM SP2。

MPP系统的编程复杂度较高,需要管理分布式内存并协调并行进程,开发者需适应新的编程模型以充分利用并行性。MPP支持数据级并行和任务级并行,前者将数据划分给多个处理器,后者将不同任务分配给各处理器。

该时期末期,MPP系统逐步向集群计算架构过渡。由商用现成组件(COTS)组成的集群提供了更具成本效益的替代方案,同时保持了并行处理能力。

MPP系统对科学研究产生了深远影响,推动了更复杂模拟、更大规模数据集处理的发展,促进了天气建模、天体物理、材料科学等领域的扩展。MPP系统在提升科学和研究应用的计算能力方面发挥了关键作用,为并行计算的后续发展奠定了基础。

image.png

1.2.4 集群计算与Beowulf集群(1990年代–2000年代)

商用现成组件(COTS)的广泛采用推动了集群计算的兴起。Beowulf集群于1990年代中期开发,基于廉价的商用硬件,并通过以太网互联。该时期标志着向经济高效的并行计算解决方案的转变。

集群计算,尤其是Beowulf集群,成为1990年代和2000年代高性能计算中的主流架构。这些集群利用多个互联的商用现成计算机的计算能力,实现并行处理功能。图1.4展示了高性能计算背景下Beowulf集群的简化框图。主要组件包括主节点,负责协调和管理整个集群的运行,处理任务分配、负载均衡和结果汇总。从节点为连接到集群的商用计算机,执行由主节点分配的并行处理任务。

image.png

Beowulf集群因其成本效益高且具备良好可扩展性,广泛应用于科学模拟、数据分析以及其他可并行处理的工作负载。图1.4展示了Beowulf集群关键组件的概念性结构。集群计算采用了商用现成硬件组件,如标准处理器、内存和网络设备,旨在为传统超级计算机提供经济实惠的替代方案。高速互连技术,如以太网或后来的InfiniBand,促进了集群中节点之间的通信。集群通常采用分布式内存模型,每个节点拥有自己的本地内存。消息传递(通常通过消息传递接口MPI实现)成为协调集群节点间并行进程的主流编程范式。

Beowulf集群由NASA和戈达德太空飞行中心的研究人员推广,成为集群计算的典范。Beowulf集群使用廉价硬件和开源软件构建,连接多个商用计算机组成高性能集群,实现并行处理和计算能力提升。通过增加节点数量,集群计算能力相应增强,因其架构具有极强的可扩展性。正是这种可扩展性,使得集群能适应广泛的计算工作负载。

开源软件栈是集群计算的显著特征。Linux操作系统结合消息传递接口(MPI)和并行虚拟机(PVM)等工具,构成了构建和管理集群的应用软件基础。集群中采用并行虚拟化和负载均衡技术,有效分配计算任务,确保资源的最佳利用并提升整体性能。

集群计算以相较传统超级计算机更经济的方案,实现了高性能计算能力的普及。学术机构、研究实验室和工业界纷纷采用集群,用于多样化的应用。集群在数值模拟、数据分析、分子建模等多个科学和工业领域发挥了重要作用。集群的多功能性促进了其广泛采用。

网格计算的概念开始兴起,将集群的思想扩展到全球范围。网格将多个集群互联,支持地理分布区域的资源共享与协作。该时代末期,异构集群的发展趋势明显,开始引入图形处理单元(GPU)加速计算。GPU加速成为某些并行任务的标准做法。

集群计算在科研和工业应用的演进中扮演了关键角色,实现了性能、成本效益与定制便捷性的平衡。它为并行和分布式计算的持续发展奠定了基础。商用组件和开源软件的采用,推动了先进计算能力的普及,影响了广泛的科学、学术和工业应用领域。

1.2.5 对称多处理(1990年代–2000年代)

对称多处理(SMP)架构具有多个处理器共享公共内存空间的特性,支持并行处理并提升系统可扩展性。IBM POWER和Sun UltraSPARC服务器是应用于高性能计算和企业计算的典型SMP设计。

主要组件包括共享内存(RAM)、CPU、本地缓存和服务总线。共享内存是所有处理器均可访问的集中式内存,用于存储程序指令和数据。每个处理器拥有自己的CPU、缓存和内存总线。CPU负责执行指令,所有处理器均可访问并修改共享内存中的数据。处理器对共享资源具有平等访问权限,形成对称架构。处理器能够并发执行任务,从而提升整体系统性能。

SMP是一种共享内存多处理架构,多个处理器共享公共地址空间。所有处理器可以直接访问整个内存池,便于通信和数据共享。SMP系统具备良好的可扩展性,支持通过增加处理器数量提升计算能力,使其适应不同处理需求的应用场景。SMP系统通常具有统一内存访问(UMA)特性,即所有处理器访问共享内存中任意位置的时间大致相同,简化了编程和负载均衡。

在SMP系统中,所有处理器被视为对称,具有相同的资源访问权限并执行相同的指令集,这种对称性简化了编程模型。SMP系统要求操作系统能高效管理多个处理器并合理分配任务,现代操作系统如Linux和Windows均对SMP架构提供了强大支持。

SMP编程模型涉及将代码并行化以运行于多个处理器,常见方法包括多线程(线程在同一进程中并发执行)和多进程(多个独立进程并行运行)。SMP系统实现缓存一致性协议,以确保处理器缓存与共享内存间的数据一致性,避免多处理器访问共享数据时产生冲突和不一致。开发者利用并行库和编译器优化代码执行,充分发挥可用处理能力。

该架构被广泛应用于高性能计算集群的构建。多个SMP节点组成集群,形成更大规模系统,用于科学模拟、数值建模等并行计算任务。尽管SMP系统具备可扩展性,但其扩展性存在一定限制。随着处理器数量增加,资源竞争和性能收益递减等问题逐渐显现。

部分SMP系统配备矢量处理单元或单指令多数据(SIMD)架构,以增强并行性,这些单元允许处理器对多个数据元素同时执行相同操作。随着对更高可扩展性需求的增长,非统一内存访问(NUMA)架构开始崭露头角。NUMA是SMP的自然演进,通过更分布式的内存访问模型解决了可扩展性挑战。向更具扩展性的架构(如NUMA)的转变,体现了高性能计算系统的持续发展。

image.png

1.2.6 基于集群的超级计算机(2000年代至今)

高性能计算集群逐渐成为主流,充分利用了集群架构的可扩展性。诸如InfiniBand的互连技术提升了节点间的通信效率。IBM Blue Gene、Cray XT系列及现代超级计算机通常采用基于集群的架构以实现良好的可扩展性。

基于集群的超级计算机采用标准硬件组件构建,包括标准处理器、内存模块和存储设备,这与传统超级计算机常用的定制设计组件形成对比。集群通过高速网络互联,如InfiniBand或10/100千兆以太网,促进节点间的高效通信。高速互连对实现低延迟和高吞吐量的数据传输至关重要。

集群中每个节点独立运行,对整体任务的特定子集执行并行计算。这种节点级别的并行性使集群能够高效处理各种可并行化的工作负载。基于集群的超级计算机具有高度的可扩展性,通过增加节点数量,计算能力可以大幅提升。正因如此,集群能够适应多样的工作负载和计算需求。

集群采用分布式内存模型,每个节点拥有自己的本地内存。节点间通过消息传递进行通信,实现分布式架构上的并行处理。消息传递接口(MPI)是基于集群的超级计算机广泛使用的编程范式,允许开发者编写适用于分布式内存架构的并行程序,从而高效利用集群资源。

负载均衡在集群计算中至关重要,确保计算任务均匀分布在各节点上,有效提升整个集群的资源利用率。集群系统使用作业调度器和资源管理器,在多个用户和应用间分配计算资源,优化资源利用并保证用户的公平访问。

Linux已成为基于集群的超级计算机的主导操作系统。其开源特性、稳定性能及对广泛硬件的支持,使其非常适合集群环境。各类并行编程模型,如OpenMP和CUDA,应用于挖掘集群中各节点内的并行能力,作为MPI实现的分布式并行的有力补充。

基于集群的超级计算机常采用混合架构,将传统CPU节点与加速器(如GPU)结合。这种集成提升了特定类型并行工作负载的性能表现。

基于集群的超级计算机广泛应用于科学研究、天气建模、金融模拟、分子动力学等领域,成为解决复杂计算问题的多功能平台。商用组件的集成,加之网络和并行编程技术的进步,使集群成为高性能计算领域内广泛采用的架构。

1.2.7 加速计算(2000年代至今)

加速器的集成,如图形处理单元(GPU)和现场可编程门阵列(FPGA),在特定类型的并行工作负载中逐渐流行,尤其是在科学模拟和深度学习领域。NVIDIA CUDA和OpenCL是基于GPU计算的典型编程模型。

加速计算系统的主要组件包括系统内存、CPU、GPU和FPGA。系统内存是CPU和加速器共同访问的集中式内存。CPU是传统处理器,负责通用计算任务,通常包含多个CPU核心、缓存和内存总线。GPU作为专门用于并行计算的加速器,尤其擅长图形相关任务,常通过CUDA、OpenCL或TensorRT等API用于通用计算。FPGA是一种具备可编程逻辑的加速器,可针对特定任务进行配置,提供对多样化工作负载的灵活适应性。

image.png

加速计算已成为多个领域的核心技术,包括科学研究、机器学习和数据分析,这些领域对计算能力的需求持续增长。图1.7展示了集成加速计算组件的系统概念结构。加速计算强调在传统CPU之外,利用硬件加速器提升并行处理能力。GPU和FPGA是高性能计算环境中最常见的加速器类型。

GPU作为加速器在高性能计算中应用广泛。GPU最初设计用于图形渲染,具有高度并行的架构,非常适合并行数值计算。CUDA和OpenCL是常用的GPU编程模型。FPGA是一种可重配置硬件设备,可针对特定工作负载进行定制,提供硬件配置的灵活性,适用于特定计算模式的应用。

通用GPU计算(GPGPU)概念指利用GPU进行超出图形处理的通用计算,已成为加速众多科学和工程应用的主流方法。加速器通常具备高内存带宽和吞吐量,能快速传输主存与加速器之间的数据,这对高效向处理单元供给数据至关重要。

加速计算在深度学习和神经网络训练的推进中发挥了关键作用,尤其是GPU已成为快速训练复杂神经网络的核心组件。NVIDIA开发的CUDA和作为开放标准的OpenCL是加速计算常用的编程模型,帮助开发者充分利用GPU及其他加速器的能力。

加速计算推动了异构计算架构的发展,系统整合了多种类型的处理单元,包括CPU、GPU和FPGA,利用异构性实现最佳性能。为支持加速计算,出现了多种并行编程框架和库,如NVIDIA的CUDA工具包、OpenACC,以及用于GPU加速的线性代数库cuBLAS和深度学习库cuDNN。

对于某些计算类型,加速计算相比传统以CPU为中心的架构,能够实现更高的能效,这在功率受限的高性能计算环境中特别重要。加速计算已被广泛应用于科学研究、金融、医疗等多个行业。标准化工作致力于为多样化的加速器创建统一的编程模型。

虽然加速器带来性能提升,但高效编程较为复杂。优化针对加速器的并行执行代码,需要具备并行编程技巧和对具体加速器架构的深入了解。GPU、FPGA及其他加速器的集成,已成为提升科学、工业和研究应用计算能力的标准做法。

image.png

1.2.8 艾克萨级计算(持续发展中)

当前,艾克萨级计算的目标是实现每秒一艾克萨浮点运算(10^18次浮点运算)的性能水平。艾克萨级系统的架构通常结合了先进处理器、加速器、节能设计以及新型互连技术。预计艾克萨级计算机的处理器将由多种类型的处理单元组成。图1.8展示了一个可能的艾克萨级计算节点架构。

“胖核”类似于当代桌面或服务器中注重延迟的传统CPU核心,具备多级缓存、指令级并行和深度流水线设计;而“瘦核”则代表结构较为简单的计算单元,功耗和芯片面积较低。通过采用更多数量的瘦核,处理器在算法具备足够高度并行性的情况下,能实现更优异的性能表现。

总体而言,艾克萨级计算处理器将在同一芯片上集成加速器(如GPU、Intel Xeon Phi、DSP)和CPU核心。程序员需根据不同任务类型,灵活利用不同类别的核心:对于并行度低或无并行性的算法,强大的胖核能提供最佳性能和能效;而对于可并行化任务,瘦核则能实现最高的整体处理性能和能效。

此外,还可以采用混合策略,在同一算法中同时使用胖核与瘦核,但分配不同的工作负载,以达到性能和能效的最优平衡。

image.png

艾克萨级计算旨在提供每秒能执行10^18次运算的计算系统。这种计算能力有望解决复杂的科学、工程和数据密集型问题。实现艾克萨级计算需要更高程度的并行性。艾克萨级系统设计支持数百万乃至数十亿个核心或处理单元的并发操作。

功耗管理是艾克萨级计算面临的关键挑战。系统必须提升能效,以确保实际可用性并尽量减少环境影响。艾克萨级系统通常采用异构架构,集成多种类型的处理器和加速器。图形处理单元(GPU)、现场可编程门阵列(FPGA)及其他加速器为整体性能贡献力量。

先进的内存和存储技术对于艾克萨级计算至关重要,包括高带宽内存(HBM)、非易失性内存(NVM)及能够匹配高速计算节奏的存储解决方案。系统组件间高效的数据移动和通信同样极为重要,采用高速互连和新型通信协议以促进处理单元间的快速数据交换。

鉴于艾克萨级系统的规模,容错性成为重要关注点。系统集成了弹性机制和容错算法,以确保硬件故障时系统能够持续运行。开发能够有效利用艾克萨级系统庞大并行性和独特架构的软件,是一项重大挑战。算法和应用的可扩展性与性能优化是持续的重点。

艾克萨级计算有望对科学研究和工业应用产生重大影响,气候建模、材料科学、药物研发和人工智能等领域都将受益于其强大的计算能力。实现艾克萨级计算需要全球范围的协作。多个国家和联盟正投入研发,推动艾克萨级系统的问世,促进国际合作。许多国家将艾克萨级计算视为战略资产,投资国家级项目以引领这一技术前沿。国家实验室、研究机构和产业伙伴共同合作,推动艾克萨级系统的开发与部署。

艾克萨级系统的部署是一个持续进行的过程。多个国家正努力实现艾克萨级能力,计划在未来几年内部署相关系统。实现艾克萨级计算需克服诸多技术挑战,从能效管理到软件优化,需全球协作和战略投资[4]。

1.2.9 量子计算(新兴技术)

量子计算是一种新兴计算范式,具有革新高性能计算的潜力。基于量子比特(qubit)和量子门(quantum gates)的量子架构,旨在以指数级速度解决某些类型的问题,远超经典计算机的能力。当前的量子计算领域仍类似于20世纪40年代早期的经典计算机,物理量子设备体积庞大[5],且需要特定的物理环境才能正常运行。量子计算平台(QCP)的总体架构如图1.8所示,包含五个层次,其中三个层次专门由量子硬件和电路组成,另外两个层次涉及经典硬件和软件组件。

1.2.9.1 量子层[5–7]

这些层共同构成量子处理单元(QPU):

  • 物理构件:涵盖量子硬件,通常利用超导环路实现量子比特。该层还包括用于量子比特寻址和控制操作的物理量子比特耦合器/互连电路。
  • 量子逻辑门:构成量子逻辑门的物理电路[6, §5.5][8]。
  • 量子-经典接口:涉及实现经典计算机与量子处理单元之间接口的硬件和软件。

1.2.9.2 经典层[9–12]

  • 量子编程环境:提供量子汇编语言(用于QPU指令)、高层次语言的编程抽象、模拟器支持以及集成开发环境(IDE)等组件。
  • 业务应用:为满足业务需求而设计的量子软件应用。

image.png

量子计算机以量子比特(qubit)作为信息的基本单位。与只能处于0或1状态的经典比特不同,量子比特由于叠加态的特性,可以同时存在于多种状态,从而为量子计算机带来了指数级增长的计算能力。叠加态使得量子计算机能够同时进行并行计算。纠缠态作为一种量子现象,使量子比特之间产生关联,进一步增强了量子算法的计算能力。量子计算机通过量子门对量子比特进行操作,这些量子门被组织成量子电路。量子算法设计用来通过这些量子电路操控量子比特,以比经典算法更高效地解决复杂问题。

量子计算利用量子并行性的概念,允许同时探索问题的多个解,这在密码学、优化和模拟等领域可显著加速计算过程。虽然量子计算机在解决特定问题上可能实现指数级的速度提升,但它们不一定能在所有计算类型上超越经典计算机。量子霸权指的是量子计算机在某些任务上展示出优于经典计算机的性能。

量子计算机容易受到环境因素导致的误差影响,量子纠错是关键的研究领域,旨在减少错误并确保量子计算的可靠性。著名的量子算法如Shor算法(用于大数分解)和Grover算法(用于无结构搜索)展示了其在解决问题时比已知最佳经典算法快得多的潜力。

量子计算与机器学习交叉发展,催生了量子机器学习算法。量子计算机在某些机器学习任务中具有优势,尤其是在优化和模式识别方面。许多公司和研究机构已在展示量子霸权方面取得进展,证明量子计算机在特定任务上优于经典计算机。

量子计算被视为对经典高性能计算(HPC)的补充。混合计算方法结合经典与量子处理,旨在利用两者的优势。量子计算资源通过云服务逐渐可用,研究人员和开发者无需拥有量子硬件即可访问和实验量子算法。

量子计算的研发仍在进行,重点解决技术难题,提升量子比特相干性和降低错误率,同时探索具有实际应用的新量子算法。尽管量子计算仍处于早期阶段,但其在变革特定计算任务方面展现出巨大潜力,且与经典HPC的结合是当前积极探索的研究方向[13]。

高性能计算架构的演进仍在继续,驱动力来自对更高计算能力、更优能效及创新方法以应对复杂科学与计算挑战的需求。量子计算和艾克萨级系统等领域的持续研发正在塑造HPC架构的未来发展轨迹。

1.3 高性能计算中的编程挑战

本节探讨在高性能计算服务器上实现并行应用时,设计选择对系统性能的影响。首先,我们深入分析并行算法的设计模式及其对应的并行编程接口,这些接口旨在最大化高性能计算系统的利用率。此外,鉴于内存对应用执行行为的重要影响,我们还考察提升数据和线程局部性的方法。

1.3.1 并行算法的设计模式

开发者在并行化应用时,可以灵活选择多种通信模型,以促进同时执行的处理核心之间的协作。两种常见模型包括共享内存和消息传递。共享内存依赖所有处理器可访问的统一地址空间,适合线程级并行,线程共享同一内存空间。相反,消息传递适用于内存空间分布式或进程间无共享地址空间的场景。核心在于选择与目标架构最契合的编程模型:共享内存适合多核及众核处理器,而消息传递则特别适合通过互连链路通信的大型计算系统。

除通信模型外,选择合适的并行编程风格以从顺序代码中提取并行性也是一大挑战。传统上,fork-join模型因其利用并行性的简便性,在软件开发者中颇受欢迎。该模型如图1.9所示,主线程(橙色矩形)启动顺序执行阶段。遇到并行区域时,创建一组线程并行执行任务(fork操作)。区域结束时,所有线程执行join操作进行同步。同步后,仅主线程继续执行,直至遇到下一并行区域。由于该模型广泛应用于多核系统的并行化,且处理器厂商(如AMD、ARM、Intel、NVIDIA)不断推出核数增加的处理器,因而一个关键挑战是开发能有效利用这些架构能力的算法。其核心目标是在保持最佳性能和能效的同时,扩展线程数量。

然而,采用fork-join风格实现的并行应用执行模型较为刚性,适应性有限,可能难以充分应对某些硬件和软件问题,如数据同步与缓存争用,尤其在应用行为或执行环境存在变异时。这种局限性可能阻碍性能的线性提升。在fork-join模型遇到变异时,可能导致功耗增加,并影响并行应用的整体性能。

image.png

为应对这些挑战,任务驱动的编程模型逐渐被广泛采用。与fork-join实现的局限性相比,这些模型在多核系统上具有更高的灵活性和更好的负载均衡能力。然而,软件开发者在使用任务并行时仍面临定义不同并行区域间数据依赖关系的挑战,这可能限制并行化带来的收益。

无论选择何种编程模型,开发者都可以采用设计模式来促进并行性的利用。值得注意的是,Map、Stencil和Reduction等模式被广泛应用。图1.10所示的Map模式将工作负载(如数组、列表或相关集合)划分为独立且无数据依赖的部分,可并行运行,属于典型的“尴尬并行”[14]。函数会应用于集合中的所有元素,通常生成一个与输入形状相同的新集合。此外,迭代次数和输入数目通常是预先确定且相同的。Map模式面临的新计算机架构挑战在于,需要对集合的每个元素应用大量计算,并且需进行大量迭代,以充分利用处理器核心。

1.3.2 并行编程库

随着现代架构提供多样的计算能力,各类编程语言和库被引入,辅助开发者充分挖掘并行性。

消息传递接口(MPI)多年来成为利用并行性的主要选择。其流行源于需要在分布式内存环境中创建进程并管理进程间通信,而这正是所有高性能计算系统的基本需求。MPI的演进(包括MPI-1、MPI-2和MPI-3)以及HPC技术的进步[15],带来了以下挑战:(1)在计算节点间平衡通信与计算以优化硬件资源,(2)高效利用异步通信实现通信与计算的重叠,(3)确保容错机制的实现。

与此同时,随着多核架构中核心数目激增,利用共享内存并行性的库如OpenMP和POSIX线程库变得越来越受欢迎。POSIX线程库最初作为轻量级线程实现,在并行应用开发中发挥了关键作用[16]。但由于其复杂性和程序员需自行管理操作系统多方面细节,现已不再用于此类开发,目前主要用于针对操作系统的应用开发。

在此背景下,OpenMP库取代了POSIX线程库的角色。OpenMP由编译器指令、库函数和环境变量组成,简化了代码中线程管理[17]。相比POSIX线程,OpenMP更易于利用并行性。通过向代码插入指令,编译器知道哪些部分应并行执行。然而,随着核心数增加及共享内存架构中内存层次变复杂,OpenMP面临以下挑战:(1)确定每个并行区域的最佳线程数,(2)定义线程和数据的布局策略以减少缓存争用和最后一级缓存缺失,(3)高效利用异构计算指令。此外,MIT最初开发、后由Intel维护的Cilk Plus[18]等替代库曾出现,便于矢量和任务编程,但随着OpenMP的发展,这些库的使用逐渐减少。近年来,OmpSs-2作为OpenMP的替代方案出现,支持通过任务挖掘并行性,提升多核系统上的适应性和负载均衡。

OpenMP和MPI占主导地位的局面随着GPU架构的广泛应用发生显著变化。随后,CUDA成为NVIDIA GPU上加速多领域应用最广泛使用的并行编程接口之一[19]。

CUDA库为C、C++和FORTRAN语言提供扩展,支持程序员编写可在NVIDIA GPU上执行的核函数(kernel)[20]。类似地,OpenCL作为异构计算框架出现,使开发者能编写兼容多供应商多核处理器和图形卡的应用[21]。OpenACC库因其类似OpenMP的并行利用方式而流行[22],通过pragmas简化GPU编程。随着异构架构应用的增长,英特尔于2018年底发布OneAPI,旨在通过统一编程语言和模型简化所有加速器架构的软件开发。OneAPI追求源代码级兼容性、性能透明性及软件栈可移植性。

定义每段并行代码的理想架构以兼顾整体HPC系统性能,是一大挑战。高效的并行应用通常结合多种编程接口:MPI负责节点间消息交换,OpenMP、CUDA/OpenACC用于多处理器核心和GPU加速。编译器的发展趋势聚焦于自动并行化和数据位置优化。

1.4 结论

如前所述,高性能计算已经从满足特定处理需求的专业领域,发展成为计算演进中的核心主题,尤其是在大数据、人工智能、数据科学等科学领域对计算能力需求不断增长的背景下。从大型机和早期超级计算机专注于大规模数据处理,到矢量处理器推动科学模拟中的高效并行,每个时代都带来了关键性的发展。1980年代向大规模并行处理系统的转变强调协同问题解决,1990年代集群计算的采用则标志着向经济高效的并行解决方案的转型。1990年代对称多处理架构进一步提升了可扩展性,2000年代基于集群的超级计算机凭借可扩展架构和先进互连技术成为主流。

2000年代,加速计算结合GPU和FPGA,在特定并行工作负载中崭露头角,为科学模拟和深度学习作出重大贡献。当前对艾克萨级计算的追求,旨在实现每秒一艾克萨次运算的性能,彰显了对更高计算能力和能效的不断追求。艾克萨级架构融合先进处理器、加速器、节能设计和新型互连技术,以实现这一宏伟目标。

在新兴技术领域,量子计算作为潜在的变革者脱颖而出,承诺为特定问题类型带来指数级加速。基于量子比特和量子门的量子架构预示着未来某些计算挑战将远快于经典计算机的解决速度。

随着高性能计算架构的持续演进,其核心主题始终围绕提升计算能力、能源效率及应对复杂科学和计算难题的创新解决方案。特别是在量子计算和艾克萨级系统领域的持续研发,将在塑造未来高性能计算架构的发展轨迹中发挥关键作用,确保其始终处于技术创新的前沿。

参考文献

  • Dongarra, J. H. M., and Strohmaier, E. (2020). Top500超级计算机。网址:www.top500.org/lists/top50…。访问时间:2021-03-10。
  • Reed, D., Gannon, D., and Dongarra, J. (2022). 《重塑高性能计算:挑战与机遇》。arXiv预印本 arXiv:2203.02544。doi.org/10.48550/ar…
  • Russell, R. M. (1978). 《CRAY-1计算机系统》。ACM通讯,卷21,第1期,63–72页,1月。doi.org/10.1145/359…
  • Ang, J. A. 等(2014)。《艾克萨级计算的抽象机模型与代理架构》。载于第一届国际高性能计算硬件软件协同设计研讨会论文集,Co-HPC ’14,25–32页。IEEE。dx.doi.org/10.1109/Co-…
  • D-Wave Systems Inc. 《D-Wave量子硬件简介》。网址:www.dwavesys.com/tutorials/b…。访问时间:2018-02-19。
  • Brandl, M. F. (2017). 《大规模量子计算的量子冯·诺依曼架构》。arXiv:1702.02583 [quant-ph]。
  • Microsoft. (2017). 《微软新突破推动通用量子计算更近现实》。网址:news.microsoft.com/features/ne…。访问时间:2018-02-19。
  • Nielsen, M. A., and Chuang, I. (2002). 《量子计算与量子信息》。剑桥大学出版社。
    IBM. (2017). 《IBM量子体验》。网址:quantumexperience.ng.bluemix.net/qx/experien…。访问时间:2018-02。
  • Rigetti Inc. (2017). 《Rigetti QPU—pyQuil 1.8.0文档》。网址:pyquil.readthedocs.io/en/latest/q…。访问时间:2018-03-05。
  • D-Wave Systems Inc. (2017). 《D-Wave 2000Q量子计算机技术概览》。网址:www.dwavesys.com/sites/defau…,访问时间:2018-02-19。
  • Microsoft. (2017). 《微软量子开发工具包》。网址:www.microsoft.com/en-us/quant…
  • Sodhi, B. (2018). 《量子计算平台的质量属性》。arXiv:1803.07407v1 [cs.SE],3月15日。doi.org/10.48550/ar…
  • Voss, M., Asenjo, R., Reinders, J. 等(2019)。《将并行模式映射到TBB》。载于《Pro TBB》,C++线程构建模块并行编程,233–248页。doi.org/10.1007/978…
  • Gabriel, E. 等(2004)。《Open MPI:下一代MPI实现的目标、概念与设计》。载于《并行虚拟机与消息传递接口最新进展》,第11届欧洲PVM/MPI用户会议论文集,布达佩斯,2004年9月19–22日,97–104页。施普林格。doi.org/10.1007/978…
  • Barney, B. (2009). 《POSIX线程编程》。国家实验室。网址:computing.llnl.gov/tutorials/p…。访问时间:2022-05-04。
  • Chandra, R., Dagum, L., Menon, R., Kohr, D., Maydan, D., McDonald, J. (2001). 《OpenMP并行编程》。Morgan Kaufmann。
  • Schardl, T. B., Lee, I.-T. A., Leiserson, C. E. (2018). 《简短公告:Open Cilk》。载于《第30届算法与架构并行研讨会论文集》,351–353页。doi.org/10.1145/321…
  • Sanders, J., Kandrot, E. (2010). 《CUDA示例:通用GPU编程入门》。Addison-Wesley Professional。
  • Cook, S. (2012). 《CUDA编程:GPU并行计算开发者指南》。Newnes。
  • Munshi, A., Gaster, B., Mattson, T. G., Ginsburg, D. (2011). 《OpenCL编程指南》。Pearson Education。
  • Farber, R. (2016). 《OpenACC并行编程》。Newnes。