有效利用您的整个集群





0/5 (0投票)
优化 Intel® 架构上的 SPECFEM3D_GLOBE 性能
英特尔是为数据中心用户提供硬件和软件的领先供应商——例如最新的英特尔®至强®和英特尔®至强融核™处理器。然而,许多高性能计算 (HPC) 应用未能充分利用处理器的先进功能。在本文中,我们将提供一个分步方法来改进 SPECFEM3D_GLOBE* 的性能,该软件包使用谱元法 (SEM) 模拟三维全球和区域地震波传播,并执行全波形反演 (FWI) 或伴随层析成像。所有 SPECFEM3D_GLOBE 软件均以 Fortran* 2003 编写,充分考虑了可移植性,并严格符合 2003 标准。该软件包使用消息传递接口 (MPI) 来表达分布式内存并行性。最近,OpenMP* 共享内存并行结构被引入到求解器源代码中。
请按照以下步骤快速开始构建和运行此代码
$ 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 8 xcreate_header_file xmeshfem3D xspecfem3D $ cd EXAMPLES/small_benchmark_run_to_test_more_complex_Earth $ ./run_this_example.sh
注释
- 从 https://geodynamics.org/cig/software/specfem3d_globe/ 下载 SPECFEM3D_GLOBE。
- 正在执行的测试基准是 EXAMPLES 目录中的 small_benchmark_run_to_test_more_complex_Earth。
- 本次构建使用了英特尔®编译器和 MPI 库。因此,配置选项为 'icc'、'icpc'、'ifort' 和 'mpiifort'。
- 构建/运行机器包含英特尔至强融核 (Knights Landing) 处理器,因此使用了编译器标志 '-xMIC-AVX512'。
- ' -qopenmp' 标志会构建启用 OpenMP 线程的软件包。
- 求解器代码的性能是通过模拟给定网格体积的“n”个时间步所需的时间来衡量的。
- 编辑模型分辨率、参数和 MPI 进程数量的步骤可在 SPECFEM3D_GLOBE 文档中找到。
假设求解器已成功运行,我们需要知道它是否高效执行,充分利用了可用资源。运行时执行的配置文件将让我们初步了解求解器代码各个子程序所花费的时间。我们可以跨多个集群节点收集此类配置文件,以监控 MPI 行为以及每个节点的执行统计信息。Intel® MPI Performance Snapshot 和 Intel® Trace Analyzer and 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 显示了此类配置文件。
Intel Advisor 显示有关内存访问步长的信息,包括它们是单元步长、随机步长还是固定步长,以及它们的分布。此外,它还提供有关编译器代码生成、循环执行使用的向量长度、指令集和向量化增益的信息。此配置文件有助于确定应用程序是否受益于处理器的向量功能和较新的指令。有时,编译器可能会对循环进行向量化以利用处理器的完整向量宽度(例如 AVX-512*),但并未观察到相应的循环执行速度提升。一个可能的原因是它受带宽限制。Intel VTune Amplifier 允许进行此类分析(图 4)。了解优化带宽受限(高利用率)循环的向量化性能的提升效果不大,这一点很重要。低带宽利用率的循环和代码区域可能正在执行非向量化指令或/和遭受内存访问延迟问题。这需要解决。
在分析了 SPECFEM3D_GLOBE 的执行配置文件后,我们尝试了一些代码更改,以在英特尔®处理器上提高性能。
缓解内存访问延迟问题
将间接(随机)访问转换为单元步长访问。SPECFEM3D_GLOBE 求解器中的大部分网格数据在时间和求解器步长上是不变的。因此,复制数据并使其成为线性访问是有效的转换。
subroutine compute_element_tiso(ispec, ... c13 = 0.125_CUSTOM_REAL*cosphisq*(rhovphsq + six_eta_aniso*rhovphsq \ ... prepare_timerun (...) ... do ispec_p = 1,num_elements ele_num = ele_num + 1 ... ia_c1store(idx6+3,tiso_ele_num) = c13 --------------------------------------------------------------- subroutine compute_element_tiso(ispec, ele_num, & ... c13 = ia_c1store(idx7+3,tiso_ele_num) ...
此代码修改将所有九个数组——“xix”、“xiy”…“gammzl”——复制到一个数组“ia_arr”中。这将有助于减轻这些访问的带宽压力(因为只需要进行一次数组访问(而不是九次),但向量化友好性较差(因为每个数组的元素不是连续的))。对于带宽压力不是主要考虑因素的情况,用户可以创建九个与原始代码对应的数组并获得向量化优势。最佳选择必须通过实验确定。
编译器向量化/循环分离
compute 循环 'iso' 和 'tiso' 非常大。编译器无法对这些循环进行向量化。因此,我们手动进行了循环分离。通过使用英特尔®编译器支持的 '!DIR$ DISTRIBUTE POINT' 语法来实现循环分发/分离,可以达到类似的效果。
数据对齐/填充
compute 循环 'iso' 和 'tiso' 是为网格中的每个元素调用的,并且是从 MPI 或线程区域调用的。这些循环的迭代次数为 125。由于循环中访问的数组的维度为 125 x N,因此应用于此代码的另一个优化是将其对齐到 2n 边界。应用了三个元素的填充,使其成为一个 128 x N 数组。
subroutine compute_element_tiso(ispec, ... c13 = 0.125_CUSTOM_REAL*cosphisq*(rhovphsq + six_eta_aniso*rhovphsq \ ... prepare_timerun (...) ... do ispec_p = 1,num_elements ele_num = ele_num + 1 ... ia_c1store(idx6+3,tiso_ele_num) = c13 --------------------------------------------------------------- subroutine compute_element_tiso(ispec, ele_num, & ... c13 = ia_c1store(idx7+3,tiso_ele_num) ...
用查找表替换冗余计算
'tiso' 循环中包含一些计算,这些计算调用了超越函数。这些计算与求解器执行时间步长无关。同样的内容可以用查找表替换。
IVDEP 或 SIMD 指令
SPECFEM3D_GLOBE 求解器中的一些热点是嵌套循环,迭代次数为 5x5 和 5x25。这些是“m x m”矩阵-矩阵乘法。编译器优化报告(使用 -qopt-report 标志)表明并非所有这些循环都被向量化。使用 IVDEP 或 SIMD 指令有助于编译器为这些循环生成向量代码。
总之,一些简单的代码更改(和数据转换)使 SPECFEM3D_GLOBE 求解器在基于英特尔至强融核处理器的系统上的性能提高了约 2.1 倍。仍有进一步优化的空间——并且正在探索中。
使用的配置和工具
- Intel Parallel Studio XE 2017
- 自启动系统,配备 Intel Xeon Phi 7250 处理器,96GB DDR 内存
- Intel Xeon Phi 处理器上的 MCDRAM 配置为 FLAT 模式。 QUAD 模式下的网格互连。
- 操作系统版本:CentOS* Linux* release 7.3.1611 (kernel 3.10.0-514.10.2.el7.x86_64, glibc 2.17-157.el7_3.1.x86_64)
参考文献
- # SPECFEM3D_GLOBE:Komatitsch 和 Tromp 1999;Komatitsch 和 Vilotte (1998):https://geodynamics.org/cig/software/specfem3d_globe/
- Intel 软件工具/手册:https://software.intel.com/en-us/intel-parallel-studio-xe
- Intel® 64 和 IA-32 架构软件开发人员手册:https://software.intel.com/en-us/articles/intel-sdm
- Ahmad Yasin。“一种用于性能分析和计数器架构的自顶向下方法。”IEEE Xplore:2014 年 6 月 26 日。电子 ISBN:978-1-4799-3606-9。