【国产化实践】飞腾+麒麟平台OpenBLAS编译与HPL性能测试

1. 项目背景

在国产化平台进行性能评估时,HPL(High Performance Linpack)是最常用的双精度浮点性能测试工具。但由于官方文档主要面向 x86 平台,在飞腾 CPU + 银河麒麟系统下部署 HPL 时,经常会遇到 MPI、BLAS 库路径、Makefile 配置等问题。

本文基于飞腾 D2000 + 银河麒麟 V10 环境,完整记录 MPICH、OpenBLAS、HPL 的编译部署过程,并详细介绍 HPL.dat 参数配置及性能调优思路,希望帮助读者快速完成国产化平台 HPL 环境搭建。

2. 测试环境

项目内容
CPU飞腾 D2000
操作系统银河麒麟V10
GCC9.3.1
MPImpich-3.3.2
HPL2.3
内存64GB
编译器gcc/gfortran

2.1 环境准备

主要包含hpl-2.3、mpich-3.3.2、OpenBLAS-develop软件源码的编译安装,软件源码可以私信我获取

2.2 测试原理

        HPL测试工具
            │
       调用BLAS接口
            │
         OpenBLAS
            │
         MPI通信
            │
        MPICH/OpenMPI

HPL 本身不提供矩阵计算能力,它依赖 BLAS 库完成矩阵运算,并依赖 MPI 完成多进程通信,因此需要先安装 MPI 和 OpenBLAS。

3.1 安装依赖

apt install gcc g++ gfortran make cmake
(麒麟服务器版:dnf install gcc-c++ gcc-gfortran make cmake)

3. mpich源码编译安装

将mipch-3.3.2.tar.gz源码解压到系统路径下

验证:

tar -xzvf mpich-3.3.2.tar.gz
cd mpich-3.3.2
./configure -prefix=/root/install (指定安装目录)
make
make install
/root/install/bin/mpicc -v #查mpi是否安装成功和版本号

4. OpenBLAS库源码编译

4.1 解压源码到系统目录

4.2 使用make 命令编译OpenBLAS库

编译完成之后可在目录下看到libopenblas.a,验证库是否正常。

4.3 使用make install 命令安装库文件

make install之后库文件会安装在/opt/OpenBLAS目录下,可ls /opt/OpenBLAS查看是否安装成功

5. HPL源码编译安装

5.1 解压HPL源码到系统目录下

tar -xzvf hpl-2.3.tar.gz .
cd hpl-2.3

5.2 从setup目录下拷贝相近的编译配置文件并修改

cp setup/Make.Linux_PII_CBLAS Make.Linux_Arm
修改Make.Linux_Arm编译配置文件,需要修改以下配置:

ARCH         = Linux_Arm #编译的平台架构

TOPdir       = /root/kylin/linpack/hpl-2.3  #实际的HPL源码目录
HPLlib       = $(LIBdir)/libhpl.a

MPdir        = /root/install #mpi的实际安装目录
MPlib        = $(MPdir)/lib/libmpi.a

LAdir        = /opt/OpenBLAS 	#OpenBLAS库的实际安装目录
LAlib        = $(LAdir)/lib/libopenblas.a

HPL_LIBS     = $(HPLlib) $(LAlib) $(MPlib) -ludev -lpthread  -lrt #编译报错增加此编译选项

LINKER       = /usr/bin/gfortran  #修改链接器
LINKFLAGS    = $(CCFLAGS) -ludev #编译报错增加此编译选项

参数说明
ARCH平台架构
TOPdirHPL源码目录
MPdirMPI安装目录
LAdirOpenBLAS安装目录
LINKERFortran链接器

5.3 使用make arch=Linux_Arm命令开始编译

5.4 编译完成之后可在bin/Linux_Arm目录下看到HPL.dat和xhpl测试程序

6. HPL.dat配置详解

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)
100000        Ns #求解一个100000*100000的矩阵,矩阵规模N*N,矩阵大小为100000^2*8约等于80G,最好占物理内存的80~90%。
1            # of NBs
192          NBs #192*192为1个block,HPL会将整个矩阵切成很多block,逐块计算
0            PMAP process mapping (0=Row-,1=Column-major) #MPI映射方式,默认即可
1            # of process grids (P x Q)
2            Ps #P和Q表示MPI进程排列,不是进程随便排,而是2行2列
2            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
0            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1            # of lookahead depth
0            DEPTHs (>=0)
0            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)

7. HPL测试

测试运行命令

先切换到HPL测试程序所在目录
cd bin/Linux_Arm
执行如下测试指令
/root/install/bin/mpirun -np 4 ./xhpl

8. 常见问题

问题1

编译hpl源码时报如下错误:

/usr/bin/ld: blas_server.c:(.text+0x538): undefined reference to `pthread_getaffinity_np'
/usr/bin/ld: /opt/OpenBLAS/lib/libopenblas.a(blas_server.o): in function `blas_thread_init':
blas_server.c:(.text+0x70c): undefined reference to `pthread_create'

/usr/bin/ld: topology-linux.c:(.text+0x3500): undefined reference to `udev_device_get_property_value'
/usr/bin/ld: topology-linux.c:(.text+0x3528): undefined reference to `udev_device_get_property_value'
/usr/bin/ld: topology-linux.c:(.text+0x3550): undefined reference to `udev_device_get_property_value'
/usr/bin/ld: topology-linux.c:(.text+0x3578): undefined reference to `udev_device_get_property_value'
/usr/bin/ld: topology-linux.c:(.text+0x35a0): undefined reference to `udev_device_get_property_value'
/usr/bin/ld: topology-linux.c:(.text+0x35bc): undefined reference to `udev_device_unref'

解决方法:修改编译配置文件,增加-ludev -lpthread编译选项

9. 平台理论算力计算

理论值:

双精度算力理论GFLOPS=CPU主频*CPU核心数*CPU每个指令周期执行的浮点运算次数
举个例子:
飞腾S5000C-16核开发板,CPU的主频是2.3GHz,拥有16个核心,每个指令周期能够执行8次浮点运算,所以飞腾S5000C-16核开发板的理论算力为294.4GFlops,实际测试结果为230GFlops,达到78%。

在这里插入图片描述

10. 总结

本文完成了飞腾 D2000 + 银河麒麟 V10 平台下 MPICH、OpenBLAS 和 HPL 的部署,并成功完成双精度浮点性能测试。

HPL 的性能不仅与编译过程有关,更与 HPL.dat 参数配置、MPI 进程绑定、NUMA 架构及 BLAS 库优化密切相关。后续将继续分享 HPL.dat 参数调优、MPI CPU 绑定、NUMA 优化以及飞腾平台性能调优等内容,希望逐步形成国产化平台 HPC 性能测试系列文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值