1.3 并行计算基础
早在20世纪50年代,计算机专家就提出了并行计算的概念。并行计算的核心思想是采用多个运算部件协同求解同一问题。实现并行计算需要具备三方面的技术支持:并行体系结构、并行编程模型、并行优化算法。其中,并行体系结构为并行计算开展提供运行平台,并行优化算法是并行计算的实现载体,而并行编程模型为并行体系结构和并行优化算法提供了交互接口,是应用和平台之间的实现界面。图1.6所示为并行计算的三种关键技术在并行系统中的层次关系图。本节将依次介绍并行体系结构、并行编程模型和并行优化算法的相关研究,为SAR成像并行仿真技术的研究开展奠定基础。
图1.6 并行计算的关键技术
1.3.1 并行体系结构
并行体系结构是并行计算的基础,各种并行计算的相关机制也都是针对不同并行体系结构而设计的。高性能并行计算机采用并行体系结构,将大量高性能处理器、大容量高带宽的存储器、系统控制逻辑等不同功能部件组成一个协同工作的有机整体,通过多个处理器并发工作实现并行处理模式。并行体系结构经历了从标量机到大规模并行计算机系统、从串行计算到大规模并行计算、从覆盖单一的数值计算领域到覆盖复杂多样的科学计算、商业计算、服务计算等众多领域的发展历程。根据并行体系结构在不同历史时期的特征,并行计算机可以分为如下四类。
1)SIMD并行机
单指令流多数据流并行机SIMD(Single Instraction Stream Multiple Data Stream)是最早产生的并行计算机。该并行机由大量功能简单的微处理器构成,通过采用流水线、超长指令字、同时多线程等技术,实现在各处理器上的简单数据分配和显式并行。但由于SIMD并行机过分依赖机器的硬件功能,阻滞了并行程序的优化设计。典型的SIMD并行机包括CM-2,Transputer等。SIMD并行机可采用共享存储或者分布存储的结构组织方式。为了举例说明,图1.7给出了分布存储的SIMD并行机的体系结构示意图。其中,Host代表主处理器;CU代表控制单元(Control Unit);PE代表处理单元(Processing Element);M代表存储器(Memory),I/O代表I/O接口。后面介绍的体系结构图示将沿用这些代号解释。
2)PVP并行机
并行向量处理机PVP(Parallel Vector Processor)采用流水线和阵列技术,实现了处理器和内存之间的持续供数,在20世纪80年代成为主流的并行计算机。在编程模型方面,PVP并行机采用了专门的向量语言(Fortran90)以及向量编译优化技术,通过向量识别与程序重构,为加速计算密集型应用提供了支持。典型的PVP并行机包括Cray系列巨型机、YH-1、YH-2等。图1.8所示为PVP并行机的体系结构示意图,其中VP代表向量处理器(Vector Processor)。
图1.7 SIMD并行机
图1.8 PVP并行机
3)SMP并行机
对称多处理机SMP(Symmetric Multi-processor)基于共享主存技术,通过高速总线或交叉开关连接多个微处理器和共享存储器。由于结构对称,通过采用并行识别与循环并行化技术,易于挖掘该体系结构的并行性。该体系结构的内存访问属于典型的均匀访问模型,具有单一操作系统映象、低访存延迟、低通信延迟和共享总线带宽等特点。SMP成为目前大规模并行计算机系统结点内部采用的典型组织结构之一。然而,总线和交叉开关的互联方式制约了SMP的规模扩展。代表性的并行机包括SGI Power Challenge、IBM R50、YH-2等。图1.9所示为SMP并行机的体系结构示意图,其中P/C代表处理器或者计算核以及高速缓存(Microprocessor and Cache)。
4)当代主流并行机
当代主流并行机主要集中于多处理机系统,包括大规模并行处理机MPP(Massively Parallel Processors)、分布式共享存储多处理机DSM(Distributed Shared Memory)和机群Cluster。这三种并行机都基于物理上分布主存技术,采用先进微处理器作为处理单元,通过高速网络连接多个系统结点,具有良好的可扩展性。当代主流并行计算机采用数据分布和低延迟、高带宽通信技术,充分开发两级并行性能,包括开发结点之间的粗粒度并行以及挖掘结点内部的计算性能。图1.10所示为分布存储多处理机系统的体系结构示意图,其中NIC代表网络接口电路(Network Interface Circuitry)。
图1.9 SMP并行机
图1.10 多处理机系统
当前,现代科学研究和工程实践对高性能计算能力有着强大的需求。这四类并行计算机互依共存,在并行计算领域适合各自的应用问题,最终目标都是追求高性能计算。在这种需求的推动和微电子、高速通信、并行处理等技术的支撑下,并行体系结构得到了飞速发展,并行计算机的性能有了极大提高。在2011年6月发表的超级计算机TOP500排行榜中,所有系统的合计性能从一年前的32.4PFlops和6个月前的43.7PFlops增加到了现在的58.9PFlops,其中榜首的超级计算机的实际峰值性能达到了8.16PFlops,如图1.11所示。并行体系结构为开发并行仿真应用程序提供了必要的计算平台。然而近年来,新的应用需求不断涌现,而VLSI设计的限制越来越突出,当前的并行体系结构受到了严重挑战,主要体现在以下三个方面。
图1.11 1993—2011年TOP500超级计算机性能统计
1)存储墙问题
众所周知,存储墙问题是高性能体系结构所要解决的首要问题。在过去的十几年中,处理器速度以每年50%~100%的速度增长,而存储器速度却只以每年7%左右的速度增长。处理器和存储器之间的速度差距越来越大,导致了存储墙的出现。为了解决存储墙问题,大多数高性能体系结构采用Cache存储层次系统。由于技术、工艺等方面的原因和实际程序的特性,很多情况下Cache的效果不足以缓解存储墙的问题。美国密歇根大学Wen-Fen Lin等人的研究结果表明,对于运行于高性能处理器上的SPEC2000程序,平均有57%的时间用于处理L2级Cache不命中。图1.12所示为1980年以来处理器和存储器的性能随时间变化的曲线。从该图可以看出,存储器与处理器之间的速度差距会随着时间的增长变得越来越大。因此,在未来可预测的范围内,存储系统仍将是影响整个计算机系统性能的瓶颈。
2)性价比问题
高性能体系结构面临的第二个问题是性价比(性能价格比)问题。在摩尔定律的作用下,单个芯片上可集成的晶体管数目飞速增长,目前已经超过10亿个,这使得计算成本相对越来越低。然而,当前高性能计算机上的芯片面积主要被深度流水的控制结构和大容量的全局存储器(如Cache)所占据,运算单元面积占芯片总面积的比例很低。例如Itanium处理器,其运算单元只占芯片面积的6.5%,大部分芯片面积用于实现Cache、分支预测、乱序执行、通信调度等。可见,虽然运算单元制造成本降低,但当前的高性能体系结构并没有有效利用这些丰富而廉价的运算资源,造成了单位价格只能获取较低的性能收益。
图1.12 处理器速度与存储器速度的变化趋势
3)计算效率问题
高性能体系结构面临的第三个问题是计算效率问题。长期以来,高性能计算界一直以“峰值运算速度”作为高性能计算机技术水平的评价标准。但是,系统实际的持续性能与其峰值性能往往相差甚远,并且随着机器峰值性能的提高,持续性能与峰值性能的差距日益扩大。美国国家能源研究科学计算中心(NERSC)主任H.D.Simon指出,大规模应用的效率从90年代初向量超级计算机上的平均40%~50%降低到目前并行超级计算机上仅有的5%~10%。这是由于高性能计算机系统容量爆炸性的增长造成了复杂的控制逻辑、较高的通信延迟,从而降低了系统中计算资源的有效利用率。
为了缓解以上并行体系结构面临的问题,突破现有通用处理器的限制,需要在体系结构和应用软件两方面进行创新性和适用性的深入研究,具体体现在以下两个方面。
1)采用新型体系结构
前述四类并行体系结构在性能方面各有所长。为了提高并行计算机系统的性能和性价比,一方面,应当继续采用高性能微处理器、大容量存储器、高性能I/O、高带宽通信技术等传统并行体系结构设计思想;另一方面,应当尽可能将多种并行体系结构的优势相互融合,取长补短,进而设计出新型体系结构。例如,DSM就是SMP技术和MPP技术的有效结合,具备了共享存储和分布存储的双重优势。再如,流体系结构是目前新型体系结构中极具发展前景的重要领域之一。典型的流体系结构包括Imagine、RAW、Cell、FT64、GPU等。该体系结构充分结合了基于SIMD的指令级并行、基于片上共享存储的数据级并行和基于片间分布存储的任务级并行技术,能够面向计算密集型应用,有效处理海量数据流。可见,这种多体系结构相结合的技术旨在缓解当前并行体系结构存在的突出矛盾,能够同时具有多种体系结构特征并获得性能优势的互补和统一,成为构建超级计算机的主要途径之一。
2)选择和优化并行仿真程序
并行计算机必须依靠具体仿真应用的实际运行才能发挥其性能。为了缓解并行体系结构面临的瓶颈,应当采用能够挖掘体系结构性能优势的并行仿真软件。然而,并行仿真软件的发展远远落后于并行计算体系结构的发展,因此有必要针对给定的并行体系结构,研究相关的仿真程序选择和优化技术。所采用的相关技术包括两个方面:一方面,研究体系结构和仿真程序之间的适用性,从而能够根据体系结构的特点选择适合运行的应用领域,使得所选择的仿真程序具有开发体系结构性能优势的潜力;另一方面,研究面向体系结构特点的并行优化技术,并在编译或程序设计过程中实现该技术,使得优化后的仿真程序能够尽可能避免体系结构的性能瓶颈,发挥体系结构的性能优势。
1.3.2 并行编程模型
并行编程是针对给定应用问题开发并行程序的过程。为了便于高效控制并行体系结构和并行算法之间的交互,需要引入并行编程模型。并行编程模型为并行程序开发提供了规范的编程规则、完备的编程接口和系统的实现框架,有利于同时掌握体系结构的特征和应用程序的需求。任何并行算法的实现都需要借助并行编程模型,从而构造出易于理解、结构清晰、便于优化的并行程序。而具体采用哪种并行编程模型,则需要考虑采用并行编程模型构造的并行程序能否挖掘所运行并行计算平台的性能优势。也就是说,评价某种并行编程模型合理的标准是该模型能够担当硬件和软件的良好沟通桥梁。采用并行编程模型促进了并行程序的高效开发,推动了并行计算的蓬勃发展。
并行编程模型可以通过两种方式实现。第一种是采用全新的并行编程语言。这种实现方式采用全新的数据结构、函数定义、语法规则等,需要对已有的串行程序全部改写,并设计全新的并行编译系统。该方式适用于针对特定体系结构的特点专门设计并行编程模型,有利于充分开发体系结构的性能潜力,但全新的语言学习也增加了程序员的编程负担。第二种是基于成熟的并行编程语言进行并行化扩展。可以采用运行库的方式增加并行划分和通信同步的功能,这样只要基于原有的串行程序增加部分有关并行开发的库调用就可以实现并行程序,具有较好的可编程性和可移植性。
目前,并行计算领域存在适合不同体系结构的多种并行编程模型。根据所适合体系结构的特征,这些编程模型主要被归为五类:数据并行编程模型(Data-Parallel Program Model)、共享存储编程模型(Shared Memory Program Model)、消息传递编程模型(Message Passing Program Model)、新型编程模型(New-style Program Model)、混合编程模型(Hybird Program Model)。下面分别介绍这五类编程模型。
1.数据并行编程模型
数据并行编程模型的典型特点是程序员通过特定数据结构显式分配数据到不同的处理机。并行程序运行时,各个进程将使用预先分配好的数据集,无须显式通信。如果处理机上计算任务所需的数据大多在本地存储,则能够通过数据并行执行获得较高的运行效率。可见,数据并行编程模型需要提供支持数据显式分布的机制,强调数据局部性驱动的数据分配和计算映射操作,其数据并行操作通常在编译时完成,既可以实现SIMD的细粒度数据并行,也可以实现SPMD的粗粒度数据并行。采用数据并行编程模型的程序员必须熟悉底层硬件结构,从而具有更多的可控权限,若数据分配良好则必然能够产生高并行和可扩展的并行程序。然而,这种显式控制造成了该模型的灵活性小,难以完全实现高效的数据并行化。
高性能Fortran(High Performance Fortran,HPF)和Co-Array Fortran都是典型的数据并行编程模型。HPF是Fortran 90的扩展版本,主要扩充了数据分布、计算分布和任务分布的指导指令,其宗旨是希望通过控制数据和计算的分配实现程序自动并行化。HPF的编译器和运行时系统将扩充的指导指令映射成为实际的数据移动和消息传递操作。可见,HPF的编译优化技术是数据并行编程模型的研究重点。然而,HPF并没有被广泛商业化,其原因主要在于所依赖的并行编译器无法高效解决实际应用中存在的各种复杂不规则问题。Co-Array Fortran是另外一种基于SPMD模式的数据并行编程模型,其数据分布思想类似于HPF,通过对数组的定义和操作实现对数据对象的不同映射。相比于HPF,Co-Array Fortran需要在程序级实现更明确的通信和同步,虽然编程更为灵活,但是增加了程序员的编程负担。总之,数据并行编程模型由于受到编译器能力的限制以及过于集中在数据并行应用,难以超越采用其他并行编程模型开发的并行程序的运行性能。
2.共享存储并行编程模型
共享存储并行编程模型适用于具有共享存储区域的并行系统,包括广泛使用的PVP、SMP、DSM等。这些系统的共享存储结点通过共享总线或交叉开关连接多个处理器和共享存储器,为所运行程序提供单一的全局地址空间,所有共享数据都保存在该地址空间中。因此,共享存储并行编程模型无须进行显式数据分配,采用多线程和异步执行方式实现多处理器之间的任务并行,并通过读或写全局地址空间中的共享变量来实现多任务之间的通信。与数据并行编程模型的最大区别在于,共享存储并行编程模型采用异步多线程并行和显式的同步操作,从而保证程序的正确执行顺序。采用共享存储并行编程模型时,程序员无须考虑显式数据分配和任务通信,因此该编程模型的可编程性较好,但若要获得高效执行效率,还需要编译器在任务划分和调度上进行优化处理。目前,典型的共享存储并行编程模型包括POSIX Threads(Pthreads)、OpenMP、Java Threads等,其中OpenMP己发展成为一个可接受的实际工业标准,得到许多硬件和软件供应商的支持,目前还在不断扩充和发展中,是最具代表性的共享存储并行编程标准。下面就来简要介绍OpenMP标准。
OpenMP是由OpenMP标准委员会(OpenMP Architecture Review Board,OpenMP ARB)于1997年推出的支持共享存储并行编程的工业标准。该标准提供了一个共享存储并行系统上的应用编程接口,扩充了数据分布和并行任务的描述能力,定义了一个由编译制导、运行时库函数和环境变量构成的集合,用来描述共享内存的并行机制,使得程序员能够控制并行程序的行为,完成程序设计任务。OpenMP使用fork-join并行机制,在C/C++或Fortran源程序中插入并行编译制导命令,通过编译制导和运行时库函数创建和同步线程来实现并行。OpenMP编译制导命令在C/C++中采用“#pragma omp directive”格式,在Fortran中采用“!$opm directive”和“!$opm end directive”格式。图1.13所示为C程序的OpenMP并行化过程。程序运行开始,主线程串行执行,遇到pragma并行化编译制导命令时将串行代码并行化,创建出一组可并行线程。在并行区域之内,多个线程可以执行相同的代码块,或者使用工作共享结构体并行执行不同的任务。可见,OpenMP并行化时,源程序代码无须要做太多修改,一般仅需指定可以并行执行的循环,而无须考虑计算与数据如何划分,以及如何进行任务间通信,编译器会自动完成上述功能。对于不同的体系结构,pragma编译制导命令为程序并行化提供了一致的接口。在理论上,OpenMP更好地利用了共享内存体系结构,允许运行时调度,并提供了细粒度和粗粒度并行机制。微软的VC++ 8.0编译器及以上版本和Intel C++ 7.0编译器及以上版本都支持OpenMP。
图1.13 OpenMP的fork-join模式
3.消息传递并行编程模型
消息传递并行编程模型的显著特点是并行任务之间通过消息传递来实现数据交换、并行控制、同步协调等操作。目前该模型主要采用运行时程序库技术。并行程序执行时,程序员通过调用库函数来为每个进程显式分配数据和计算任务。而所有进程的数据都是私有的,因此,只能通过库调用实现进程之间的消息交互和显式同步。这种并行化方式导致通信开销成为消息传递并行程序的首要优化要素。消息传递并行编程模型比数据并行编程模型和共享存储并行编程模型更加灵活,但将各个并行任务之间复杂的信息交换和协调控制任务交给程序员,这在一定程度上增加了编程复杂度。消息传递并行编程模型适合开发结点之间的粗粒度并行性,非常适用于分布存储的并行计算机,包括MPP、Cluster等,同时也适用于共享存储的并行计算机。典型的消息传递模型包括MPI(Message Passing Interface)和PVM(Parallel Virtual Machine)。由于MPI比PVM使用更加广泛灵活,下面简要介绍MPI标准。
MPI是1994年5月发布的一种消息传递接口,是目前最流行的并行编程消息传递标准。该标准定义了一组消息传递库函数的语法和语义,这些库函数提供进程管理、消息传递和通信操作(如栅栏、广播和规约等),能够被C或者Fortran程序调用。MPI标准为程序员提供了很大的可控开发空间,允许通过显式编程方式控制内存复制、通信重叠、障碍同步等操作,其目的是为用户提供一个灵活高效、可移植、可扩展的消息传递接口库,同时也增加了程序员的编程负担。MPI是一种消息传递编程标准,并没有制约MPI的实现模式。在目前广泛流行的多种MPI实现中,MPICH是其中一种随着MPI的发展而同步更新的重要MPI实现。表1.1列出了MPICH的6个最基本的库函数及其功能。
表1.1 MPICH的6个基本函数及功能
4.新型并行编程模型
为了缓解高性能体系结构面临的问题,突破现有通用处理器的限制,国际上正积极开展新型体系结构的研究,具体见3.5.1节介绍。新型体系结构支持新型编程模型。以流体系结构为例,流处理模型将计算组织成流和核心程序,为了适应流处理过程,需要开发面向流体系结构的流编程模型。该模型完全不同于传统编程模型,采用的语言大多为非传统的流编程语言,以支持流级和核级的两级处理过程。流级负责流的组织、传输、调度和kernel划分;核级对流中的记录进行处理,负责计算的具体实现。在流编程模型中,流的组织、传输、处理、调度等都由程序员控制,提高了程序开发的灵活性,能够根据硬件特点实施针对性的程序优化。同时,这种显式的流编程模型也增大了编程及编译优化的难度。
多种流体系结构都具有各自的流编程模型。经典的流编程模型包括StreamIt、StreamC/KernelC、Brook、Sequoia等。其中,StreamC/KernelC是面向Imagine开发的一种层次化的流编程模型。StreamC和KernelC都是C语言的一个子集,分别用于编写流级和核心级程序。这两级分别在主处理器和流处理器上运行。流级负责kernel划分和流的组织,核心级负责计算的具体实现和优化,如图1.14所示。Imagine流编程模型能够很好地开发三级并行性:任务级并行(TLP)、数据级并行(DLP)和指令级并行(ILP)。两级编程模型体现了计算与访存相分离的思想,有利于编译器进行专门优化,从而使流编程模型能很好地被映射到底层硬件上。StreamC/KernelC使得程序员能够以一种友好的方式开发流程序,但是在流程序设计模型中,程序员必须熟悉Imagine的底层结构。
图1.14 流编程模型的两级程序
5.混合编程模型
高性能并行计算机的一个发展趋势是融合多种并行体系结构,使得多种体系结构在性能方面能够互相取长补短,提供多功能、多粒度、多层次的并行潜力。例如,在2011年6月发布的TOP500排行榜的前10名中,第二名中国天河一号A、第四名中国星云、第五名日本Tsubame 2.0都采用了基于通用CPU和加速器(或称协处理器)的异构体系结构。为了充分挖掘具有混合体系结构的并行计算机的性能优势,应当综合采用多种适用于不同体系结构的编程模型,从各个层面上改善并行编程的性能。
目前最广泛应用的混合体系结构是分布式共享存储并行体系结构,包括SMP机群系统、多核工作站机群等。该系统克服了共享存储结构单结点内部难以扩展规模的限制,将多个共享存储结点采用高速网络互联,可以构成超大规模计算能力的并行计算机系统。这种混合存储并行计算机系统单纯采用消息传递或者共享存储编程模型都不能获得理想的性能。为了充分挖掘混合存储并行计算机系统的层次式体系结构优势,应当采用混合编程模型。下面以OpenMP+MPI混合编程模型为例,介绍混合编程模型的实现。
表1.2详细比较了MPI和OpenMP并行编程模型,可以看出这两种编程模型分别适用于不同的体系结构,具有各自的性能优势。采用OpenMP+MPI混合编程模型实现并行程序,能够结合MPI和OpenMP各自的适用性,充分开发混合存储并行计算机上不同层次的体系结构特点,即在单结点内共享存储级,可以采用OpenMP共享存储并行编程模型;在多结点间消息传递级,必须采用MPI消息传递并行编程模型。OpenMP+MPI混合编程模型的执行效果图如图1.15所示,每个MPI进程遇到OpenMP的并行编译制导命令后,产生多个并行线程,并在并行线程执行结束后回归于单一MPI进程;MPI进程之间采用MPI库函数调用实现进程之间的消息交互。该模型能够充分利用结点内共享存储模型的易编程、通信开销小的优点,以及结点间消息传递模型的可扩展性好,避免总线竞争和带宽受限的优点,在粗粒度的任务划分之后重点实现结点内部的细粒度并行,从而充分开发层次式体系结构的性能潜力,极大地提高并行程序的性能。
表1.2 MPI和OpenMP比较
图1.15 OpenMP+MPI混合编程模型
1.3.3 并行优化算法
并行程序设计就是根据要解决问题的并行特征和所采用的并行计算平台的特性,选用适当的并行编程模型和并行优化算法,编写出正确高效的并行程序。尽管并行体系结构和并行编程模型多年来持续快速发展,但是现有并行软件仍然无法满足并行系统对高性能的巨大需求。需要采用针对性的并行优化算法来尽可能开发并行计算平台的性能潜力。并行优化算法的关键构成在于采用多种面向应用特性的并行优化技术。因此,研究高效的并行优化技术已成为并行计算领域中迫在眉睫的研究课题。
程序的并行化方法主要包括以下方面:
(1)任务级并行化。根据应用问题的功能分析,将任务分解成多个可并行的子任务。
(2)数据级并行化。根据数据集被访问的不同方式,将数据分布到多个处理器并行处理。
(3)循环级并行化。根据循环中迭代之间的依赖关系,将一个循环划分成多个循环并行执行。
在并行程序设计时,需要同时结合这三种角度的并行化方法,从不同层次上提出相应的并行优化技术。多年来,很多研究人员致力于研究通过软件方法来实现并行优化技术,经过调研分析,总结出其研究目标主要集中于实现两方面的性能优化:并行优化和延迟优化。下面分别介绍这两方面优化技术的实现方法。
1)并行优化技术
当前高性能体系结构都采用并行处理方式提高系统性能。为了增大系统中的并行度,通常采用并行优化方法来提高程序中可并行执行的操作数目,尽可能开发系统的计算能力。并行优化方法包括细粒度并行优化和粗粒度并行优化,分别适用于开发指令级并行和循环级并行。
细粒度并行优化最初是针对向量机和指令级并行计算机提出的开发最小粒度并行性的方法。其原则是减少和消除数据相关和控制相关,增大程序中的基本块。具体方法包括:循环展开、软件流水、循环交换、标量扩展、数组重命名、索引集分裂等。Wolfe的硕士论文和博士论文以及Pieper的博士论文中都给出了关于这些细粒度并行优化的经典算法。
粗粒度并行优化面向多处理器,通过消除循环携带依赖来开发外层循环的粗粒度并行,并保证负载平衡以及最小的同步和通信开销。开发粗粒度并行性的具体方法如下:对于单个循环,采用数组私有化、对齐和复制消除循环携带依赖,采用循环合并增大并行粒度;对于紧嵌套循环,采用循环交换、循环反转和循环倾斜等方法在保证正确性的前提下将无迭代依赖的循环层移动到最外层,从而最大化并行性;对于非紧嵌套循环,需要先做多层循环分布,然后对新生成的循环嵌套进行并行化并尽量实施循环合并操作,以发掘更多并行性。
2)延迟优化技术
并行计算机系统中影响并行程序性能的延迟主要包括访存延迟和通信延迟。对这两种延迟进行优化的根本目的都在于提高对运算单元的供数能力。延迟优化技术分为两类:隐藏延迟技术和避免延迟技术。隐藏延迟和避免延迟技术虽然都能提高系统性能,但在本质上存在差异。隐藏延迟并没有减少实际的访存或通信次数,而是将访存或通信和计算分离,通过将它们重叠执行来隐藏延迟。避免延迟方法通过数据重新排序等方式增加存储器的数据局部性,减少访存或通信次数,从而降低供数延迟。由于从向运算单元供数的功能看来,通信操作可以理解为远程的访存操作,所以在程序实现级,通信延迟优化技术和访存延迟优化技术存在很多共同的程序优化技术。延迟避免技术主要通过循环变换和数据变换方法来实现,延迟隐藏技术中最典型的方法是采用软件预取优化方法。本书的第5章将结合SAR成像并行优化算法,详细研究并实现典型的延迟优化技术。