这里写自定义目录标题
HPL测试:求解稠密线性方程组
-
Linpack是测试高性能计算机系统浮点性能的基准测试,通过对高性能计算机采用高斯消元法求解一元N次稠密线程代数方程组的测试,评价高性能计算机的浮点计算性能。
-
计算机计算峰值是指计算机每秒钟能完成的浮点计算最大次数,是衡量计算机性能的一个重要指标。它包括理论浮点峰值和实测浮点峰值。
-
理论浮点峰值是该计算机理论上能达到的每秒钟能完成浮点计算最大次数,它主要是由 CPU的主频决定的。计算公式如下:
理论浮点峰值= C P U 主频 × C P U 每个时钟周期执行浮点运算次数 × C P U 数量 理论浮点峰值=CPU主频×CPU每个时钟周期执行浮点运算次数×CPU数量 理论浮点峰值=CPU主频×CPU每个时钟周期执行浮点运算次数×CPU数量 -
实测浮点峰值是指 Linpack 测试值。也就是说在这台机器上运行 Linpack 测试程序,通过各种调优方法得到的最优的测试结果。
-
HPL安装
MPICH
MPICH是MPI(Message-Passing Interface)的应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具,在程序设计语言上支持C/C++和Fortran。
sudo apt-get install gcc
sudo apt-get install gfortran
tar -zxvf mpich-xxx.tar.gz
cd mpich.xxx
//进行软件配置与检查:
//configure文件是一个可执行的脚本文件,它有很多选项
// --prefix指的是安装路径
./configure --prefix=/usr/local/mpich-3.4.2
make
make install
//!配置环境变量
//bashrc包含专用于某个用户的bash shell的信息
sudo vim ~/.bashrc
//最下面一行插入
export PATH=/usr/local/mpich-3.4.2/bin:$PATH
//更新配置文件
source ~/.bashrc
//!用which来检验下配置的环境变量是否正确。
which mpicc
which mpif90
GOTOBLAS
BLAS 库(Basic Linear Algebra Subprograms)即基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序。常见的BLAS有GOTO、Atlas、ACML、MKL。其中GotoBlas的性能最好,因此采用GotoBlas
https://www.tacc.utexas.edu/research-development/tacc-software/gotoblas2
tar -zxvf GotoBLAS2-1.13\ tar.gz
cd GotoBLAS2
vim f_check
sudo apt-get install lapack
cp /home/linpack/lapack-3.1.1.tgz ./
#复制lapack到GOTOBLAS目录
make clean
make TARGET=NEHALEM
HPL
www.netlib.org/benchmark/hpl
tar -xzvf hpl-2.2
mv hpl-2.2 hpl
cd hpl
cp ./setup/Make.Linux_PII_FBLAS ./
//此时打开LinPack的配置私房菜
//注意CCFLAGS参数改一下(增添-fuse-ld=gold -pthread -lm)
make arch=Linux_PLL_PBLAS
如果编译成功:
/hpl/bin文件下会产生一个新文件,里面有HPL.dat xhpl两个文件
mpirun -np 4 ./xhpl 没有出错的话,就是安装成功了
HPL定义
HPL是指用于分布式内存计算机的高性能 Linpack 基准测试的可移植实现。它主要由下面几个特点组成:
- 二维块循环数据分布
- 具有多个前瞻深度的行部分主元的 LU 分解的右视变体
- 具有主元搜索和列广播的递归面板分解组合
- 各种虚拟面板广播拓扑
- 带宽减少交换广播算法
- 具有深度 1 的前瞻的反向替换。
HPL自由度很大,使用者可以根据需要选择矩阵的规模,分块大小与分解方法。
HPL算法概述
求解N维线性方程组Ax=b的解,首先通过局部列主元的方法对N*(N+1)的[A b]系数矩阵进行LU分解为:[A,b]=[[LU],y]。由于下三角矩阵L因子所作的变换在分解的过程中也逐步应用到b上,所以最后方程组的解α就可以由转化为求解上三角矩阵U作为系数矩阵的线性方程组Ux=y从而得到.
为了保证良好的负载平衡和算法的可扩展性,数据是以循环块的方式分布到一个P×Q的由所有进程组成的2维网格中。NX(N+1)的系数矩阵首先在逻辑上被分成许多NBXNB大小的数据块,然后循环的分配到PXQ进程网格上去处理。这个分配的工作在矩阵的行、列两个方向同时进行。如图1所示。
图1a:一个矩阵被分成8×8个小块,要将它们分配到一个2×3的进程阵上,相同颜色的块被分配到同一个进程中去;图1b:为分配之后各个数据块在进程中的分布情况。前面所提到的N,NB,P,Q都是可以根据集群的具体配置和用户的需要而随时可以修改的。
HPL Frequently
- 我应该运行什么大小的问题?
- 为了找出系统的最佳性能,您应该瞄准内存中最大的问题大小。 HPL 使用的内存量本质上是系数矩阵的大小。例如,如果您有 4 个节点,每个节点有 256 Mb 的内存,这对应于 1 Gb 的总数,即 125 M 双精度(8 字节)元素。这个数字的平方根是 11585。肯定需要为操作系统和其他东西留下一些内存,所以 10000 的问题大小可能适合。根据经验,内存总量的 80% 是一个不错的猜测。如果您选择的问题大小太大,则会发生交换,并且性能会下降。如果在每个节点上生成多个进程(假设每个节点有 2 个处理器),那么重要的是每个进程的可用内存量。
- 我应该使用什么块大小的 NB ?
- HPL 使用块大小 NB 来进行数据分布以及计算粒度。从数据分布来看,NB越小,负载均衡越好。从计算的角度来看,NB 的值太小可能会在很大程度上限制计算性能,因为在内存层次结构的最高级别几乎不会发生数据重用。消息的数量也会增加。高效的矩阵乘法程序通常在内部被阻塞。该块因子的小倍数可能是 HPL 的良好块大小。底线是“好的”块大小几乎总是在 [32 … 256] 区间内。最佳值取决于系统的计算/通信性能比。在较小程度上,问题的大小也很重要。例如,您根据经验发现 44 块大小