Skip to content

HPL(CPU 集群版)赛题说明

Note

HPL 赛题负责同学:马平川 mpc23@mails.tsinghua.edu.cn

赛题介绍

HPL(High-Performance Linpack Benchmark)是业界用于评估高性能计算系统浮点能力的标准基准测试:采用高斯消元法求解一元 N 次稠密线性方程组,通过模拟科学与工程领域的大规模计算问题来衡量系统的计算速度与效率。

本赛题要求选手在 CPU 集群的最多两个节点上编译并调优 HPL 2.3,在保证残差检查通过(PASSED)的前提下,获得尽可能高的浮点性能(GFlops)。

  • 运行平台:最多两个 CPU 节点、112 核(每节点 2 × Intel Xeon Gold 6258R @ 2.70GHz,支持 AVX-512,192GB 内存),InfiniBand 互联
  • 软件环境:module 管理。编译器 compilers/intel/oneapi-2023/config(icc/icx/ifort/ifx)、compilers/gcc/*;数学库 oneAPI MKL 2023;MPI:Intel MPI 2021.8、mpi/openmpi/v4.1.4 等
  • 作业调度:SLURM。只允许 sbatch 提交,不允许 srun / salloc

参考链接

登录集群

本赛题使用 探索 1000 CPU 集群,具体信息查看本网站中的集群使用手册。VPN 连接方式及账号密码已在选手群中更新,如有问题可联系 mpc23@mails.tsinghua.edu.cn。

代码获取

登录节点可访问外网:

cd $HOME/WORK
mkdir hpl && cd hpl
wget https://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz
tar xzf hpl-2.3.tar.gz

编译

以 Intel oneAPI 2023(icc + MKL + Intel MPI)为例,在 hpl-2.3 目录下新建 Make.Linux_Intel:

SHELL        = /bin/sh
CD           = cd
CP           = cp
LN_S         = ln -s -f
MKDIR        = mkdir -p
RM           = /bin/rm -f
TOUCH        = touch
ARCH         = Linux_Intel

TOPdir       = $(HOME)/WORK/hpl/hpl-2.3
MPdir        = $(ONEAPI_ROOT)/mpi/2021.8.0
MPinc        = -I$(MPdir)/include
MPlib        = $(MPdir)/lib/libmpi.so

LAdir        = $(ONEAPI_ROOT)/mkl/2023.0.0
LAinc        = -I$(LAdir)/include
LAlib        = $(LAdir)/lib/intel64/libmkl_intel_lp64.so \
               $(LAdir)/lib/intel64/libmkl_sequential.so \
               $(LAdir)/lib/intel64/libmkl_core.so

F2CDEFS      =
HPL_INCLUDES = -I$(INCdir) -I$(INCdir)/$(ARCH) $(LAinc) $(MPinc)
HPL_LIBS     = $(HPLlib) $(LAlib) $(MPlib) -lpthread -lm -ldl
HPL_OPTS     =
HPL_DEFS     = $(F2CDEFS) $(HPL_OPTS) $(HPL_INCLUDES)

CC           = mpiicc
CCNOOPT      = $(HPL_DEFS)
CCFLAGS      = $(HPL_DEFS) -O3 -xCORE-AVX512 -ipo -fno-alias -restrict -w
LINKER       = $(CC)
LINKFLAGS    = $(CCFLAGS)

ARCHIVER     = ar
ARFLAGS      = r
RANLIB       = echo

INCdir       = $(TOPdir)/include
BINdir       = $(TOPdir)/bin/$(ARCH)
LIBdir       = $(TOPdir)/lib/$(ARCH)
HPLlib       = $(LIBdir)/libhpl.a

编译(TOPdir 请按自己的路径修改):

module load compilers/intel/oneapi-2023/config
make arch=Linux_Intel

编译产物为 bin/Linux_Intel/xhpl。

运行

  1. 建立运行目录,拷贝可执行文件,准备输入文件 HPL.dat:
mkdir -p $HOME/WORK/hpl/run && cd $HOME/WORK/hpl/run
cp $HOME/WORK/hpl/hpl-2.3/bin/Linux_Intel/xhpl .

经调优的参数配置(N=120000,NB=384,P×Q=8×14=112,与进程数一致):

HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out      output file name (if any)
6            device out (6=stdout,7=stderr,file)
1            # of problems sizes (N)
120000       Ns
1            # of NBs
384          NBs
0            PMAP process mapping (0=Row-,1=Column-major)
1            # of process grids (P x Q)
8            Ps
14           Qs
16.0         threshold
1            # of panel fact
2            PFACTs (0=left, 1=Crout, 2=Right)
1            # of recursive stopping criterium
4            NBMINs (>= 1)
1            # of panels in recursion
2            NDIVs
1            # of recursive panel fact.
1            RFACTs (0=left, 1=Crout, 2=Right)
1            # of broadcast
1            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1            # of lookahead depth
1            DEPTHs (>=0)
2            SWAP (0=bin-exch,1=long,2=mix)
64           swapping threshold
0            L1 in (0=transposed,1=no-transposed) form
0            U  in (0=transposed,1=no-transposed) form
1            Equilibration (0=no,1=yes)
8            memory alignment in double (> 0)
  1. 创建运行脚本 run.sh:
#!/bin/bash
#SBATCH --job-name=hpl
#SBATCH --output=./logs/hpl_%j.out
#SBATCH --error=./logs/hpl_%j.err
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=56
#SBATCH --time=02:00:00
#SBATCH --partition=cnall

mkdir -p logs

echo "================================================================="
echo "Job ID: $SLURM_JOB_ID, Running on node: $(hostname), Start Time: $(date)"
echo "================================================================="

module load compilers/intel/oneapi-2023/config
export I_MPI_HYDRA_BOOTSTRAP=slurm

mpirun -np 112 ./xhpl

echo "================================================================="
echo "Job End Time: $(date)"
echo "================================================================="
  1. 提交作业:
mkdir -p logs      # 多节点作业不会自动创建输出目录,提交前必须先创建
sbatch run.sh
squeue -u $USER    # PD 排队 / R 运行

结果输出在 logs/hpl_xxx.out。注意:

  • 所使用的进程数必须与输入文件中 P × Q 相等;
  • log 中必须手动标注运行起止时间(如示例脚本所示),无标注视为无效提交;
  • *.out 文件中只允许包含一个测试规模下的运行结果。

评测指标

  • 正确性判据(HPL 自带残差检查):

\(\(\frac{\|Ax-b\|_\infty}{\varepsilon \cdot (\|A\|_\infty \|x\|_\infty + \|b\|_\infty) \cdot N} < 16 \quad\Rightarrow\quad \text{PASSED}\)\)

  • 性能指标:输出表中的 Gflops(约 2/3·N³ 浮点运算量 ÷ 求解时间)。

示例输出(真实运行结果;完整 log 在结果表前后还有 HPL banner、参数说明段与 "End of Tests" 汇总):

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR11C2R4      120000   384     8    14             284.33             4.0517e+03
HPL_pdgesv() start time Wed Oct 14 11:24:24 2026

HPL_pdgesv() end time   Wed Oct 14 11:29:08 2026

--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   1.13367628e-03 ...... PASSED
================================================================================

评分方式

  • 正确运行 70 分:残差检查 PASSED 才可获得基础分
  • 性能 30 分:\(\(30 \times \frac{FLOPS_{team}}{FLOPS_{fastest}}\)\)(全场最快队伍拿满 30 分,其余按 GFlops 比值折算)
  • 一票否决项(出现即无效、不计分):
  • log 中没有起止时间标注
  • 修改过输出 log(必须包含原始标准输出的完整内容)
  • 所使用的进程数与输入文件中 P × Q 不相等
  • 超过两个节点运行(最多 112 个 CPU 核心)

可优化方向

  1. 问题规模 N:受内存限制(每节点约 192GB,两节点矩阵分布存储、总可用内存约 384GB)尽量取大(N=120000 矩阵约 115GB),两节点下可尝试更大规模,过大会 OOM
  2. 分块大小 NB:实测单节点 N=60000 时 NB=336 最优(优于 192/256/384/448/512);两节点 N=120000 实跑 NB=384 达 4.05 Tflop/s,建议在 336–448 区间扫描
  3. 进程网格 P×Q:保持 P×Q=112 的前提下尝试不同划分(实测 8×14 达 4.05 Tflop/s,可尝试 7×16、14×8、16×7 等)
  4. 算法参数:PFACT/RFACT(分解方式)、BCAST(广播)、SWAP(交换)、DEPTH(lookahead)等,见 TUNING 文件
  5. MPI 与运行环境:Intel MPI 与 OpenMPI 对比、进程绑定(如 I_MPI_PIN)、运行时选项、不同 MKL 版本(oneAPI 2023 与 intel 2019)
  6. 其他编译环境/数学库组合(如 GCC + OpenMPI + OpenBLAS)亦可,但需记录完整流程
  7. 注意:使用 Intel MPI 时不要显式设置 I_MPI_OFI_PROVIDER=verbs(大 N 时会导致计算结果错误、残差检查失败),使用默认值即可

提交要求

基本提交(计分)

初赛期间,每队通过提交脚本提交一份 HPL 运行日志(即 slurm 输出文件,如 hpl_xxx.out),原样提交,不得修改。日志中必须包含:

  • 运行起止时间标注(run.sh 开头/结尾 echo 的 Start/End,缺少则无效);
  • HPL 完整原始标准输出:banner、参数说明、结果表(T/V、N、NB、P、Q、Time、Gflops)、残差检查 ...... PASSED;
  • 只包含一个测试规模(N)的运行结果;多次运行请只保留其中一次的结果重新提交。

提交方式(提交脚本与题目名称以提交指南为准):

wget https://lab.cs.tsinghua.edu.cn/scc/assets/submit.sh
chmod +x submit.sh
./submit.sh HPL hpl_xxx.out          # 计分提交
./submit.sh --dry HPL hpl_xxx.out    # 仅校验格式,不计入成绩

样例日志:hpl-sample.out(真实两节点 112 进程运行结果,N=120000,4.05 TFlops,PASSED)。

最终提交

各题最终材料须统一打包为 一个 .tar.gz 压缩包(建议命名为 final.tar.gz),在提交指南规定的截止时间前通过

./submit.sh REPORT final.tar.gz

提交。其中 HPL 题需包含:

  • report.pdf:优化报告(发现的问题、优化方法、加速比等,鼓励图表);
  • 配置文件:HPL.dat、编译配置(如 Make.Linux_Intel)、环境配置等;
  • 运行脚本 run.sh(软件环境、运行参数等);
  • 运行后的输出日志 *.out(与基本提交一致);
  • 其他修改过的文件(如有,需在报告中说明)。