目录
4.1 修改run_linpack_GPU_dgx1_1xv100_cuda10.1脚本文件
一、Linpack简介
Linpack是国际上最流行的用于测试高性能计算机系统浮点性能的benchmark。通过对高性能计算机采用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。
Linpack 测试包括三类,Linpack100、Linpack1000和HPL。Linpack100求解规模为100阶的稠密线性代数方程组,它只允许采用编译优化选项进行优化,不得更改代码,甚至代码中的注释也不得修改。Linpack1000要求求解1000阶的线性代数方程组,达到指定的精度要求,可以在 不改变计算量的前提下做算法和代码上做优化。HPL即High Performance Linpack,也叫高度并行计算基准测试,它对数组大小N没有限制,求解问题的规模可以改变,除基本算法(计算量)不可改变外,可以采用其它任何优化方 法。前两种测试运行规模较小,已不是很适合现代计算机的发展。
HPL是针对现代并行计算机提出的测试方式。用户在不修改任意测试程序的基础上,可 以调节问题规模大小(矩阵大小)、使用CPU、GPU数目、使用各种优化方法等等来执行该测试程序,以获取最佳的性能。HPL采用高斯消元法求解线性方程组。求解 问题规模为N时,浮点运算次数为(2/3 * N^3-2*N^2)。因此,只要给出问题规模N,测得系统计算时间T,峰值=计算量(2/3 * N^3-2*N^2)/计算时间T,测试结果以浮点运算每秒(Flops)给出。HPL测试结果是TOP500排名的重要依据。
衡量计算机性能的一个重要指标就是计算峰值或者浮点计算峰值,它是指计算机每秒钟能完成的浮点计算最大次数。包括理论浮点峰值和实测浮点峰值。理论浮点峰值是该计算机理论上能达到的每秒钟能完成浮点计算最大次数,它主要是由CPU的主频决定的。
二、环境准备
检查GPU节点GPU卡驱动及CUDA是否正确安装,使用nvidia-smi 查看驱动版本是否满足xhpl 程序运行的环境要求,由于GPU Linpack测试所需要的xhpl文件并未在官方文件中给出,获取途径有2种方法,一种是通过nvidia内部获取,另外一种就是自行使用hpl编译生成GPU Linpack测试程序xhpl,需要说明的是通过nvidia官方获取的测试文件是经过特定场景测试优化过的,现场测试方法简单,工作量相对较小,但是灵活性较差,只有简单参数修改,自行编译xhpl,需要编译安装的依赖软件较多,难度相对较大,网上可参考文献资料较少,但是可以根据现场环境及要求,可以灵活修改相关参数,调优的空间大,本文主要介绍通过官方获取到的二进制文件的使用方法。后续更新手动编译生成xhpl测试GPU Linpack的文档。
2.1 名词解释与相关说明
关于GPU Linpack测试的名词解释
架构:
目前GPU Linpack测试依据架构和产品的不同运行的脚本会有相应的部分差异,针对的都是nvidia的Tesla系列的产品进行测试的。架构不同,GPU里面能够用来处理计算的线程数量也不同,因而脚本的区别在于处理计算时,线程的数量等不尽相同。
NVIDIA数据中心系列的产品及其对应的架构:
Volta架构:V100
Ampere架构:A100、A800
Hopper架构:H100、H800、H200
Pascal架构:P100,P4,P40等(P100具有双精度,可用来进行双精度的Linpack测试)
Kepler架构:K80,K40等
理论峰值:
GPU Linpack的理论峰值与CPU不同,不是完全通过计算主频等得来的,而是以nvidia发布的单卡技术白皮书为准。
总的理论峰值 = GPU单卡理论峰值(来自于官网)*GPU卡的数量
下面图片是Tesla V100技术白皮书中给出理论的Linpack值:
下面图片是Hopper H100技术白皮书中给出理论的Linpack值:
2.2 准备测试相关的文件
主要需要用到的文件如下,该文件的命名已经给出了其基本的环境命名,通过解压即可获得文件内部的运行脚本,最主要的是要用到xhpl这个可执行程序及运行脚本。
xhpl_cuda-10.1-dyn_mkl-static_ompi-3.1.3_gcc4.8.5_3-12-19b
注意:其实基本的所需基础软件环境已经在名称中显示,尽量严格按照命名中的环境来就没有问题,如名称为cuda-10.1:表示需要使用cuda 10.1的环境ompi-3.1.3:表示需要使用openmpi-3.1.3(GNU版本的,因为下面的gcc_4.8.5 表示需要使用4.8.5版本的gcc环境)
2.3 测试环境介绍
测试集群为某项目部署的48台宁畅X620-G30 主机名是GGN001-GGN048
CPU:每节点2颗*16 core
每节点1张Tesla v100 32G显存
操作系统:CentOS 7.6 1810
以上面xhpl_cuda-10.1-dyn_mkl-static_ompi-3.1.3_gcc4.8.5_3-12-19b
的文件为例基本环境如下:
- CUDA:10.1 GPU卡驱动使用cuda自带的GPU卡驱动,版本为418.39 (A100需要CUDA 11.0以上,H100需要12.0以上,相应的其它软件版本也要对应)
- UCX 1.6
- OpenMPI:openmpi 3.1.3
- GCC编译器:4.8.5
- 测试的硬件架构类型:Volta架构
- numactl rpm包,该包为CPU用来绑定CPU核心的(yum源安装,操作系统自带)
这是A100的测试文件:xhpl_cuda-11.0-dyn_mkl-static_ompi-4.0.4_gcc4.8.5_7-23-20
目前clussoft2.4软件中未提供基于GNU 3.1.3版本的OpenMPI,所以需要额外单独下载对应版本的OpenMPI,编译安装。(曙光目前使用clusbench2.0或3.0集群一键测试工具,里面集成了测试环境所需的软件和依赖,无需额外安装编译软件,一键运行测试程序,支持cpu、gpu、内存stream、IB网络IMB等测试,非常方便,本文主要目的为了让广大读者了解测试原理和手动环境搭建的步骤)
ps:有些特殊用户无法接外网的情况下,可能OpenMPI的版本无法准确匹配,建议可以将缺少的动态链接库进行软链接到类似的库
如缺少libmpi.so.12的库,但是在我们clussoft里面的OpenMPI-GNU版本的库中有libmpi.so.20,那么可以通过软链接进行链接,如:
ln –s libmpi.so.20 libmpi.so.12
具体视情况分析,万不可照搬照抄本文内容
2.4 手动编译安装openmpi
安装openmpi-3.1.3之前,需要先安装ucx1.6.0,为什么要安装ucx呢?下面简单介绍下
ucx是一个以数据中心和高性能应用程序,生产级通信框架,经过优化的生产验证的通信框架,适用于现代、高带宽和低延迟网络。通过使用它可以提高网络性能,主要包括RDMA(InfiniBand and RoCE),TCP,GPUS,共享内存管理,网络原子操作等,支持openmpi3.0及以上版本,以下是官方给出的架构图
2.4.1 编译安装UCX
下载地址:
https://github.com/openucx/ucx/releases/tag/v1.10.0
mkdir /public/software/GPU_linpack_test/ucx-1.6.0
cd /public/sourcecode
tar xvf ucx-1.6.0.tar.gz
cd ucx-1.6.0
./configure --prefix=/public/software/GPU_linpack_test/ucx-1.6.0
make -j 8
make install
设置环境变量
vim /public/software/profile.d/ucx-1.6.0.sh
#!/bin/bash
export UCX_HOME=/public/software/GPU_linpack_test/ucx-1.6.0
export PATH=$UCX_HOME/bin:$UCX_HOME/bin"${PATH:+:${PATH}}"
export LD_LIBRARY_PATH=$UCX_HOME/lib"${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
export LD_LIBRARY_PATH=$UCX_HOME/lib/ucx"${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
export C_INCLUDE_PATH=$UCX_HOME/include"${C_INCLUDE_PATH:+:${C_INCLUDE_PATH}}"
export INCLUDE_PATH=$UCX_HOME/include"${INCLUDE_PATH:+:${INCLUDE_PATH}}"
export MANPATH=$UCX_HOME/share/ucx:${MANPATH}
2.4.2 编译安装openmpi
下载地址:https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.3.tar.bz2
tar xvf openmpi-3.1.3.tar.gz
cd openmpi-3.1.3
./configure --prefix=/public/software/GPU_linpack_test/openmpi-3.1.3 --enable-mpi-cxx --enable-mpirun-prefix-by-default --enable-mpi-thread-multiple --with-ucx=/public/software/GPU_linpack_test/ucx-1.6.0 CC=icc CXX=icpc FC=ifort F77=ifort
make -j 8
make install
设置环境变量
vim /public/software/profile.d/mpi_openmpi-3.1.3.sh
#!/bin/bash
export MPI_HOME=/public/software/GPU_linpack_test/openmpi-3.1.3
export PATH=$UCX_HOME/bin:$ MPI_HOME/bin"${PATH:+:${PATH}}"
export LD_LIBRARY_PATH=$ MPI_HOME/lib"${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"
export C_INCLUDE_PATH=$ MPI_HOME/include"${C_INCLUDE_PATH:+:${C_INCLUDE_PATH}}"
export INCLUDE_PATH=$ MPI_HOME/include"${INCLUDE_PATH:+:${INCLUDE_PATH}}"
export OMPI_MCA_btl_openib_warn_default_gid_prefix=0
export OMPI_MCA_btl_openib_warn_no_device_params_found=0
export UCX_WARN_UNUSED_ENV_VARS=n