高性能计算(HPC)在科学和工程领域扮演着越来越重要的角色,尤其是在地震波传播模拟和全波形反演(FWI)等领域。SPECFEM3D_GLOBE是一个专门用于此类应用的软件包,它能够模拟三维全球和区域地震波的传播,并执行基于谱元方法(SEM)的全波形反演或伴随层析成像。虽然SPECFEM3D_GLOBE软件是用Fortran 2003编写的,并且考虑了完全的可移植性,但是许多HPC应用并没有充分利用处理器的高级功能。本文将提供一种逐步的方法来提高SPECFEM3D_GLOBE的性能。
要开始构建和运行此代码,请按照以下步骤操作:
$ cd specfem3d_globe
$ ./configure FC=ifort MPIFC=mpiifort CC=icc CXX=icpc FCFLAGS="-O3 -xMIC-AVX512 -qopenmp"
$ cp EXAMPLES/small_benchmark_run_to_test_more_complex_Earth/Par_file DATA
$ make -j
请注意,这里使用的是Intel编译器和MPI库,因此配置选项包括‘icc’, ‘icpc’, ‘ifort’, 和 ‘mpiifort’。构建/运行的机器包含Intel Xeon Phi(Knights Landing)处理器,因此使用了编译器标志‘-xMIC-AVX512’。‘-qopenmp’标志启用了OpenMP线程。
性能的衡量是通过模拟给定网格体积的‘n’时间步长所需的时间来进行的。如果求解器成功运行,需要知道它是否有效地执行,充分利用了可用资源。运行时执行的概况将让对求解器代码中各个子程序花费的时间有一个大致的了解。可以使用Intel® MPI Performance Snapshot和Intel® Trace Analyzer和Collector等工具收集跨多个集群节点的MPI执行概况。此外,还可以使用Intel® VTune™ Amplifier和Intel® Advisor收集单节点概况。SPECFEM3D_GLOBE具有出色的MPI可扩展性,其异步MPI通信/计算重叠,因此重点将放在每个节点的应用概况和优化上。
使用Intel VTune Amplifier收集的一般概况显示,此代码是后端绑定的,进一步分类显示它存在内存(DRAM)延迟问题。一般概况的摘要视图如图1所示。深入到热点然后源代码的概况如图2所示。在compute_element_iso子程序中访问的etax数组,其维度为125 x N。INDEX_IJK从1增加到125,索引ispec是任意的——因此,是间接访问。像Intel Advisor这样的工具可以让了解这种访问的随机性以及代码的向量化(由编译器生成)。图3显示了这样的概况。
在分析了SPECFEM3D_GLOBE的执行概况之后,尝试了一些代码更改,以提高在Intel®处理器上的性能。
为了缓解内存访问延迟问题,将间接(随机)访问转换为单位步长访问。SPECFEM3D_GLOBE求解器中的大部分网格数据在时间/求解器步骤上是不变的。因此,将数据复制并使其成为线性访问是有效的转换。
编译器向量化/循环分裂:‘iso’和‘tiso’计算循环非常大。编译器无法向量化这些循环。因此,进行了手动循环分裂。通过使用Intel®编译器支持的‘!DIR$ DISTRIBUTE POINT’语法,可以实现类似的效果,用于循环分布/分裂。
数据对齐/填充:‘iso’和‘tiso’计算循环是针对网格中的每个元素调用的,并且是从MPI或线程区域调用的。这些循环的计数为125。由于循环中访问的数组的维度为125 x N,因此对代码应用的另一种优化是将其与2n边界对齐。应用了三个元素的填充,使其成为128 x N数组。
替换冗余计算为查找表:‘tiso’循环中的一些计算调用了超越函数。这些计算在求解器执行时间步骤中是不变的。这些可以用查找表替换。
IVDEP或SIMD指令:SPECFEM3D_GLOBE求解器中的一些热点是嵌套循环,计数为5 x 5和5 x 25。这些是‘m x m’矩阵-矩阵乘法。编译器优化报告(使用-qopt-report标志)表明,并非所有这些循环都被向量化。使用IVDEP或SIMD指令有助于编译器为这些循环生成向量代码。
总之,一些简单的代码更改(和数据转换)在基于Intel Xeon Phi处理器的系统上提高了SPECFEM3D_GLOBE求解器的性能约2.1倍。还有进一步优化的空间——正在探索中。