HPL

简介

HPL(The High-Performance Linpack Benchmark)是测试高性能计算集群系统浮点性能的基准程序。HPL通过对高性能计算集群采用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算集群的浮点计算能力。

浮点计算峰值是指计算机每秒可以完成的浮点计算次数,包括理论浮点峰值和实测浮点峰值。理论浮点峰值是该计算机理论上每秒可以完成的浮点计算次数,主要由CPU的主频决定。理论浮点峰值=CPU主频×CPU核数×CPU每周期执行浮点运算的次数。本文将为您介绍如何利用HPL测试实测浮点峰值。

导入HPL环境

版本

平台

构建方式

模块名

2.3

cpu

spack

oneapi/2021.4.0 思源一号

2.3

cpu

spack

oneapi/2021.4.0 π2.0

2.3

cpu

spack

hpl/2.3-gcc-9.3.0-openblas-openmpi ARM集群

mkdir ~/HPL && cd ~/HPL
module load oneapi/2021.4.0
cp -r $MKLROOT/benchmarks/mp_linpack ./
cd mp_linpack/

文件目录结构如下所示:

[hpc@login3 80cores]$ tree mp_linpack/
mp_linpack/
├── build.sh
├── COPYRIGHT
├── HPL.dat
├── HPL_main.c
├── libhpl_intel64.a
├── readme.txt
├── runme_intel64_dynamic
├── runme_intel64_prv
├── run.slurm
├── xhpl_intel64_dynamic
└── xhpl_intel64_dynamic_outputs.txt

测试平台

π2.0

Intel HPL使用时建议在每一个NUMA Socket启动一个MPI进程,然后再由MPI进程启动与Socket核心数匹配的计算线程。由于Intel HPL不使用OpenMP库,因此无法通过OMP环境变量控制计算线程数。

π2.0上计算节点配置信息:双路Intel 6248节点,每个CPU Socket启动1个MPI进程,共启动2个MPI进程。

首先需要配置文件内容:

计算节点内存为180G,将输入文件 HPL.dat 中的问题规模 Ns 调整至内存空间的80%左右 0.8*sqrt(mem*1024*1024*1024*nodes/8) 。本算例使用了两个节点,这里使用sed>将Ns替换为176640。

$ sed -i -e 's/.*Ns.*/176640\ Ns/' HPL.dat

然后调整HPL.dat的 PsQs 值,使其乘积等于MPI进程总数。 这里使用sed将 PsQs 值分别设置为2、2,乘积等于线程总数2。

$ sed -i -e 's/.*\ Ps.*/2\ Ps/' HPL.dat
$ sed -i -e 's/.*\ Qs.*/2\ Qs/' HPL.dat

接下来将runme_intel64_dynamic中的MPI总数改为4

sed -i 's/MPI_PROC_NUM=2/MPI_PROC_NUM=4/' runme_intel64_dynamic

提交如下运行脚本:

#!/bin/bash

#SBATCH --job-name=hpl2node
#SBATCH --partition=cpu
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH -n 4
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=20
#SBATCH --exclusive

ulimit -s unlimited
ulimit -l unlimited

module load oneapi

./runme_intel64_dynamic

使用 -n 指定MPI进程总数, --ntasks-per-node 指定每节点启动的MPI进程数, --cpus-per-task 指定每个MPI进程使用的CPU核心数

使用如下命令提交脚本:

sbatch run.slurm

运行结果如下所示:

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WC00C2R100000      176640   256     2     2             973.53            3.77426e+03

思源一号

文件参数的配置,参考上述规则,将 NPQ 等参数使用sed命令更改如下:

sed -i -e 's/.*Ns.*/209510\ Ns/' HPL.dat
sed -i -e 's/.*\ Ps.*/2\ Ps/' HPL.dat
sed -i -e 's/.*\ Qs.*/2\ Qs/' HPL.dat
sed -i 's/MPI_PROC_NUM=2/MPI_PROC_NUM=4/' runme_intel64_dynamic

运行脚本如下所示:

#!/bin/bash

#SBATCH --job-name=hpl2node
#SBATCH --partition=64c256g
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH -n 4
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=32
#SBATCH --exclusive

ulimit -s unlimited
ulimit -l unlimited

module load oneapi

./runme_intel64_dynamic

ARM集群

首先,复制算例到本地。

$ mkdir arm_hpl
$ cd arm_hpl
$ cp -r /lustre/opt/kunpeng920/linux-centos7-aarch64/gcc-9.3.0/hpl-2.3-svu3iccgwr6whf7b2fcj7mbkaipbffye/bin/* ./

然后,将输入文件 HPL.dat 中的问题规模 Ns 调整至内存空间256G的80%左右。 这里使用sed将Ns替换为147840。

$ sed -i -e 's/.*Ns.*/147840\ Ns/' HPL.dat

NB 更改为经验值384。

$ sed -i -e 's/.*NBs.*/384\ NBs/' HPL.dat

接下来,将将 PsQs 值分别设置为8、16,乘积等于CPU总核数128。

$ sed -i -e 's/.*\ Ps.*/8\ Ps/' HPL.dat
$ sed -i -e 's/.*\ Qs.*/16\ Qs/' HPL.dat

使用 sbatch hpl.slurm 提交作业,其中 N 代表节点总数, ntasks-per-node 代表每个节点使用的总核数。

#!/bin/bash

#SBATCH --job-name=arm_hpl
#SBATCH --partition=arm128c256g
#SBATCH -N 1
#SBATCH --ntasks-per-node=128
#SBATCH --exclusive
#SBATCH --output=%j.out
#SBATCH --error=%j.err

export OMP_NUM_THREADS=1
module load openmpi/4.0.3-gcc-9.2.0
module load hpl/2.3-gcc-9.3.0-openblas-openmpi
ulimit -s unlimited
ulimit -l unlimited
mpirun -np $SLURM_NTASKS xhpl

运行结果如下所示:

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR00L2L2      147840   384     8    16            2489.13             8.6545e+02

运行结果时间比较

π2.0集群

oneapi/2021.4.0

核数

40

80

160

Time(s)

705.40

973.53

1439.61

Gflops

1847.25

3774.26

7117.28

思源一号集群

oneapi/2021.4.0

核数

64

128

256

Time(s)

1548.69

2247.28

3111.47

Gflops

3958.81

7728.58

15798.2

参考资料


最后更新: 2024 年 11 月 19 日