Skip to content

AMD CPU Linpack (HPL) 性能测试指南

摘要: 本指南聚焦于基于 AMD EPYC (如 Genoa/Zen 4) 架构的高性能计算集群 HPL 测试。不同于 Intel 架构,AMD 架构在 MPI 进程绑定、Block Size (NB) 选择及 OpenMP 线程设置上有其特定的最佳实践。

1. 概述

High Performance Linpack (HPL) 是 TOP500 超算榜单的官方基准测试。对于 AMD 平台,使用优化过的数学库(如 AOCL 或专门编译的 HPL)配合正确的 NUMA 绑定策略,是发挥硬件性能的关键。

2. 环境准备

2.1 系统与硬件要求

  • 操作系统: 推荐 CentOS 7.9, Rocky Linux 8/9 或 Ubuntu 22.04。
  • 网络: 节点间 SSH 免密登录,InfiniBand/RoCE 驱动 (Mellanox OFED) 正常。
  • 文件系统: 测试程序建议放置在 NFS 或 Lustre 共享目录下。
  • BIOS 关键设置 (AMD 推荐):
    • Determinism Slider: Power Determinism (或 Max Performance)
    • cTDP / P-State: 设置为最高性能
    • C-States: Disabled
    • SMT (超线程): Disabled (HPL 在物理核上通常更稳定)
    • NUMA Nodes per Socket (NPS): 建议 NPS4 或 NPS1 (视内存交错模式而定,通常 NPS4 延迟更低)。

2.2 软件依赖

  • MPI: OpenMPI ≥ 4.0.3 (推荐) 或 MPICH。
  • 工具: psutil (Python 库,用于监控)。
    bash
    pip install psutil

3. HPL.dat 参数配置 (AMD 专属)

与通用配置类似,但部分参数针对 Zen 架构有特定推荐值。

参数说明AMD Zen 3/4 推荐值
N (Problem Size)矩阵维度$N \approx \sqrt{\frac{\text{总内存} \times 0.9}{8}}$
NB (Block Size)分块大小384 (Genoa/Milan 架构的最佳甜点)
P, Q进程网格$P \times Q = \text{总插槽数 (Sockets)}$
建议每 Socket 运行 1 个 MPI 进程

进程模型差异

在 Intel 平台上,有时会尝试每 NUMA 节点一个 MPI 进程。 在 AMD 平台 上,最佳实践通常是 每个物理 CPU 插槽 (Socket) 一个 MPI 进程,并在该进程内开启与核心数相等的 OpenMP 线程。

4. 单节点测试 (Single Node)

假设环境为双路 AMD EPYC Genoa (每颗 96 核),总计 192 核。

4.1 运行脚本 (run_single.sh)

使用 OpenMPI 进行精细的核心绑定。

bash
#!/bin/bash
# 假设使用专门针对 AMD 优化的静态编译版本 xhpl-amd-static

# MPI 参数解释:
# --map-by socket:PE=96  -> 每个 Socket 分配 1 个 MPI 进程,每个进程跨越 96 个 Slot (核心)
# -np 2                  -> 总共 2 个 MPI 进程 (双路)
# --bind-to core         -> 严格绑定到核心,防止漂移

/path/to/openmpi/bin/mpirun \
  --map-by socket:PE=96 \
  -np 2 \
  --bind-to core \
  --allow-run-as-root \
  -x OMP_NUM_THREADS=96 \
  -x OMP_PROC_BIND=spread \
  -x OMP_PLACES=cores \
  ./xhpl-amd-static

4.2 理论峰值计算 (Rpeak)

AMD EPYC (Zen 4) 支持 AVX-512,每个时钟周期可执行 16 次双精度浮点运算 (2 FMA单元 × 256bit宽 × 2 ops)。

$$ \text{Rpeak} = \text{节点数} \times \text{CPU数} \times \text{核心数} \times \text{主频} \times 16 $$

示例 (双路 EPYC 9654, 2.4GHz): $$ Rpeak = 1 \times 2 \times 96 \times 2.4 \times 16 = 7372.8 \text{ GFlops} $$

  • 合格标准: 实测效率应达到 95% ~ 98%。

5. 多节点测试 (Multi-Node)

5.1 Hostfile 准备

创建 hostfile,列出所有参与测试的节点名。

5.2 运行脚本 (run_cluster.sh)

以 10 个节点为例,共 20 颗 CPU。

bash
#!/bin/bash
# N: 设置为集群总内存对应的值
# P x Q = 20 (例如 P=4, Q=5)

/path/to/openmpi/bin/mpirun \
  --map-by socket:PE=96 \
  -np 20 \
  -N 2 \
  -hostfile hostfile \
  --bind-to core \
  --allow-run-as-root \
  -x OMP_NUM_THREADS=96 \
  -x OMP_PROC_BIND=spread \
  -x OMP_PLACES=cores \
  ./xhpl-amd-static
  • -np 20: 总 MPI 进程数 (10 节点 × 2 Socket)。
  • -N 2: 每个节点运行 2 个 MPI 进程。

5.3 结果分析

如果多机效率显著低于单机(例如低于 85%),通常原因如下:

  1. 网络瓶颈: 检查 InfiniBand 连接状态 (ibstat),确保运行在预期速率 (如 NDR 400Gbps)。
  2. NUMA 跨节点访问: 检查 HPL.dat 的 P/Q 设置是否合理。
  3. 系统抖动: 使用 top 检查是否有其他系统进程占用 CPU。

6. 最佳实践总结

  • 编译器: 推荐使用 AOCC (AMD Optimizing C/C++ Compiler) 编译 HPL,或者使用 GCC + BLIS/FLAME 库。
  • 内存带宽: HPL 是内存带宽密集型应用,确保所有内存通道插满,且频率运行在最大值 (如 DDR5-4800)。
  • 残差检查: 运行结束后,必须检查输出文件中的 Residual 值。只有当 Residual < 1e-6 (且通过验证公式) 时,成绩才有效。

AI-HPC Organization