1简介
LINPACK是线性系统软件包(Linear system package) 的缩写。
Linpack现在在国际上已经成为最流行的用于测试高性能计算机系统浮点性能的benchmark。通过利用高性能计算机,用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。
Linpack测试包括三类,Linpack100、Linpack1000和HPL。Linpack100求解规模为100阶的稠密线性代数方程组,它只允许采用编译优化选项进行优化,不得更改代码,甚至代码中的注释也不得修改。Linpack1000要求求解规模为1000阶的线性代数方程组,达到指定的精度要求,可以在不改变计算量的前提下做算法和代码上做优化。HPL即High Performance Linpack,也叫高度并行计算基准测试,它对数组大小N没有限制,求解问题的规模可以改变,除基本算法(计算量)不可改变外,可以采用其它任何优化方法。前两种测试运行规模较小,已不是很适合现代计算机的发展,因此现在使用较多的测试标准为HPL,而且阶次N也是linpack测试必须指明的参数。
LINPACK压力测试的目的主要为检测系统中CPU的工作的稳定性及内存访问的稳定性。
2测试分类
Linpack测试分为两种测试方式,一 单板测试 二 集群测试
3 测试前的准备
为了提高CPU访问的内存的效率,及降低页表占用CPU资源。采用内存hugepage,系统进程是通过虚拟地址访问内存,但是CPU必须把它转换成物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
而在Linux中,内存都是以页的形式划分的,默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。这种增大的内存页尺寸在Linux 2.1中,称为Big page;在AS 3/4中,称为Hugepage。
如果系统有大量的物理内存(大于8G),则物理32位的操作系统还是64位的,都应该使用Hugepage。
注意:使用Hugepage内存是共享内存,它会一直keep在内存中的,不会被交换出去,也就是说使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。
所以在进行测试之前,一定要确保系统内核支持Hugepage内存分页。
4 测试步骤
第一部分:环境设置
1设置内存大页面
# umount /mnt
首先将临时挂载文件夹的目录/mnt卸载
# mount -t hugetlbfs none /mnt
挂载一个大页面系统,将hugetlbfs挂载到/mnt目录
# echo 3 >/proc/sys/vm/drop_caches
通过修改proc系统的drop_caches清理free的cach
# echo 80> /proc/sys/vm/nr_hugepages
设置大页面的数量
计算方式:
1 确定物理内存的大小
2 确定大页面单页的大小
大页面单页的大小,可以在内核中进行设置。查看方式:
# cat /proc/meminfo | grep huge
注|:大页面被设置后,这部分内存就会被占用,不能被其他程序所调用。建议大页面的容量应该在物理内存的80%左右。
例如:物理内存为4G,单页的大小为32M,则大页的数量应该设置为:4*1024*80%除以32 为102.,大页面的数量在102左右。原则上不超过这个值。
2 PATH设置
MPICH
提供并行环境的软件
1、下载mpich2.tar.gz压缩包,将其放在制定的目录下(这里以放在/usr/local/目录下为
例);
2、进入mpich2.tar.gz所在的目录,执行如下命令:
# tar xf mpich2.tar.gz –C /usr/local/
可以通过#which mpirun;which mpiexec来check是否安装成功
3、设置PATH环境变量
# export PATH=/usr/local/mpich2/bin:$PATH
4、配置/etc/mpd.conf文件
# echo “secretword=loongson” > /etc/mpd.conf
Secretword 是你的密钥,是每台机台进行并行环境运行的基础。
# chmod 600 /etc/mpd.conf
设置mpd.conf文件的权限
注:这是单板测试,如果在集群测试中,每个Node都必须添加该文件,并且设置文件的权限
5、执行mpd & 命令;
# mpd &
单机时启动MPI的命令 ,如果为集群测试,此处有修改,参见下面文档。
3
运行单板测试
在进行测试之前,需要进行HPL优化设置。
HPL的设置说明:
如果编译正常,在hpl/bin/Linux_xeon目录下就会生成两个文件HPL.dat和xhpl。 HPL.dat文件是Linpack测试的优化配置文件,这个对测试的结果十分重要,xhpl为可执行程序。如果是集群测试,就将linpack目录复制到机群中其余节点相同的目录下。注:公司提供的linpack为编译完成的,不在需要重新编译。
第1行HPLinpack benchmark input file
第2行Innovative Computing Laboratory, University of Tennessee
前两行为说明性文字,不用作修改
第3行 HPL.out output file name (if any)
第4行 6 device out (6=stdout,7=stderr,file)
device out"为"6"时,测试结果输出至标准输出(stdout)
"device out"为"7"时,测试结果输出至标准错误输出(stderr)
"device out"为其它值时,测试结果输出至第三行所指定的文件中
可以通过设置此处用来保存测试结果。
第5行 1 # of problems sizes (N)
选择矩阵的数量 如 1 则为第一个矩阵。
第6行10240 26680 28800 30720 29 30 34 35 Ns
矩阵的规模N越大,有效计算所占的比例也越大,系统浮点处理性能也就越高;但与此同时,矩阵规模N的增加会导致内存消耗量的增加,一旦系统实际内存空间不足,使用缓存、性能会大幅度降低。
由于之前采用了大页面内存系统,所以此处计算规模的大小,应以设置的大页面内存总量做计算。计算方式为:N*N*8=大页内存总量*0.8 ,内存总量换算为字节。
而且规模的大小最好为384的倍数。
第7行 1 # of NBs
第8行 128 2 3 4 NBs
提高数据的局部性,从而提高整体性能,HPL采用分块矩阵的算法。分块的大小对性能有很大的影响,NB的选择和软硬件许多因素密切相关。NB值的选择主要是通过实际测试得到最优值。但NB的选择上还是有一些规律可寻,如:NB不可能太大或太小,一般在256以下;NB × 8一定是Cache line的倍数等。例如,我们的L2 cache为1024K, NB就设置为192另外,NB大小的选择还跟通信方式、矩阵规模、网络、处理器速度等有关系。一般通过单节点或单CPU测试可以得到几个较好的NB值,但当系统规模增加、问题规模变大,有些NB取值所得性能会下降。所以最好在小规模测试时选择3个左右性能不错的NB,再通过大规模测试检验这些选择。此处一般选择128。
第9行 1 PMAP process mapping (0=Row-,1=Column-major)
选择处理器阵列是按列的排列方式还是按行的排列方式。按HPL文档中介绍,按列的排列方式适用于节点数较多、每个节点内CPU数较少的系统;而按行的排列方式适用于节点数较少、每个节点内CPU数较多的大规模系统。在机群系统上,按列的排列方式的性能远好于按行的排列方式。此处一般选择1
第10行 3 # of process grids (P x Q)
第11行 2 1 4 Ps
第12行 2 4 1 Qs
)第10~12行说明二维处理器网格(P × Q),二维处理器网格(P × Q)的有以下几个要求。
P × Q = 系统CPU数 = 进程数。一般来说一个进程对于一个CPU可以得到最佳性能。对于Intel Xeon来说,关闭超线程可以提高HPL性能。P≤Q;一般来说,P的值尽量取得小一点,因为列向通信量(通信次数和通信数据量)要远大于横向通信。P = 2n,即P最好选择2的幂。HPL中,L分解的列向通信采用二元交换法(Binary Exchange),当列向处理器个数P为2的幂时,性能最优。例如,当系统进程数为4的时候,P × Q选择为1 × 4的效果要比选择2 × 2好一些。 在集群测试中,P × Q = 系统CPU总核数。如系统为总核数为16核,则P*Q值应该为4.
第13行 16.0 threshold
第13行说明测试的精度。这个值就是在做完线性方程组的求解以后,检测求解结果是否正确。若误差在这个值以内就是正确,否则错误。一般而言,若是求解错误,其误差非常大;若正确,则很小。所以没有必要修改此值
第14行1 # of panel fact
第15行 0 1 2 PFACTs (0=left, 1=Crout, 2=Right)
第16行 2 # of recursive stopping criterium
第17行 2 4 NBMINs (>= 1)
第18行 1 # of panels in recursion
第19行 2 NDIVs
第20行 3 # of recursive panel fact.
第21行 0 1 2 RFACTs (0=left, 1=Crout, 2=Right)
第14~21行指明L分解的方式。在消元过程中,zHPL采用每次完成NB列的消元,然后更新后面的矩阵。这NB的消元就是L的分解。每次L的分解只在一列处理器中完成。对每一个小矩阵作消元时,都有3种算法:L、R、C,分别代表Left、Right和Crout。在LU分解中,具体的算法很多,测试经验,NDIVs选择2比较理想,NBMINs 4或8都不错。而对于RFACTs和PFACTs,对性能的影响不大。在HPL官方文档中,推荐的设置为:
1 # of panel fact
1 PFACTs (0=left, 1=Crout, 2=Right)
2 # of recursive stopping criterium
4 8 NBMINs (>= 1)
1 # of panels in recursion
2 NDIVs
1 # of recursive panel fact.
2 RFACTs (0=left, 1=Crout, 2=Right)
第22行 1 # of broadcast
第23行 0 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
第22、23行说明L的横向广播方式,HPL中提供了6种广播方式。其中,前4种适合于快速网络;后两种采用将数据切割后传送的方式,主要适合于速度较慢的网络。目前,机群系统一般采用千兆以太网甚至光纤等高速网络,所以一般不采用后两种方式。一般来说,在小规模系统中,选择0或1;对于大规模系统,选择3。推荐的配置为:
2 # of broadcast
3 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
第24行 1 # of lookahead depth
第25行 0 DEPTHs (>=0)
第24、25行说明横向通信的通信深度。这依赖于机器的配置和问题规模的大小,推荐配置为:
2 # of lookahead depth
0 1 DEPTHs (>=0)
第26行 0 SWAP (0=bin-exch,1=long,2=mix)
第27行 32 swapping threshold
第26、27行说明U的广播算法。U的广播为列向广播,HPL提供了3种U的广播算法:二元交换(Binary Exchange)法、Long法和二者混合法。SWAP="0",采用二元交换法;SWAP="1",采用Long法;SWAP="2",采用混合法。推荐配置为:
2 SWAP (0=bin-exch,1=long,2=mix)
60 swapping threshold
第28行 0 L1 in (0=transposed,1=no-transposed) form
第29行 0 U in (0=transposed,1=no-transposed) form
第28、29行分别说明L和U的数据存放格式。若选择"transposed",则采用按列存放,否则按行存放。推荐配置为:
0 L1 in (0=transposed,1=no-transposed) form
0 U in (0=transposed,1=no-transposed) form
第30行 1 Equilibration (0=no,1=yes)
第30行主要在回代中使用,一般使用其默认值
第31行 8 memory alignment in double (> 0)
第31行的值主要为内存地址对齐而设置,用于在内存分配中对齐地址。出于安全考虑,可以选择8
运行
一、单进程(即4核4线程)情况
直接执行./xhpl即可;
二、两进程(即8核8线程)情况:
# mpirun -np 2 ./xhpl
集群测试
配置环境
各板子配置ssh免密码登录
系统一般已经启用了SSH服务,
1 #:cd ~/.ssh
进入系统保存SSH密钥的目录
2 #:ssh-keygen -t rsa
生成私钥
3:cp id_rsa.pub authorized_keys
id_rsa_pub是与本机上面的私钥可以对上号的公钥。
由于每台机器既要当作SSH服务器又要当作SSH客户端,因此我们需要做的就是将这对公钥和私钥分发给每台机器,但是首先必须将公钥的文件名改 成"authorized_keys"
4:scp * test@192.168.1.2:~ /.ssh/
将私钥和公钥分发到各个子板。通过远程CP将私钥和公钥复制到各个子板的.ssh目录下。用来实现各节点之间的免密码SSH登陆。
5 尝试是否可以实现无密码登陆。
使用 SSH xx.xx.xx.xx或者SSH 主机名的方式check是否实现免密码登陆
设置主机名映射和IP
准备确保网络环境是可以联通的。可以设置各节点的网卡的静态IP,及各节点的主机名称。
命令为:hostname test1
编辑各子板/etc/hosts文件,添加各子板IP与主机名映射。
VI /etc/hosts文件,格式如下:
192.168.1.1test1
192.168.1.2 test2
注意 各个节点都应该添加该文件
文件m,添加要联跑的主机名(一行写一个)
格式为:test1
Test2
可以通过mpdboot –n 【主机名】-f m 来验证并行环境是否建立。
配置测试环境
集群测试环境的配置和单板一致,但必须确保每个节点的环境一致。
需要注意的是:在启动MPI并行环境时,应采用运行
mpdboot -n [主机数量] -f m
编辑HPL.dat文件。更改规模,Ps,Qs值,
规则:1.Ps<Qs
Ps为2的n次方。
Ps*Qs = 联跑主机的总核数/4
规模计算方法:
mpi分配计算量是每个板子一样的。
应该按照内存最小子板的大页数来计算规模的大小
运行
运行mpiexec -n [Ps*Qs的值] ./xhpl