背 景

由杰克 R.爱德华博士领导的北卡州立大学航空航天工程计算流 体力学实验室,重点发展高级物理模型和算法,用于大规模模 拟多种流体现象,例如波音747上的跨音速流建模。

最近,实验室进行了一项基于GPGPU计算技术的研究,尝试使 用OpenACC移植一个叫做INCOMP3D的三维不可压纳维尔斯 托克斯方程求解器,希望提高代码的可维护性和可移植性。原 有CPU代码使用的现有求解器已经被一系列模型问题所检验。

INCOMP3D的移植工作是一个多学科合作设计研究项目的一 部分,该项目的发起人是弗吉尼亚理工学院的冯博士和包括 爱德华博士在内另外七位教授。先行研究四个计算流体力学

(CFD)代码(弗吉尼亚理工学院的SENSEI、GenIDLEST和 北卡州大的INCOMP3D、RDGFLO),作为向GPGPU上移植 历史代码的范例。

在GPGPU上良好的线性求解器设计起来十分困难,雅可比矩阵 填充的直观算法在GPGPU上效率极低,这个GPGPU计算研究 项目就是要克服这些根本限制。

挑战

罗力翔,北卡州立大学航空航天工程计算流体力学实验室的研 究人员,机械工程师出身,主攻流体力学和控制系统的数值算 法。接手这个项目之前,他有MPI和OpenMP的扎实基础,但 GPU编程知识非常有限。“根据我们的专长,OpenACC是一个 好的选择”,他说。“然而,队员们曾怀疑投入时间和精力去开 发OpenACC版本代码是否能够提供进一步优化性能的空间。”

解决方案

罗力翔说,INCOMP3D和完全INCOMP3D版本都用到线性求解器,在求解器的开发过程 中,OpenACC起到了至关重要的作用,使他能 够用少量、简单的语句翻译数学公式,而且不 用操心GPU实现的细节。“在算法设计阶段不必 关心GPU实现的细节,这个特性非常有用”,他 说。“此外,OpenACC迫使我书写步骤清晰的算 法,从而避开那些CUDA代码中常见的并行编程 陷阱。”

采用OpenACC,罗力翔团队一次就能够移植程 序的一个循环,节省了大量时间。由于每一步都 能单独验证,还减少了那些难于定位的漏洞。

此外,采用OpenACC能够增进项目过程中的合 作。OpenACC可以保持模块化结构中的大部分 代码,计算内核依然位于原来的代码位置,极大 地提高了可读性。没有任何GPU编程经验的工程 师也可以在必要的时候修改移植后的代码,不需 要原程序员的太多协助。

“在INCOMP3D项目研究过程中,我迅速掌握 了OpenACC”,他说。罗力翔也学习过CUDA Fortran和CUDA C,他在第二阶段研究中用到它们。

成果

采用OpenACC,仅用5人天,罗力翔和他的团队 就为INCOMP3D创建了一个简化的二维版本,极 大地减少了开发完全三维版本花费的精力。他们 对比了在英伟达M2050 GPU上和在一个英特尔 至强E5645 CPU核上的运行时间。性能加速数据 是从弗吉尼亚理工学院的Hokiespeed集群实测得 到的,该集群配置如下:

2×英特尔至强5645@2.4G

24 GB内存

2×英伟达M2050

PGI v13.8

支持CUDA的OpenMPI v1.8.3和MVAPICH2 v1.8

与一个CPU核相比,GPU上的整体加速达到12 倍。在主体循环计算过程中,相关数据一直驻留 GPU,因此数据传输时间短到可以忽略。

“OpenACC是科学计算的新星”,罗力翔说。“如 果用CUDA或OpenCL写同一个程序,编码工作 将花费多几倍的精力,更不必说项目延期和多得 多的错误。”

配备一个高度优化的BILU线性求解器,INCOM-P3D有资格称为第一个在GPU上取得重大加速的 全隐式三维CFD求解器。

“我们的研究证实,相悖于很多计算流体力学业 内人士认为的想法,全隐式CFD求解器其实在 GPU上运行得非常好,但是你必须采用恰当的 细粒度算法”,罗力翔说。“我们计划普遍化一 些针对全隐格式的算法,希望以它们为基础模 块,移植更多的产品级别的CFD代码到有前途的GPGPU架构上。”

罗力翔补充道,“在GPU上编写全隐式CFD求解 器,OpenACC是一个非常高效的工具,用它取 得了12倍的加速。我相信,当人们认识到GPU 能够非常有效地运行隐式格式的时候,GPU和 OpenACC将会有一个更加灿烂的未来。”