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 库,用于监控)。bashpip 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 进行精细的核心绑定。
#!/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-static4.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。
#!/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%),通常原因如下:
- 网络瓶颈: 检查 InfiniBand 连接状态 (
ibstat),确保运行在预期速率 (如 NDR 400Gbps)。 - NUMA 跨节点访问: 检查
HPL.dat的 P/Q 设置是否合理。 - 系统抖动: 使用
top检查是否有其他系统进程占用 CPU。
6. 最佳实践总结
- 编译器: 推荐使用 AOCC (AMD Optimizing C/C++ Compiler) 编译 HPL,或者使用 GCC + BLIS/FLAME 库。
- 内存带宽: HPL 是内存带宽密集型应用,确保所有内存通道插满,且频率运行在最大值 (如 DDR5-4800)。
- 残差检查: 运行结束后,必须检查输出文件中的
Residual值。只有当Residual < 1e-6(且通过验证公式) 时,成绩才有效。
