之前给女朋友写了一个 HPL&HPCC 软件快速安装脚本,然后发到了网上给大家用==> 链接在这里
在这里记录一下编写的过程,以及一些收获。
这两个东西本质上就是 benchmark(跑分工具),用来测试计算机的性能的。只不过这两个东西和“娱乐大师”的区别在于,这两个东西主要衡量高性能计算机的并行计算能力。
这两者也是联系很密切的,我理解HPCC
为HPL
的拓展包,HPCC
在库上就直接使用了HPL
,最新的HPCC-1.5.0
使用的是HPL-2.0
(2016 年推出,之后HPCC
没有继续更新,猜测是出现了更好的 benchmark 软件。
其中表示意义的一词 LINPACK(Linear system package),线性系统软件包,是通过让计算机使用高斯消元法求解 N 元一次稠密线性方程组来评估计算机的浮点运算性能。
顾名思义,是一个打包好的,集成了一些其他评估方式在内的 benchmark 工具
我们可以在互联网上获取两者的源代码,之后需要对代码自行编译,才能得到可执行文件。这时候就产生了一个问题——
为什么不直接打包好,像我们平常使用的软件那样,直接发行可执行文件?
这是因为这两者都是为了评估计算机的运算性能的软件,专用性很强,必须和计算机的环境紧密结合,才能发挥最好的效果。其实,HPL
解压后,我们可以发现在根目录下存在一个configure
文件,这个文件可以自动检测环境并完成编译。但是有个条件,即所处的操作系统必须配置好了HPL
所需要的所有环境变量。
在我们的机群上运行该文件时,它会检测到机群 CPU 为
Intel Xeon E5-2620
,从而使用 Make.Linux_Intel64 模板尝试进行编译,但它没有找到需要的MKL
库,编译失败。实际上并不是我们的环境变量中没有MKL
,而是因为版本不同,导致以版本号作为目录的情况下无法识别到。举个例子来说,就是模板中认为应该去找SOFTWARE
,而我们机群中目录为SOFTWARE-2.0
我们都知道,HPL
软件包要想编译成功,需要系统拥有MPI
环境,且底层有线性代数子程序包 BLAS
的支持(或者向量信号图像处理库 VSIPL
),以及一些基础工具如gcc
、gcc-gfortran
等。
对于编译环境,常见的组合有
- HPL + Intel® Parallel Studio XE(intel 编译器 + intel mkl + intel-mpi)
intel 套件包含了数学库(mkl)、各种编译器(如 icc、gcc)和 intel mpi。
此外,安装 Intel 套件后,在其安装目录下的mkl/benchmarks/linpack
及mkl/benchmarks/mp_linpack
文件夹下有编译好的 linpack 及测试脚本,可直接使用;- HPL + ACML + GNU 编译器 + openmpi
ACML 由 AMD 推出,用于 AMD 的 cpu。- HPL + GNU 编译器+ blas 或 lapack 等数学库 + openmpi
数学库:blas/lapack 等
上述中的 openmpi 也可用 mpich
由于我们机群是Intel Xeon E5-2620
的 CPU,因此采用Intel
的解决方案最合适。
我们所在的目录是/home/train/stuxx
,在/train
目录下,可以发现存在一个bashrc
文件
# .bashrc
# source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
source /opt/intel/composer_xe_2015.1.133/bin/compilervars.sh intel64
source /opt/intel/impi/5.0.2.044/bin64/mpivars.sh
source /opt/intel/mkl/bin/intel64/mklvars_intel64.sh
查看文件内容可知,该文件在我们启动终端的时候,执行了三个.sh
文件,查看这三个文件可知,他们将基础运行库、MPI
、MKL
分别写入了环境变量。
这意味着什么呢我的好兄弟?
这意味着我们就不用了去网上下载乱七八糟搞不懂的BLAS
,CBLAS
,这个 mpi 那个 mpi 了,我们只要使用机群现有的就可以了。
插入一条信息,我早期尝试使用 Intel 官方的
MKL-2020
,结果2020
版竟然不能在RHEL 6(我们机群的操作系统)
上运行,只能在红帽 7 以后的版本运行。2019
可以,但是既然机器上有了,也就没必要下载了。
既然知道了这些,只要根据setup/
目录下的模板Make.Linux_Intel64
,稍微修改路径所在位置,就可以编译了(前面说过了,因为我们是E5-2620
(差不多是那个时候的服务器专用 U 了),所以选择Intel64
这一部分网络上教程很多,讲得也都很细致,这里在随便说一点,只列出修改的部分:
ARCH = sduwhhpl #改成你想取的名字,随便什么都行
TOPdir = $(HPL_HOME) #HPL的目录,这个HPL_HOME变量是我定义的,下面有详细讲解
MPdir = $(I_MPI_ROOT)#MPI的目录
LAdir = $(MKLROOT) #MKL的目录,其实这个不用改,本来就是这个,我只是放在这说明比较重要
真的就改这几个,所以不要看着网上的教程就跟着手把手做,建议弄懂每一步是为什么,然后结合自己机器的环境去做。因为我们的环境很多都配置好了,照着网上修改反而弄错(发现有一些账号操作导致环境变量变化,因此在脚本第二版本中加入了环境变量重导入语句)
这里面比较有意思的就是这个TOPdir
,这个目录是HPL
的目录,下面的很多操作都会调用这个目录。我们知道他的运行目录是在../stuxx/201800xxxxxx/
下,可是每个人的学号不一样,我又不想让大家每次用的时候都输入一个学号作为参数传进来。后来想了想,就增加了一个临时环境变量HPL_HOME
,如下:
HPL_HOME=$(pwd) #以当前所在目录作为值,其实就是你学号的目录
export HPL_HOME
source /etc/profile
unset HPL_HOME #销毁变量
HPCC
的编译过程其实就是编译一个HPL-2.0
的过程,只需要注意几个点:
TOPdir = ../../.. # HPL的目录不要改动,就用这个(因为本身是集成了HPL,它自己知道在哪
# 下面这两个需要注意,后面加上-std=c99,见下方解释
CCFLAGS = $(HPL_DEFS) -O3 -w -ansi-alias -i-static -z noexecstack -z relro -z now -nocompchk -Wall -std=c99
LINKFLAGS = $(CCFLAGS) $(OMP_DEFS) -mt_mpi -std=c99
第一次编译错误,提示STREAM/stream.c(178): error: expected a ";"
,这是哪门子的错误嘛?总不能是程序写错了?还是这种缺一个;
的错误?
后来查资料发现,HPCC-1.5.0
对流进行了修改,对其中的数组加入了关键字限制,要想编译stream
,必须使用c99
,因此加上-std=c99
总体来说,折腾的过程还是挺爽的。文件使用了FTP
协议传输,在脚本中用wget
获取,最后把中间下载的源码压缩包删除,使得结果干净。总体感觉还不错,写作业去了。
最后说一句,这个东西刚开始确实是为了帮女朋友装才搞的。