论文部分内容阅读
近30年来,伴随着并行计算机的出现,并行计算迅速发展。SMP(对称共享存储多处理机)是一类被广泛使用的并行计算机系统。OpenMP则是其上最流行的并行程序开发模型。OpenMP具有如下几个优点:基于线程从而有更小的额外开销;面向循环容易实现增量并行化;简单、可移植性好。但是同时OpenMP也面临着一些问题:应用范围窄、受到循环表达形式的约束、基于共享变量进行通信对获得高性能的程序提出了更高的要求。这说明即使共享存储模型的程序设计比分布式系统简单,在程序模型和体系结构之间依然有较大的差距。本文讨论OpenMP程序的相关编译优化技术以弥补这种差距。本文工作主要分为三个部分。首先是分析Open64编译系统的构成,明确其中翻译OpenMP涉及的模块,着重讨论了OpenMP的两个翻译过程:OpenMP Prelowering和MP Lowering。此处涉及了并行域管理、共享任务分担和同步以及环境变量等问题,是OpenMP编译的最核心部分。最后,讨论了运行环境的支持。第二部分讨论了如何将简单的fork-join模型的OpenMP程序转化为SPMD类型,以达到更高效地表达程序中并行性的目的。通过并行域的合并与扩张,来减少fork-join模型下线程管理的开销,并且利用Open64的全局过程间分析模块,实现跨越过程边界的并行块的重构,这样做的好处至少有两点:进一步增大并行块的范围,增加计算的粒度;通过将并行块提升到调用函数中,可以进一步对调用中的并行块进行合并,这样使进一步改善程序的结构成为可能。第三部分,首先从理论上分析了四类循环结构下各个调度方式的性能,为用户针对应用的特点选取合适的调度策略提供指导,然后提针对指导调度不能很好地适应递减型循环结构的问题,本文提出一种将指导调度和动态调度结合的改进的调度方式-combined,实验表明该方式有效地弥补了指导调度的上述缺陷。