论文部分内容阅读
计算流体力学(Computational Fluid Dynamics,CFD)采用数值计算方法求解流动控制方程以发现各种流动现象和规律,已广泛应用于航空航天等领域。随着数值模拟的几何外形、物理模型日益复杂,流动机理研究越来越精细,CFD计算的规模和复杂度空前增长,迫切需要利用高性能计算机实现高效CFD并行计算以提升CFD应用效率。近年来,随着图像处理器(Graphics Processing Unit,GPU)浮点运算性能和可编程性的提升,采用CPU/GPU异构体系结构成为构造高性能计算机系统的一种趋势。尽管异构体系结构能够在兼顾通用性和效能的同时大幅提升系统性能,但复杂的硬件架构要求研究者综合利用多种编程模型以挖掘多层次并行性,对高效CFD并行应用开发带来了极大的挑战。本文面向CPU/GPU异构体系结构和典型CFD应用,围绕大规模、高效CFD异构协同并行计算关键技术开展研究,重点研究了CFD应用异构协同并行编程框架、并行算法和性能优化、负载均衡等问题。论文的工作包括:(1)针对多区块结构网格CFD计算的特点,提出了适应大型CPU/GPU异构系统的TLCF三层异构协同编程框架。综合MPI、Open MP和CUDA编程模型,给出了TLCF框架的三种实例:嵌套Open MP的TLCF框架(NOMP-TLCF)、Open MP异步执行的TLCF框架(OMPAE-TLCF)以及MPI异步执行的TLCF框架(MPIAE-TLCF)。通过分析这三种编程框架的优缺点,发现NOMP-TLCF编程框架更适用于大规模异构并行系统上CFD应用的开发。(2)针对计算流体力学中格子Boltzmann方程的求解,研究其在CPU/GPU异构并行系统上的并行算法。首先,针对算法中的碰撞、迁移及边界处理过程,构建了基于网格单元映射的单GPU并行方法;在传统的依赖共享存储(AS)算法基础上,提出直接存储(AD)算法以适应单GPU访存方式的发展。然后,根据CPU和GPU的协同方式及通信与计算重叠的程度,分别提出了基本并行LBM-base算法、通信与计算重叠并行LBM-overlap算法、CPU/GPU协同计算并行LBM-hybrid算法。算法性能的理论分析和测试结果表明,相对AS算法,AD算法能采用更多线程配置,获得更好性能。相对于两个6核CPU,格子Boltzmann方法在单GPU上可获得17倍的性能加速比。多计算节点的并行性能测试结果显示,相对于单个计算节点,性能最好的LBM-hybrid并行算法在128个计算节点上能获得82.0%并行效率。(3)针对计算流体力学中的Navier-Stokes方程的求解,研究其在CPU/GPU异构并行系统上的并行算法。首先,提出了基于网格单元的细粒度单GPU并行算法;为消除无粘项求解过程中的数据依赖,提出了冗余计算方法和内核函数分解方法。然后,基于NOMP-TLCF编程框架提出了基于网格区块的粗粒度并行算法,并通过流与异步执行的方式重叠数据传输与GPU计算过程,减少CPU与GPU之间数据传输的开销。针对计算节点内不同处理部件的计算能力和存储能力的差异,提出了Out-of-Core方法以增加单个节点上的模拟规模。进一步的,我们提出了TCBO和TCBL两种传输策略,降低计算节点间的数据通信开销。数值实验验证了异构并行算法的正确性,相对于单核CPU,GPU的性能加速比在8倍左右;相对于两个6核CPU,单GPU能获得约1.85倍的性价比优势;强扩展性和弱扩展性测试结果都表明该并行算法有较好的加速比和并行效率。(4)从粗粒度和细粒度两个方面,研究了CPU/GPU异构并行系统的负载均衡策略。在粗粒度负载均衡方面,对于多区块结构网格Navier-Stokes方程的求解,考虑了不同处理单元的计算性能差异以及通信对应用性能影响,提出了基于性能模型的静态负载均衡策略。然后,为消除性能模型中的若干假设,提出了基于预取的任务窃取动态调度算法。实验测试表明,两种负载均衡算法都能较好的均衡处理单元之间的负载。在细粒度负载均衡方面,针对稀疏矩阵向量乘的求解,研究其在采用不同稀疏矩阵存储格式时GPU的性能,指出当矩阵各行非零元个数相差较大时,同一线程束内的线程存在着负载不均衡。基于稀疏矩阵的JAD和ELLPACK-R存储格式,提出了ELLPACK-RP混合存储格式以平衡GPU线程间负载。实验表明,当矩阵各行非零元个数相差较大时,相比于ELLPACK-R,ELLPACK-RP在NVIDIA GTX 280能提升40%的性能。