论文部分内容阅读
并行是提高计算机性能的有效途径之一,并行技术可分为单处理器内的并行以及将多个处理器互连构成的并行两个层次。本文将单处理器内的并行称为结点内并行,将利用多个处理器互连构成的并行称为结点间并行。结点内并行的一种发展趋势是同时支持指令级并行和数据级并行,Stanford大学研制的Imagine流处理器是同时支持指令级并行和数据级并行的典型代表。结点问广泛应用的一种并行体系结构是分布共享存储(DSM)多处理机,其主要优势是可扩展性好并且并行编程模型简便。两个层次的并行性能的充分发挥都受到存储访问延迟和带宽的约束(所谓的“存储墙”问题)。对结点间并行,除了“存储墙”问题外,伪共享是严重影响并行性能的另一个问题。为了解决“存储墙”问题,当前的计算机大都采用层次存储结构。支持结点内并行的层次存储结构有Cache层次存储和流式层次存储(本文中统称为结点内层次存储),其中,Cache层次存储强调降低存储延迟,流式层次存储则强调提高存储带宽。支持结点间并行的层次存储(简称为结点间层次存储)在结点内层次存储的基础上增加远地内存,本文将由本地内存和远地内存构成的层次称为分布存储。层次存储结构的有效利用依赖于访存数据流的优化,有两种方法可以优化访存数据流:改变程序对内存单元的访问顺序和改变数据在内存中的布局。前一种优化方法起步早,相对较成熟,数据布局优化则是近年来研究较多的一种优化方法。本文面向结点内层次存储和分布存储,着重研究了通过优化数据的布局来有效利用各级存储器、优化访存数据流性能的编译优化方法。对强调提高存储带宽的流式层次存储,除了研究数据布局优化外,还研究了通过计算核心(kernel)合并来优化访存数据流的方法。本文的创新工作主要体现在如下几个方面:1)面向分布存储的访存数据流优化结合在软件分布共享存储(SDSM)系统上实现OpenMP并行编译器的过程中遇到的性能问题,研究了如何通过共享数组的合理布局来优化访存数据流的问题,提出了如下两种优化方法:①针对SDSM系统上大粒度共享单元(共享页)导致小共享数组的伪共享问题,以及大步长数组访问模式导致的共享页利用率低的问题,提出了共享数组交叉合并优化方法,此方法将程序中总是同时出现的多个共享数组按照一定的规则进行合并。测试结果表明,此方法能有效减少分布共享存储多处理机上小共享数组应用的伪共享、提高大步长数组访问应用的本地局部性。②针对某些SDSM系统上共享单元粒度较小(例如Cache块)以及OpenMP程序中共享数组分布的对准问题,分析了共享数组交叉合并优化方法的不足,提出了基于数据访问轨迹对准的数组融合方法。此方法能在数组合并的同时对准数组的访问轨迹,使得融合后的数组能提高Cache块等小粒度共享单元的利用率。对于大粒度共享页,此方法能对准共享数组的分布,减少处理机之间的通信。测试结果表明,基于数据访问轨迹对准的数组融合方法能够获得比共享数组交叉合并方法更高的性能提升。2)面向结点内层次存储的访存数据流优化面向结点内的Cache层次存储和流式层次存储,提出了如下访存数据流优化方法:①面向结点内的Cache层次存储,结合Fortran语言中并行语法成分的优化实现问题,提出了利用临时数据空间合并来提高编译器目标代码性能的优化方法,并在G95开放源码编译器中实现了这种优化。G95和Intel EFC编译器的对比测试结果表明,对Fortran语言中典型的并行语法成分——包含数组赋值语句的FORALL结构,临时数据空间合并优化能有效提高编译器产生的目标代码的性能。测试结果还表明,循环排序优化和临时数据空间合并优化的综合运用,进一步提高了目标代码的性能。②面向结点内支持数据并行的流式层次存储,分析了典型的流体系结构及其编程模型,提出了流分割和线性kernel合并两种优化方法,并使用Imagine软件模拟平台,测试了两种方法的优化效果。测试结果表明:流分割优化能显著提高带宽层次存储的利用率,改善流处理器内的并行;线性kernel合并优化能有效减少kernel的调用次数和流在各级存储器中切换所花费的时间,从而提高流应用在流处理器上的性能。