Skip to content

CPU Linpack 性能测试指南 (HPL)

摘要: High Performance Linpack (HPL) 是国际公认的高性能计算机系统浮点性能评测标准(TOP500 基准)。本文详细介绍了基于 Intel OneAPI (MKL) 环境的 HPL 测试流程、参数配置与性能优化方法。

1. 概述与准备

1.1 HPL 简介

HPL 通过使用高斯消元法求解稠密线性代数方程组来评价系统的浮点运算能力。

  • 官方基准: Netlib HPL
  • 工业标准: 它是 HPC 项目交付验收的核心指标。

1.2 环境要求

在进行测试前,请确保以下基础环境就绪:

  • 系统环境: OS 安装正常,节点间 SSH 免密登录 已配置。
  • 存储与网络: NFS 共享目录已挂载,NIS 服务正常(如需),IB/RoCE 网络驱动正常。
  • 软件环境: Intel OneAPI (包含 MKL 和 MPI) 已安装在共享目录。

环境变量加载

新版 Intel OneAPI 仅需一行命令即可加载所有工具链:

bash
source /opt/intel202*/oneapi/setvars.sh intel64 --force

1.3 BIOS 关键设置 (Intel Xeon)

为了获得稳定的峰值性能,建议在 BIOS 中进行如下设置:

  • CPU Power Policy: Performance
  • Intel Turbo Boost: Enabled (开启睿频)
  • Hyper-Threading: Off (关闭超线程,HPL 通常在物理核上性能更优)

1.4 测试文件准备

测试程序通常位于 Intel MKL 安装目录下。建议创建一个独立的测试目录(如 /home/benchmark/hpl)并将以下文件复制过去:

  • 源目录示例: $MKLROOT/benchmarks/mp_linpack/
  • 所需文件:
    • xhpl_intel_dynamic: 动态链接可执行文件
    • xhpl_intel64_static: 静态链接可执行文件
    • runme_*: 辅助运行脚本
    • HPL.dat: 核心参数配置文件

2. HPL.dat 核心参数配置

HPL.dat 决定了计算规模和网格布局,是跑分的关键。

参数说明推荐配置公式/值
N (Problem Size)矩阵规模$N = \sqrt{\frac{\text{总内存} \times \text{利用率(0.9)}}{8}} \times 0.9$
注:需预留部分系统内存,防 OOM
NB (Block Size)分块大小推荐 384 (Skylake 及更新架构)
P, Q (Grid)进程网格$P \times Q = \text{总 MPI 进程数}$
通常 P < Q,且 P 尽量为 2 的幂

P x Q 配置示例

假设有 8 个节点,每个节点跑 1 个 MPI 进程:

  • 总进程数 = 8
  • 配置建议: P=2, Q=4 (或者 P=1, Q=8)

3. 测试步骤

3.1 预操作:锁定高性能模式

在所有计算节点上执行:

bash
cpupower -c all frequency-set -g performance

3.2 场景一:每节点单进程 (推荐)

适用于大规模测试,减少进程间通信开销,每个节点只运行一个 xhpl 进程,通过 OpenMP 使用所有核心。

  1. 编辑 HPL.dat: 根据节点数设置 N, NB, P, Q
  2. 创建 hostfile: 写入所有参与测试的节点主机名。
  3. 运行命令:

InfiniBand / RoCE 网络:

bash
# -ppn 1 表示每节点 1 个进程
mpirun -genv I_MPI_FABRICS shm:ofi \
       -genv FI_PROVIDER mlx \
       -machinefile hostfile \
       -np <总节点> -ppn 1 ./xhpl_intel64_dynamic

以太网 (TCP):

bash
mpirun -genv I_MPI_FABRICS shm:ofi \
       -genv FI_PROVIDER tcp \
       -machinefile hostfile \
       -np <总节点> -ppn 1 ./xhpl_intel64_dynamic

3.3 场景二:每节点多进程 (Runme 脚本)

如果需要手动控制每个 NUMA 节点的进程,可使用 runme_intel64_dynamic 脚本。

  1. 编辑 HPL.dat: 注意此时 $P \times Q = \text{节点数} \times \text{每节点进程数}$。
  2. 修改脚本: 编辑 runme_intel64_dynamic
    • MPI_PROC_NUM: 总进程数。
    • MPI_PER_NODE: 每节点进程数 (例如 2)。
  3. 执行测试:
    bash
    ./runme_intel64_dynamic
    结果将写入 HPL.out

4. 胖节点 (Fat Node) 特别说明

对于 4 路或 8 路 CPU 的胖节点,建议 每颗 CPU 对应一个 MPI 进程 以优化内存访问(NUMA 亲和性)。

  • 配置策略:
    • P x Q: 等于 节点数 × 单节点 CPU 颗数
    • MPI_PER_NODE: 设置为单节点的 CPU 颗数(如 4 路则设为 4)。

5. 结果分析与优化

5.1 理论峰值计算 (Rpeak)

$$ \text{Rpeak} = \text{CPU主频} \times \text{核心数} \times \text{单周期浮点指令数} $$

示例 (Intel Xeon Gold 6126):

  • 主频: 2.6 GHz
  • 核心: 12 核
  • 指令集: AVX-512 (每周期 32 次双精度浮点)
  • 单颗 Rpeak = $2.6 \times 12 \times 32 = 998.4 \text{ GFlops}$

5.2 性能优化指令集

Intel MKL 会自动探测 CPU 架构,但有时需手动强制开启 AVX-512 以获得最大性能。

bash
# 强制使用 AVX-512 指令集 (Skylake/Cascade Lake/Ice Lake/Sapphire Rapids)
export MKL_ENABLE_INSTRUCTIONS=AVX512

实时监控

测试过程中,建议在一个终端使用 turbostat 监控 CPU 频率,确保没有发生降频:

bash
turbostat --interval 1

AI-HPC Organization