Skip to content

HPL

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

环境配置与运行

HPL目前有CPU和GPU两种实现版本,因为集群环境限制我们使用netlib HPL benchmark的CPU实现版本。

首先下载最新版的HPL软件包并解压。

wget https://www.netlib.org/benchmark/hpl/hpl-2.3.tar.gz
tar -zxvf hpl-2.3.tar.gz -C ./
cd hpl-2.3

安装hpl软件包的方法可以参考INSTALL文件,具体而言:

1.在hpl的顶层目录中创建一个 Make.<arch\> 文件,可以根据目前环境从 setup 中找到适合的样例并在此基础上进行更改。我们使用intel相关环境作为演示,这里我们选择 Make.Linux_Intel64

cp setup/Make.Linux_Intel64 ./

2.在Make文件中配置工作路径、MPI、线性代数库以及其他需要配置的选项。这里可以采用系统预装好的软件包,或者自己在用户目录下安装的软件包。 作为演示,我们选择intel oneapi作为编译环境和数学库,加载系统中预装的软件包。

module load compilers/intel/oneapi-2023/config

一种可能的Make配置文件如下

# Make.Linux_Intel64
SHELL        = /bin/sh

CD           = cd
CP           = cp
LN_S         = ln -fs
MKDIR        = mkdir -p
RM           = /bin/rm -f
TOUCH        = touch

ARCH         = Linux_Intel64

# TODO:修改为你当前的hpl顶层目录
TOPdir       = 
INCdir       = $(TOPdir)/include
BINdir       = $(TOPdir)/bin/$(ARCH)
LIBdir       = $(TOPdir)/lib/$(ARCH)

HPLlib       = $(LIBdir)/libhpl.a

# TODO:可指定为你选择的MPI实现
# MPdir        = 
# MPinc        = -I$(MPdir)/include64
# MPlib        = $(MPdir)/lib64/libmpi.a

# 可根据需要修改为你想使用的线性代数库
LAdir        = $(MKLROOT)
ifndef  LAinc
LAinc        = $(LAdir)/mkl/include
endif
ifndef  LAlib
LAlib        = -L$(LAdir)/mkl/lib/intel64 \
              -Wl,--start-group \
              $(LAdir)/lib/intel64/libmkl_intel_lp64.a \
              $(LAdir)/lib/intel64/libmkl_intel_thread.a \
              $(LAdir)/lib/intel64/libmkl_core.a \
              -Wl,--end-group -lpthread -ldl
endif

F2CDEFS      = -DAdd__ -DF77_INTEGER=int -DStringSunStyle

HPL_INCLUDES = -I$(INCdir) -I$(INCdir)/$(ARCH) -I$(LAinc) $(MPinc)
HPL_LIBS     = $(HPLlib) $(LAlib) $(MPlib)

HPL_OPTS     = -DHPL_DETAILED_TIMING -DHPL_PROGRESS_REPORT

HPL_DEFS     = $(F2CDEFS) $(HPL_OPTS) $(HPL_INCLUDES)

CC       = mpiicc
CCNOOPT  = $(HPL_DEFS)
OMP_DEFS = -qopenmp
CCFLAGS  = $(HPL_DEFS) -O3 -w -ansi-alias -i-static -z noexecstack -z relro -z now -nocompchk -Wall

LINKER       = $(CC)
LINKFLAGS    = $(CCFLAGS) $(OMP_DEFS) -mt_mpi

ARCHIVER     = ar
ARFLAGS      = r
RANLIB       = echo

3.配置好编译选项和编译依赖之后可以在顶层目录下执行编译指令

make arch=Linux_Intel64

成功编译后会在 bin/Linux_Intel64 目录下得到一个可执行文件 xhpl 以及一个输入文件 HPL.dat

4.最简单的运行方法是直接使用mpi运行这个可执行文件 xhpl ,所使用的进程数需要与输入文件中 p * q 相等。

cd bin/Linux_Intel64
mpirun -np 4 ./xhpl

注意在集群上你可能需要使用slurm进行任务提交,同时你也可能需要修改mpirun的参数。

5.你可以修改输入文件使用多组参数进行测试,但我们最终只收取一个结果。只有通过正确性测试的结果才能算作有效成绩。作为示例,一个正常的输出需要包含以下部分

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR00R2R4          35     4     4     1               0.07             4.4104e-04
HPL_pdgesv() start time Mon Jul 22 18:41:49 2024

HPL_pdgesv() end time   Mon Jul 22 18:41:49 2024

--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV--VVV-
Max aggregated wall time rfact . . . :               0.03
+ Max aggregated wall time pfact . . :               0.03
+ Max aggregated wall time mxswp . . :               0.03
Max aggregated wall time update  . . :               0.04
+ Max aggregated wall time laswp . . :               0.00
Max aggregated wall time up tr sv  . :               0.02
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   1.57008646e-02 ...... PASSED
================================================================================

性能调优提示

可以自行探索尝试的调优方向包括但不限于:

  1. 调整编译hpl时所使用的软件包,包括mpi实现、所使用的数学库等。不同的软件依赖在不同的系统和应用中可能会表现出较大的性能差距。
  2. 调整mpi的编译选项。有些编译选项会告诉编译器集群的特性或者一些优化策略,合理配置编译选项可能会带来一些性能提升。
  3. mpi的运行时选项和进程数配比。进程数对于程序的运行效率和性能有很大的影响,配合mpi的不同通信策略可能带来不同的效果。
  4. 调整输入规模和计算策略。在hpl顶层目录中的TUNING文件中对各个输入参数有比较详细的介绍,例如问题规模大小、问题分块大小、进程划分方式等对整个程序的性能都有很大的影响,你可以对这些参数进行调整来获得最佳的测试性能。

提交

请将程序的输出重定向至文件,并将文件提交至给定的目录下。