基于GPU集群的大规模三维有限差分正演模拟并行策略
廉西猛, 张睿璇
中国石化胜利油田分公司 物探研究院, 山东 东营 257022

作者简介: 廉西猛(1983-),男,山东济宁人,博士,工程师,主要从事地震勘探软件研发和地球物理方法研究。

摘要

三维弹性波动方程有限差分正演模拟的低效率问题是导致该算法无法在大规模实际生产中应用的最重要的原因,使用GPU平台进行加速又面临GPU显存的限制。针对这一问题,提出了一种基于CPU/GPU的异构集群环境的并行加速解决方案。通过使用CPU/GPU协同并行模式和区域分解方法,实现了该算法的多级并行策略,并提出了非阻塞通讯、存储优化和基于MPI-IO的并行读写等方法,对程序的执行效率和存储使用进行了优化,为大规模实际生产应用提供了有效支撑。

关键词: 大规模三维正演; CPU/GPU集群; 区域分解; 存储优化; 并行读写
中图分类号:P631.4 文献标志码:A 文章编号:1000-8918(2015)03-0615-06
Parallel strategy of large-scale 3D seismic forward by finite difference method on GPU cluster
LIAN Xi-Meng, ZHANG Rui-Xuan
Shengli Geophysical Research Institute of SINOPEC,Dongying 257022,China
Abstract

Because of low efficiency,seismic forward simulation of 3D wave equation by finite difference method cannot be applied to real large-scale product.To deal with this problem,the authors present a parallel accelerating solution based on multi-GPUs heterogeneous cluster.By using CPU/GPU cooperation parallel mode and domain decomposition method,the authors carry out a multi-level parallel strategy of this algorithm.Furthermore,non-blocking MPI communications,storage optimization and parallel I/O mechanism using MPI-IO API are presented to optimize computation efficiency and memory usage.This parallel 3D forward algorithm can effectively support large-scale practical production.

Keyword: large-scale 3D seismic forward; CPU/GPU cluster; domain decomposition; storage optimization; parallel I/O

众所周知, 正演模拟在地震资料采集、处理和解释、储层建模、油气藏开发等环节, 都扮演着重要的角色, 其应用贯穿了石油勘探开发的整个流程。特别是大规模三维正演模拟, 随着勘探开发的深入, 其应用需求越来越巨大。

有限差分方法是波动方程地震波正演模拟的重要方法之一, 其实现简单, 精度较高, 因此成为目前使用最广泛的方法。三维波动方程有限差分正演模拟方法的理论基础已经十分成熟, 包括了声波, 弹性波、粘弹性以及各向异性、非均匀等各种波动方程, 普通网格, 交错网格以及旋转交错网格等多种网格类型, 都有大量的文献进行了深入的研究[1, 2, 3]。然而理论的成熟与生产实用化之间还存在巨大的鸿沟— — 计算效率。在实际生产中, 需要进行模拟的区块往往十分庞大, 由此定义的网格剖分点数量也特别巨大。由于有限差分正演算法需要在空间每个网格点上都应用差分格式计算, 因此计算量十分庞大。经测试, 计算一个面积为1 010 m× 1 010 m, 采样点数为2 000的区块, 剖分网格大小为10 m× 10 m× 10 m, 使用CPU串行计算一个单炮的时间就超过24 h, 这样的效率在实际生产中是不能容忍的。

幸运的是, 有限差分方法具有很高的可并行性, 在进行时间步更新时, 各个网格点的计算是相互独立的, 都只依赖于已经计算出的上一次的若干个网格点的值, 因此各网格点的计算可以并行执行。因此, 许多文献都提出了基于CPU+GPU异构平台的优化加速技术, 如王延光[4], 刘红伟[5], 李博[6]等对叠前逆时偏移有限差分算法在GPU设备上的并行实现策略进行了研究, 可是只采用了单个GPU模拟一个单炮的方式。GPU具有极强的计算能力, 适合于密集型的计算, 缺点是GPU的内存相比CPU较小, 无法满足大规模三维正演模拟的巨大内存需求。为了解决这一两难局面, 区域分解技术被广泛的应用。该技术的核心思想是将计算区域分割并分配到多个计算机节点上计算, 以达到分摊单个GPU内存压力的目的。Miché a[7]针对三维弹性波常规网格高阶有限差分正演算法, 提出了多GPU并行策略, 使用了MPI非阻塞通讯实现了消息传递时间的隐藏。Miché a同时研究了该正演算法的CPML边界条件, 但并未讨论CPML边界条件在GPU上的实现方法。

Komatitsch[8]应用区域分解方法研究了有限元方法在多GPU环境上的并行实现策略。龙桂华[9]参考Miché a的区域剖分方法, 将研究对象扩展到三维交错网格有限差分正演模拟算法尺度三维地震波场模拟问题。刘守伟[10]将区域分解方法应用到三维声波方程逆时偏移算法中, 根据GPU设备是否具备卡间直连(GPU Direct)通讯功能, 分别讨论了其区域分解方法的实现方式。针对吸收边界条件在GPU上的实现, 刘守伟选用了NPML(Nearly PML)边界条件。在该条件下, 吸收层的控制方程的二阶微分部分与内部区域一致, 从而避免了一部分分支判断, 一定程度上提高了GPU的实现效率。

笔者根据有限差分方法的特点, 在以上研究的基础上, 对多GPU集群并行策略进行了进一步的优化。使用区域分解方法和CPU+GPU的异构并行模式, 通过MPI+CUDA的多核异构并行编程方式, 实现了基于GPU集群的多级并行策略, 并提出了MPI非阻塞通讯、存储优化和基于MPI-IO的并行读写等方法对算法进行了优化。在下一节, 将详细地论述这一策略, 第3节中将通过应用实例验证策略的并行加速效果。

1 基于GPU集群的多级并行策略

基于弹性波方程高阶有限差分正演数值模拟算法, 使用的高阶有限差分格式为

fx=1Δxn=1NCn(N)fx+Δx22n-1)-fx-Δx22n-1)+OΔx2N)

其中:差分系数 Cn(N)可以通过求解一个N阶方程组确定。

三维弹性波正演模块的主要流程如图1所示, 其核心算法主要包括单炮循环、时间步循环以及对空间网格结点的循环等多个级别的循环。各单炮的计算是各自独立的, 因此这一级循环可以进行并行, 目前的正演算法大都采用MPI实现了这一级别的并行, 多个CPU进程同时运算, 每个进程完成一个单炮的计算。时间步的循环是不能进行并行化的, 因为每个时间层的计算都依赖于其上一时间层的结果。依据有限差分正演算法的特点, 空间网格结点的循环包含了程序95%以上的计算量, 并且各节点的计算都是独立的, 因此适合使用GPU进行并行加速。但是GPU的显存较小, 而生产中的大规模正演的单炮模拟需要占用大量的内存, 单个GPU无法满足需求, 因此我们采用了区域分解方法, 即将要模拟的区域进行分割, 分成若干个子区域, 这样每个子区域上的模拟计算的内存需求都不会太大, 单个GPU可以满足。这种方案既分摊了内存压力, 又可以并发执行各个子区域上的计算。

图1 限差分正演算法CPU串行流程(Nx, Ny, Nz分别表示在空间三个方向上的网格点个数, Nt表示时间步个数)

根据以上分析, 基于异构平台, 结合正演算法的特点, 文中设计了如图2所示的多级并行策略。按照并行的层次和方式, 将其分成了单炮级、区域级和结点级三个级别, 分别使用了MPI进程组间、MPI进程组内进程和GPU线程进行实现。

图2 多级并行策略

1.1 单炮级并行

单炮级并行使用MPI进程组间并行来实现。按照每个CPU进程(对应一个GPU设备, 如果GPU设备具备卡间直连通讯功能, 可以对应多个可直连的GPU设备)负责计算一个子区域的原则, 根据子区域的个数确定每一个单炮计算需要的进程数, 然后将所有进程按此进程数分成若干个进程组, 将需要计算的所有炮平均分配到每个进程组上计算。每个进程组可以视为单个进程, 进程组之间相互独立, 互不依赖; 进程组内各进程的计算并不完全独立, 需要在通讯域内相互传递数据。组内进程协调合作, 共同完成一个单炮的计算。

1.2 区域级并行

区域级并行使用区域分解方法以及MPI进程组内并行来实现。文中以一个方向上的区域分解方法为例, 该方法可以推广到在三个方向上都进行分解。根据计算区域的大小, 确定分解子区域的个数, 保证每个子区域的计算所需内存小于GPU的显存。在对区域进行平均划分之后, 进程组中的每个进程负责一个子区域的运算。

但是子区域的计算并非完全独立并行执行的。由于差分格式的限制, 每个结点的计算都需要用到该结点上下、左右、前后六个方向的若干个点的波场值, 因此对于每个区域的边界附近的结点, 其计算需要用到相邻区域的结点的波场值。因此我们在每个子区域上附加一个辅助区域(如图3中A标记区域), 宽度等于差分格式阶数的1/2个网格间距。该区域用来接收相邻区域中B标记的部分传递来的波场值。图3给出了各个区域之间的数据传递示意。一旦区域间的数据传递完成, 各个子区域上的计算就可以相互独立地并发执行。

图3 MPI通讯域组内各进程间的数据交换(图中标记中的数字表示子区域的编号, A、B、C分别代表用于接收数据的辅助分块、用于发送数据的分块和剩余分块, R(L)表示分块位于子区域的右(左)侧)

图4 为隐藏消息传递时间设计的实现流程

数据传递的时间将会大大降低计算效率, 因此我们设计了如图4所示的方案, 让数据传递时间与计算时间同时进行, 从而隐藏数据传递的时间。执行流程为:首先在GPU上计算需要交换的部分(B标记部分)的波场值, 传回CPU后由CPU启动MPI非阻塞发送(接收)。启动后, 程序并不等待发送(接收)操作完成, 而是立即返回, 执行下一指令--在GPU进行子区域剩余部分(C标记部分)的计算, 而CPU同时在进行发送(接收)数据的任务, 这样CPU收发数据的时间与GPU计算C标记部分的时间就相互重叠, 从而达到隐藏数据传递时间的目的。

无论GPU设备是否具备卡间直连(GPU Direct)通讯功能, 此种数据传递方式都可以使用, 因此适合配置了多种不同系列GPU设备的集群环境。

区域分解引发的另一个问题是集群多节点对同一文件的读写访问。一般采用的方式(如图5左图所示)是设置一个节点专门负责读写文件。读文件时, 读写节点从文件读取所有数据, 然后根据需求将数据分发给其他计算节点。计算结束后, 读写节点从各个计算进程收集数据, 合并之后写出到文件。由于需要进行文件传递, 这样的读写方式效率较低。根据区域分解方法的特点, 我们使用了MPI-IO机制实现了多节点并行读写(如图5右图所示), 即不再设置专门的读写节点, 而是为每个节点在文件中指定其读写位置, 各个节点并行的从该位置读写数据, 这样可以省去数据传递的过程, 从而提升读写的效率。

图5 读写方式示意

1.3 结点级并行

结点级的并行依赖GPU线程实现。子区域上的计算主要是对区域内的每个网格结点应用差分格式, 其中包含大量的数学计算, 属于密集型计算任务, 正符合GPU擅长处理密集计算的优点。

GPU使用线程格(Grid)和并行线程块(Block)来管理线程, 目前CUDA仅支持二维的线程块数组。而有限差分方法对网格结点的循环计算涉及了三个维度, 在使用CUDA将算法迁移到GPU设备上时, 需要将三维空间沿x方向进行切片, 每个yz平面为一个切片。线程块Block中的每个线程完成切片上一个结点的计算。GPU每次并行计算一个切片, 沿x方向循环计算, 直到所有切片计算完成。

在吸收边界条件上, 我们使用了CPML边界条件[11], 该边界条件使用了复频移技术, 可以有效地瞬逝波和掠射波。在CPML边界条件中, 内部区域和各个PML区域的计算所基于的微分方程形式都不相同, PML区域的微分方程比内部区域的微分方程多了若干了辅助变量。目前的处理方式是在每个时间步将各个PML区域与内部区域分开进行计算和更新, 这种方式下程序中存在许多分支语句, 不利于向GPU平台移植。Toivanen[12]深入讨论了这种处理方式在GPU中实现策略, 提出了几种优化方案, 但这些方案或者分支过多引起线程发散, 或者各个区域串行实现, 计算效率都不够理想。笔者提出了一种基于存储优化的GPU实现方法。首先通过在内部区域设置零值辅助变量 , 统一内部区域和PML区域的微分方程形式, 然后使用存储优化方法来降低内存需求。这里的存储优化指的是内部计算区域中的引入的零值辅助变量并不全部存储, 而只为一个切片上的零值辅助变量开辟内存。较之前一种方法, 该方法具有显著的优势, 在只增加了少量内存需求的情况下, 达到了避免分支判断, 提高效率的目的。

2 应用实例

我们配置了一个CPU/GPU异构机群进行实例测试。使用了5个计算节点, 每个节点配置了12核CPU, 并载两个GPU卡设备。CPU均为Intel Xeon X5650, 主频为2.67 GHZ, 内存为24 GB; GPU设备均为Tesla M2090, 每个GPU的显存为6 GB。每一个单炮都设置了6条检波线, 检波线间距为100 m。每条线有20个检波点, 检波点间距为50 m, 炮间距为100 m, 采样点数为2 000。计算使用的网格大小为10 m× 10 m× 10 m, 时间步长为0.5 ms。若只使用单个CPU进程进行一个单炮的模拟需要约192.5 小时。

对单炮进行模拟时, 我们测试了将计算区域分解成不同数目的子区域的情况下的计算效果。在上述观测系统条件下, 如果不进行区域分解, 将需要约11.5GB的存储空间, 远远大于GPU设备的显存, 程序会因为内存溢出而终止。因此我们分别测试了将区域分解成2~10个子区域的情形, 使用与子区域个数相同的CPU进程数, 每个进程控制一个GPU。

图6展示了使用CPU串行和使用本文算法正演得到的炮记录, 可以发现二者是一致的。更进一步, 我们使用下面的误差公式计算得到二者的误差满足

ε=max1< i< nt[j=1ns(Ucpuij-Ugpuij)2]12[j=1ns(Ucpuij)2]12< 1.3584e-7,

式中:nt表示炮记录中的总道数, ns表示每一道的采样点数。此误差在允许误差的范围内, 不会对结果产生影响。

图7中比较了CPU内存、GPU内存、检波线方向网格点数、计算时间和加速比等参数, 为了研究其变化趋势, 我们将GPU内存的数值除以10, 加速比(此处等于Ti/Ti-1, Ti为子区域个数为i时的计算时间)的数值乘上了1 000, 将所有参数绘在同一张图中。从图中可以看到, 随着分解数目的增多, 每个进程计算区域的大小在不断减小, 因此所需的CPU内存和GPU显存也持续递减, 达到了分摊内存的目标。这同时使得每个GPU内核的计算时间也相应的减少, 因此总的计算时间也减少, 这一点从加速比大于1也可知。但是加速比并不与子区域个数的增加成比例, 这是因为区域分解导致了数据传递时间的增加, 抵消了一部分GPU内核计算时间的减少。随着子区域个数的增加(如图6中子区域数目增加到8个), 这部分数据传递时间也显著增加, 增加量逐渐超过GPU内核计算时间的减少量, 进而导致总的计算时间不降反升, 加速比也开始小于1, 并逐渐降低。因此子区域数目过多, 会导致GPU利用率降低, 不能发挥GPU的优势, 从而影响计算效率。

图6 正演模拟结果对比

图7 使用不同子区域数目的测试实例对比

3 结论

为了解决三维正演模拟算法在大规模实际生产的应用问题, 笔者提出了一套解决方案。首先使用CPU/GPU异构并行方法提高计算效率。但GPU显存较小, 无法计算大尺度问题, 于是使用区域分解方法, 将巨大的内存需求分摊到多个GPU设备上。区域分解方法又增加了数据传递时间, 并导致了多节点竞争读写同一文件的问题, 我们采用MPI非阻塞消息收发和MPI-IO并行读写方法将它们解决。最后通过存储优化方法, 很好的解决了GPU上CPML边界条件的处理问题。这样形成的具有三级并行策略的三维正演算法能够为大规模实际生产应用提供有力支持。

致谢:感谢单联瑜教授和隋志强教授对本文研究成果的指导和帮助。

The authors have declared that no competing interests exist.

参考文献
[1] Xia F, Dong L G, Mz Z T. The numerical modeling of 3-D elastic wave equation using a high-order, staggered-grid, finite difference scheme[J]. Applied Geophysics, 2004, 1(1): 38-41. [本文引用:1]
[2] 张文生, 宋海斌. 三维正交各向异性介质三分量高精度有限差分正演模拟[J]. 石油地球物理勘探, 2001, 36(4): 422-432. [本文引用:1]
[3] 杨仁虎, 常旭, 刘伊克. 基于非均匀各向同性介质的黏弹性波正演数值模拟[J]. 地球物理学报, 2009, 52(9): 2321-2327. [本文引用:1]
[4] 王延光, 匡斌. 起伏地表叠前逆时深度偏移与并行实现[J]. 石油地球物理勘探, 2012, 47(2): 266-273. [本文引用:1]
[5] 刘红伟, 李博, 刘洪, . 地震叠前逆时偏移高阶有限差分算法及GPU实现[J]. 地球物理学报, 2010, 53(7): 1725-1733. [本文引用:1]
[6] 李博, 刘红伟, 刘国峰, . 地震叠前逆时偏移算法的CPU/GPU实施对策[J]. 地球物理学报, 2010, 53(12): 2938-2943. [本文引用:1]
[7] Michéa D, Komatitsch D. Accelerating a 3D finite-difference wave propagation code using GPU graphics cards[J]. Geophys J Int, 2010, 182(1): 389-402. [本文引用:1]
[8] Komatitsch D, Erlebacher G, Göddeke D, et al. High-order finite-element seismic wave propagation modeling with MPI on a large GPUcluster[J]. J Comput Phys, 2010, 229(20): 7692-7714. [本文引用:1]
[9] 龙桂华, 赵宇波, 李小凡, . 三维交错网格有限差分地震波模拟的GPU集群实现[J]. 地球物理学进展, 2011, 26(6): 1938-1949. [本文引用:1]
[10] 刘守伟, 王华忠, 陈生昌, . 三维逆时偏移GPU/CPU机群实现方案研究[J]. 地球物理学报, 2013, 56(10): 3487-3496. [本文引用:1]
[11] Roden J A, Gedney S D. Convolution PML ( CPML): An efficient FDTD implementation of the CFS-PML for arbitrary media[J]. Microwave and Optical Technology Letters, 2000, 27: 334-339. [本文引用:1]
[12] Toivanen J I, Stefanski T P, Kuster N, et al. Comparison of CPML implementations for the GPU-accelerated FDTD solver[J]. Progress In Electromagnetics Research M, 2011, 19: 61-75. [本文引用:1]