你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

缩放 HPC 应用程序

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指南

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集 ✔️ 统一规模集

若要优化 Azure 上 HPC 应用程序的纵向扩展和横向扩展性能,需要针对特定工作负载进行性能优化和优化试验。 本节以及特定于 VM 系列的页面为缩放应用程序提供了一般指导。

应用程序设置

azurehpc 存储库包含许多示例,涉及:

最佳缩放 MPI

以下建议适用于最佳的应用程序缩放效率、性能和一致性:

  • 对于规模较小的作业(< 256K 个连接),请使用:UCX_TLS=rc,sm

  • 对于规模较大的作业(> 256K 个连接),请使用:UCX_TLS=dc,sm

  • 若要计算 MPI 作业的连接数,请使用:Max Connections = (processes per node) x (number of nodes per job) x (number of nodes per job)

自适应路由

自适应路由 (AR) 允许运行 EDR 和 HDR InfiniBand 的 Azure 虚拟机 (VM) 通过动态选择最佳网络路径来自动检测和避免网络拥塞。 因此,AR 可在 InfiniBand 网络上提供更小的延迟和更高的带宽,从而提高了性能和缩放效率。 有关详细信息,请参阅技术社区文章

进程固定

  • 使用顺序固定方法(与自动平衡方法相反)将进程固定到核心。
  • 通过 Numa/Core/HwThread 进行绑定比默认绑定更好。
  • 对于混合并行应用程序 (OpenMP+MPI),请在 HB 和 HBv2 VM 大小下为每个 [CCX](HB 系列虚拟机概述,包括有关 CCX 的信息)使用四个线程和一个 MPI 级别。
  • 对于纯 MPI 应用程序,请在 HB 和 HBv2 VM 大小下为每个 CCX 试验一至四个 MPI 个级别,以获得最佳性能。
  • 每个 CCX 使用的内核数减少,可能有利于对内存带宽极度敏感的某些应用程序。 对于这些应用程序,为每个 CCX 使用三个或两个内核可以减少内存带宽争用并获得更高的实际性能或更一致的可扩缩性。 特别是,MPI Allreduce 可以通过此方法受益。
  • 对于较大规模的运行,建议使用 UD 或混合 RC+UD 传输。 许多 MPI 库/运行时库都在内部使用这些传输(例如 UCX 或 MVAPICH2)。 检查传输配置以进行大规模运行。

编译应用程序


单击以展开

尽管不是必需的,但是使用适当的优化标志编译应用程序可以在 HB 和 HC 系列 VM 上提供最佳的纵向扩展性能。

AMD 优化 C/C++ 编译器

AMD 优化 C/C++ 编译器 (AOCC) 编译器系统提供了高级别的高级优化、多线程和处理器支持,包括全局优化、矢量化、过程间分析、循环转换和代码生成。 AOCC 编译器二进制文件适用于具有 GNUC 库 (glibc) 版本 2.17 及更高版本的 Linux 系统。 编译器套件包括 C/C++ 编译器 (clang)、Fortran 编译器 (FLANG) 和 Fortran front end to Clang (Dragon Egg)。

Clang

Clang 是 C、C++ 和 Objective-C 编译器,负责处理预处理、解析、优化、代码生成、组装和链接。 Clang 支持 -march=znver1 标志,为 AMD 基于 Zen 的 x86 体系结构实现最佳代码生成和优化。

FLANG

FLANG 编译器是 AOCC 套件最新添加的编译器(于 2018 年 4 月添加),目前处于预发布阶段,供开发人员下载和测试。 基于 Fortran 2008,AMD 扩展了 GitHub 版本的 FLANG。 FLANG 编译器支持所有的 Clang 编译器选项和一些特定于 FLANG 的其他编译器选项。

DragonEgg

DragonEgg 是一个 gcc 插件,它将 GCC 的优化器和代码生成器替换为 LLVM 项目中的优化器和代码生成器。 AOCC 随附的 DragonEgg 适用于 gcc-4.8.x,已经针对 x86-32/x86-64 目标进行了测试,并已在各种 Linux 平台上成功使用。

GFortran 是 Fortran 程序的实际前端,负责生成 GCC GIMPLE 中间表示 (IR) 的预处理、解析和语义分析。 DragonEgg 是一个 GNU 插件,插入 GFortran 编译流中。 它实现 GNU 插件 API。 借助插件体系结构,DragonEgg 成为了编译器驱动程序,用于驱动编译的不同阶段。 按照下载和安装说明操作后,可以使用以下工具调用 Dragon Egg:

gfortran [gFortran flags]
   -fplugin=/path/AOCC-1.2-Compiler/AOCC-1.2-
   FortranPlugin/dragonegg.so [plugin optimization flags]
   -c xyz.f90 $ clang -O3 -lgfortran -o xyz xyz.o $./xyz

PGI 编译器

已确认 PGI Community Edition 17 可与 AMD EPYC 一起工作。 PGI 编译的 STREAM 版本提供了平台的全部内存带宽。 较新的 Community Edition 18.10(2018 年 11 月)应同样适用。 使用此 CLI 命令通过 Intel 编译器进行编译:

pgcc $(OPTIMIZATIONS_PGI) $(STACK) -DSTREAM_ARRAY_SIZE=800000000 stream.c -o stream.pgi

Intel Compiler

已确认 Intel Compiler 18 可与 AMD EPYC 一起工作。 使用此 CLI 命令通过 Intel 编译器进行编译。

icc -o stream.intel stream.c -DSTATIC -DSTREAM_ARRAY_SIZE=800000000 -mcmodel=large -shared-intel -Ofast –qopenmp

GCC 编译器

对于 HPC 工作负载,AMD 推荐使用 GCC 编译器 7.3 或更高版本。 不建议使用早期版本,如 RHEL/CentOS 7.4 随附的 4.8.5。 GCC 7.3 和更高版本将在 HPL、HPCG 和 DGEMM 测试中提供更高的性能。

gcc $(OPTIMIZATIONS) $(OMP) $(STACK) $(STREAM_PARAMETERS) stream.c -o stream.gcc

后续步骤