1. 多GPU环境下CFD模拟的性能可移植性挑战在当今高性能计算HPC领域计算流体动力学CFD模拟已成为航空航天、汽车工程和环境科学等众多领域不可或缺的工具。随着GPU加速计算成为主流如何在不同的GPU架构上实现高性能的CFD模拟代码运行即所谓的性能可移植性成为了研究人员和工程师面临的核心挑战。性能可移植性不仅仅是指代码能够在不同硬件上运行更重要的是能够在各种架构上保持接近最优的性能表现。这对于CFD模拟尤为重要因为现代CFD模拟通常需要处理数百万甚至数十亿的网格节点不同机构可能使用不同厂商的GPU硬件长期运行的CFD项目可能面临硬件更新换代的问题以SOD2D框架为例这是一个基于谱有限元方法SEM的CFD求解器专门设计用于可压缩流体的高分辨率模拟。它采用OpenACC指令集和MPI并行化目标是在多核CPU和多种GPU架构上实现高效运行。然而我们的测试发现相同的代码在NVIDIA V100和AMD MI250X GPU上的性能差异可能高达15倍以上——这正是性能可移植性问题的典型体现。2. SOD2D框架的核心架构与计算热点分析2.1 物理模型与数值方法SOD2D求解的是可压缩Navier-Stokes方程组包括质量守恒、动量守恒和能量守恒方程。这些方程描述了流体流动的基本物理规律∂ρ/∂t ∇·(ρu) 0 质量守恒 ∂(ρu)/∂t ∇·(ρu⊗u) - ∇τ -∇p f 动量守恒 ∂E/∂t ∇·((Ep)u) - ∇·(τu) - ∇(κ∇T) S 能量守恒在空间离散化方面SOD2D采用了谱有限元方法SEM这是有限元方法FEM的一种高阶变体。与传统的FEM相比SEM在每个单元内部使用非均匀分布的节点并采用Gauss-Lobatto-Legendre积分规则使得积分点与网格节点重合从而提高了计算效率。时间积分则采用四阶Runge-KuttaRK4方法。这种时间离散化方法具有良好的数值稳定性和精度但需要在每个时间步计算四次右端函数值增加了计算量。2.2 计算流程与性能热点SOD2D的执行流程可以分解为以下几个主要阶段初始化阶段读取输入参数建立网格连接关系分配内存等时间步进循环每个时间步包含四个RK子步残差计算在每个RK子步中计算对流项和扩散项残差场量更新根据计算的残差更新流场变量通过性能分析工具如Rocprofv3和Omnitrace的剖析我们发现SOD2D的计算热点主要集中在两个核心内核full_convec对流项计算占总运行时间的50-70%full_diffusion扩散项计算占总运行时间的10-22%特别是对流项计算内核由于涉及复杂的非线性项和大量的内存访问成为了整个模拟的性能瓶颈。这也正是我们优化工作的重点所在。实际测试中发现在AMD MI250X上对流项内核的运行时间占比甚至高达70%比在NVIDIA GPU上更高这表明不同架构对同一代码段的执行效率存在显著差异。3. 多级设计空间探索方法论3.1 设计空间的层次结构为了系统地分析SOD2D的性能可移植性我们采用了多级设计空间探索方法将优化参数分为四个层次运行时参数层单精度FP32与双精度FP64计算模式网格规模从1M到16M节点时间步长设置内存访问优化层预加载策略Preloading预取策略Prefetching内存访问模式优化内核拆分Kernel Splitting软件基础设施层编译器选择NVHPC v24.5 vs Cray Clang v17.0.1OpenACC指令优化MPI通信优化硬件基础设施层GPU架构NVIDIA V100/A100 vs AMD MI250X单GPU与多GPU配置内存层次结构特性这种分层方法使我们能够系统地分析不同层次的参数如何影响整体性能以及这些影响在不同硬件平台上的差异。3.2 关键优化策略详解3.2.1 内存访问优化技术预加载Preloading优化 预加载是一种常见的内存访问优化技术其核心思想是将全局内存中的数据提前加载到更快的存储层次如寄存器或共享内存中。在SOD2D中原始代码已经实现了基本的预加载策略即在计算开始前将全局数组中的数据加载到每个元素的私有缓冲区中。然而我们的测试发现预加载并不总是带来性能提升。在某些情况下特别是对于AMD GPU和双精度计算取消预加载no_prl版本反而能获得更好的性能。这可能是因为预加载引入了额外的数据移动开销现代GPU的缓存层次结构已经能够有效处理不规则内存访问预加载增加了寄存器压力可能影响并行度预取Prefetching优化 预取是通过OpenACC的cache指令显式地将数据提前加载到缓存中。我们发现预取的效果高度依赖于数据访问模式对于大型全局数组范围预取效果有限对于已经预加载的局部数组在深层嵌套循环中进行预取可以获得1.24倍的加速最佳预取策略与GPU架构密切相关内核拆分Kernel Splitting 原始的对流项计算内核同时处理质量、动量和能量方程导致较高的寄存器压力。通过将该内核拆分为三个独立的内核我们观察到在AMD MI250X上FP32计算获得1.5倍加速在NVIDIA V100上FP64计算也有显著改善但某些情况下拆分会增加总体内核启动开销3.2.2 内存访问模式优化原始代码中存在大量间接内存访问形式为rho(connec(ielem,invAtoIJK()))其中connec是网格连接矩阵invAtoIJK是索引线性化函数这种访问模式会导致内存访问不连续缓存利用率低内存事务合并效率差我们通过预计算并存储connec(ielem,invAtoIJK())的结果将其组织为全局矩阵显著改善了内存访问的连续性。优化后的访问模式虽然增加了内存占用约18倍但在多数情况下提高了内存带宽利用率。4. 跨平台性能评估与分析4.1 单GPU性能对比我们在三种GPU平台上进行了全面的性能评估NVIDIA Tesla V100-PCIE-32GBNVIDIA A100AMD MI250X单GCD测试使用了Channel Flow通道流案例网格规模从1M到16M节点涵盖了单精度和双精度计算。以下是关键发现性能差异在FP32模式下AMD MI250X比NVIDIA V100慢15.83倍8M节点在FP64模式下差距缩小到5.23倍NVIDIA A100在FP64模式下比V100快3.05倍优化效果 下表总结了不同优化策略在不同平台上的最佳适用情况优化策略NVIDIA V100 (FP32)NVIDIA A100 (FP64)AMD MI250X (FP32)预加载不推荐推荐视情况而定预取效果有限显著提升(1.63x)显著提升(1.42x)内核拆分性能下降性能提升性能提升(1.5x)访问优化效果有限效果有限效果有限4.2 多GPU扩展性分析在LUMI超级计算机上我们进行了弱扩展测试每个GPU约1M节点。使用GNOPSGiga Node Operations Per Second作为性能指标GNOPS (总网格节点数 × RK步数 × 总时间步数) / 运行时间(ns)主要发现不同优化策略的扩展性差异显著在64 GPU规模上最优配置与32 GPU时不同选择不当会导致23.8%的性能损失FP32计算的吞吐量平均比FP64高1.22倍对于统一内核无预加载版本no_prl在所有GPU配置上表现最佳这些结果表明在小规模测试中表现良好的优化策略在大规模运行时可能并非最优选择这突显了性能可移植性调优的复杂性。5. 性能可移植性实践建议基于我们的研究为开发高性能、可移植的CFD代码我们提出以下建议采用分层优化方法先确保算法层面的高效性再进行架构特定的微调最后实施平台相关的优化内存访问优化优先级首先解决内存访问的连续性然后考虑数据局部性最后尝试预取等高级技术多平台验证在开发的早期阶段就在不同架构上测试建立自动化测试框架记录不同平台上的性能特征参数化优化策略将关键优化参数如gang数、向量长度设为可配置使用自动调优工具如OpenTuner寻找最优参数为不同平台维护不同的参数预设代码模块化设计将计算密集型内核与平台相关代码分离为不同架构提供替代实现使用编译时分支选择适当实现对于使用OpenACC的开发人员我们特别建议谨慎使用cache指令其效果高度依赖具体硬件尝试不同的gang和vector参数配置考虑使用kernels构造而不是parallel loop以获得更好的可移植性6. 实际应用中的经验教训在REFMAP项目的实际开发过程中我们积累了一些宝贵的经验寄存器压力的影响 在AMD MI250X上我们发现寄存器使用情况对性能有显著影响。当平均VGPR向量通用寄存器使用量接近最大值128时性能会明显下降。这促使我们实施内核拆分策略有效降低了寄存器压力。编译器差异 不同厂商的编译器对OpenACC指令的解释存在差异。例如NVIDIA的nvhpc编译器对loop指令的优化更为激进Cray的Clang编译器在某些情况下能生成更高效的AMD GPU代码相同的OpenACC代码在不同编译器下可能产生不同的性能特征功耗限制的影响 LUMI集群上的AMD MI250X GPU运行在400W的功耗限制下低于其标称的500W。这导致了约15%的性能损失在比较不同平台性能时需要加以考虑。精度选择的影响 我们的测试表明精度选择不仅影响计算结果精度还显著影响性能可移植性在AMD GPU上FP64与FP32的性能差距比NVIDIA GPU小某些物理问题实际上可以用FP32获得足够精确的结果混合精度策略可能提供更好的性能可移植性这些经验突显了在实际HPC环境中实现性能可移植性的复杂性也说明了为什么简单的一次编写到处运行方法在CFD领域往往不够。7. 未来研究方向基于当前工作的发现我们认为以下几个方向值得进一步研究自动化性能可移植性优化开发能够自动适应不同硬件架构的智能编译器研究基于机器学习的参数调优方法探索运行时自适应优化技术新型编程模型评估比较OpenACC与SYCL、Kokkos等新兴编程模型研究特定领域语言DSL在CFD中的应用评估抽象编程模型的性能可移植性潜力混合精度算法的开发研究在CFD中智能使用不同精度计算的方法开发自动精度选择算法评估混合精度对性能可移植性的影响跨平台性能建模建立能够预测代码在不同架构上性能的模型开发性能可移植性度量标准研究硬件无关的性能特征提取方法能源效率考量研究性能可移植性与能源效率的关系开发考虑能耗的优化策略评估不同架构的能效比这些研究方向将有助于克服当前HPC领域的碎片化挑战使CFD等关键应用能够更有效地利用不断发展的异构建算资源。