fabrice dupros 2020年6月22日
基于物理的三维数值模拟越来越具有预测性,是提高对地震波传播等自然现象理解的重要工具。这些模拟是流行的油气工作流程的核心,如反向时间偏移(RTM)或全波反演(FWI)。地震波建模解算器需要利用PB级计算设施和芯片级的最新功能。这通常对应于在最大的计算设施中常规用于地震反演的数十万个高端计算核心。这些应用程序充分利用了可靠的软件堆栈和生态系统,包括优化的编译器工具链和数学库。
SPECFEM3D地震波建模
SPECFEM3D是致力于地震波建模的领先软件包[1]。主要作者D.Komatitsch(1970-2019年)因在多PB级系统的计算地球物理学方面的各种突破而获得了众多奖项,包括2003年的Gordon Bell超级计算奖[3]。
该代码是用Fortran95实现的,在很大程度上依赖于MPI库,尽管OpenMP多线程也可以作为一个选项使用。大多数MPI通信发生在相邻子域之间,以交换边界信息。在显式时间推进方案中,通信和计算的阶段是重叠的。谱元素法的计算量很大,内力的计算可能占应用程序运行时间的85%。该程序模拟声波(流体)、弹性(固体)、耦合声波和弹性波、多孔弹性波或地震波在任何六面体(结构化或非结构化)协调网格中的传播。例如,它可以模拟在沉积盆地中传播的地震波或任何其他区域地质模型。它也可用于无损检测或海洋声学。该代码可公开下载(https://geodynamics.org/cig/software/specfem3d/) 。
在AWS Graviton2上构建SPEECFEM3D
对于这项研究,我们认为最新版本的SPECF3D 3D Cartesian(2)可通过GIT库访问。我们将Arm编译器Linux(ACfL)与Arm性能库(ArmPL)和OpenMPI4.0.3一起使用。此应用程序的编译非常简单,无需修改源代码。Arm HPC用户组软件包Wiki上提供了更多详细信息以及编译SPECFEM3D_Globe版本代码的说明。https://gitlab.com/arm-hpc/packages/-/wikis/packages/specfem3d
# git clone --recursive https://github.com/geodynamics/specfem3d.git
# export FCFLAGS="-O3 -mcpu=native"
# ./configure FC=armflang CC=armclang MPIFC=mpif90 --with-mpi
# make
在AWS Graviton2上运行SPECFEM3D
我们考虑在示例/MESFHEM3DY/SimuleSimult/Script中的源代码中提供一个标准的三维基准。本例描述了具有地形、内部界面和网格加倍层的三维模型。三维网格如图1所示。由于使用内部网格,因此不需要Cubit软件包。此示例代表SPECFEM3D的标准用法。
图1:三维网格视图(六面体)。
我们调整了单节点和多节点运行的基准的大小。要修改的第一个文件是DATA/Par_file,其中通过设置NPROC变量指定计算中涉及的核数。出于基准测试目的,我们还设置了NSTEPS以指定timesteps,因为模拟挂钟时间与timesteps成正比:
# number of MPI processors
NPROC = 4
# time step parameters
NSTEP = 2000
DT = 0.03
类似地,我们调整DATA/meshfem3D_files/Mesh_Par_file以指定每个方向上的网格点数量。每个方向上网格点的数量必须可以被cores的数量整除。
# number of elements at the surface along edges of the mesh at the surface
# (must be 8 * multiple of NPROC below if mesh is not regular and contains mesh doublings)
# (must be multiple of NPROC below if mesh is regular)
NEX_XI = 64
NEX_ETA = 64
# number of MPI processors along xi and eta (can be different)
NPROC_XI = 2
NPROC_ETA = 2
同样在DATA/meshfem3D_files/Mesh_Par_file中,我们定义了模型的不同区域:
# number of regions
NREGIONS = 4
# define the different regions of the model as :
#NEX_XI_BEGIN #NEX_XI_END #NEX_ETA_BEGIN #NEX_ETA_END #NZ_BEGIN #NZ_END #material_id
1 64 1 64 1 4 1
1 64 1 64 5 5 2
1 64 1 64 6 15 3
14 25 7 19 7 10 4
运行SPECFEM3D
AWS M6g实例使用AWS自己的基于Arm Neoverse N1内核的Gravion2 SoC。在本研究中,我们使用了一个m6g.16xlarge实例。此实例具有64个Arm N1 CPU、一个25Gbps互连和一个运行速度为19Gbps的弹性块存储(EBS)文件系统。
数值验证
图2显示了通过执行位于EXAMPLES/meshfem3D_examples/simple_model/中的标准基准获得的地震图。这些参考结果可从Git代码库获得,以便于模拟的数值验证。对于三个不同的接收器(位于自由表面以测量波传播的虚拟传感器),我们可以观察到AWS Gravion2上运行的地震波速度与参考图相匹配。对输出文件的详细分析证实了这种视觉对比。
图2:AWS Gravation2、m6g.16xlarge实例获得的地震图与参考结果的比较。
单节点和多节点性能结果
图3总结了SPECFEM3D在多达六个AWS m6g.16xlarge实例上的性能。我们使用NEX_XI=256和NEX_XI=192增加了基准测试的大小,并执行了5000个timesteps来比较16-384个内核的运行时间。表1总结了在单个节点(最多64个计算核)上获得的结果。对于多节点模拟,在六个M6g实例(总共384个内核)上测得的最大加速比为6.38。在这种情况下,通过计算每个分区上的内部元素,来自子域边界交换的通信成本似乎完全重叠。此外,通过减少每个MPI进程计算的元素数量,我们还可以稍微受益于记录良好的缓存效果。
表1:单个节点上的运行时间(从16到64个MPI任务)。
图3:SPECFEM3D在多达六个AWS m6g.16xlarge实例(最多384个内核)上运行。
总结
我们将领先的地震波建模应用程序SPECFEM3D移植到Arm Neoverse N1。AWS Graviton2上的SPECFEM3D在单节点和多个M6g实例上都显示出良好的可伸缩性。此应用程序的编译非常简单,无需修改源代码。这也突出了目标平台上针对Linux的Arm编译器的成熟度,并对Neoverse N1内核进行了重大增强。基于一个具有代表性的三维基准,单节点和多节点结果表明AWS EC2 M6g实例已准备好进行地震模拟。