HPL 入门
HPL是目前Linpack的基准测试程序,关于Linpack的详细信息和如何优化等情况,请参考曹振南的文章《如何做Linpack测试及性能优化》。本文仅仅就目前Goto库的源代码编译和HPL编译运行做一简单的描述。
Goto源码包的下载请到http://www.tacc.utexas.edu/resources/software/,注册以后可以登陆下载Goto源代码,最新的源代码包为GotoBLAS-1.25.tar.gz。
1.GotoBlas源码编译
解开上述压缩包以后,然后编辑Makefile.rule,这是主要需要修改的配置文件。
1 #
2 # Beginning of user configuration
3 #
4
5 # This library's version
6 REVISION = -r1.25
7
8 # Which do you prefer to use for C compiler? Default isgcc.
9 # I recommend you to use GCC because inline assembler isrequired.
10 C_COMPILER =GNU
11 # C_COMPILER = INTEL
12
13 # Which do you prefer to use for Fortran compiler? Default isGNU g77.
14 # F_COMPILER = G77
15 # F_COMPILER = G95
16 # F_COMPILER = GFORTRAN
17 F_COMPILER =INTEL
18 # F_COMPILER = PGI
19 # F_COMPILER = PATHSCALE
20 # F_COMPILER = IBM
21 # F_COMPILER = COMPAQ
22 # F_COMPILER = SUN
23 # F_COMPILER = F2C
24
25 # If you need 64bit binary; some architecture can accept both32bit and
26 # 64bit binary(EM64T, Opteron, SPARC and Power/PowerPC).
27 BINARY64 = 1
28
29 # If you want to build threaded version.
30 # You can specify number of threads by environment value
31 # "OMP_NUM_THREADS", otherwise, it's automaticallydetected.
32 SMP = 1
33
34 # You may specify Maximum number of threads. It should beminimum.
35 # For OpenMP users; you have to specify MAX_THREADS even ifyou don't
36 # use threaded BLAS(MAX_THREADS >=OMP_NUM_THREADS * GOTO_NUM_THREADS)
37 MAX_THREADS = 16
55 # If you want to use memory affinity (NUMA)
56 # You can't use it with ALLOC_STATIC
57 # NUMA_AFFINITY =1
编译静态库 #make or make libs
编译动态库 # cd exports; make so
具体编译可以参考根目录下02QuickInstall.txt
如果Makefile.rule里面指定了使用thread (SMP=1),编译生成的Goto库文件名称为libgoto_core2p-r1.07.a,其中的p表示可以使用pthreads。由于曙光的机器目前单节点最大CPUCore数是16,所以这里指定MAX_THREADS = 16。
如果不想使用pthreads,可以明确禁止之。即不定义SMP=1。编译出来的库的名称是libgoto_core2-r1.07.a
根据我们的测试经验,使用pthreads测试出来的效果一般要优于使用纯MPI的测试结果。
这里用INTEL和PathscaleFortran编译器分别编译出来了Core2平台和Opteron的Goto库(纯MPI的这里暂时不提供,只提供Ptheads版本的)
HPL的编译采用mpi,需要C编译器和Fortran77编译器,建议使用GNU编译器(影响HPL性能的关键不在HPL程序本身,而在于它所用的BLAS库,所以HPL的编译采用GNU编译器已经足够,而且采用GNU编译器容易编译)。MPI推荐采用MPICH-1.2.7,这个版本比较稳定,使用简单。
2.MPICH-1.2.7的编译安装
#tar zxvf mpich-1.2.7.tar.gz
#cd mpich-1.2.7
#./configure --prefix=/opt/mpich-ether-gnu -cc=gcc -c++=g++-fc=g77 --disable-weak-symbols
#make
#make install
3.HPL编译安装
#tar zxvf hpl.tar.gz
#cd hpl
对于AMD平台,执行如下命令
#cp setup/Make.Linux_ATHLON_FBLAS Make.Goto
如果是Intel平台,则
#cp setup/Make.Linux_PII_FBLAS Make.Goto
下面编辑Make.Goto文件
找到
60 #----------------------------------------------------------------------
61 # - Platform identifier------------------------------------------------
62 #----------------------------------------------------------------------
63 #
64 ARCH = Goto
把ARCH的值改为Goto,其原来的值是Linux_ATHLON_FBLAS或者Linux_PII_FBLAS
然后找到
66 #----------------------------------------------------------------------
67 # - HPL Directory Structure / HPL library------------------------------
68 #----------------------------------------------------------------------
69 #
70 TOPdir = /root/hpl
把第70行的TOPdir变量的值改为你的当前目录的绝对路径,可以用pwd来确定。
接下来找到
77 #----------------------------------------------------------------------
78 # - Message Passing library (MPI)--------------------------------------
79 #----------------------------------------------------------------------
80 # MPinc tells the C compiler where to find the MessagePassing library
81 # header files, MPlib is defined to be the name of thelibrary to be
82 # used. The variable MPdir is only used for defining MPincand MPlib.
83 #
84 MPdir = /opt/mpich-ether-gnu
85 MPinc = -I$(MPdir)/include
86 MPlib = $(MPdir)/lib/libmpich.a
把84行的MPdir的路径改为刚才安装的mpich所在的目录绝对路径。其中第86行的libmpich.a是mpich-1.2.7的mpi消息传递库。
找到
88 #----------------------------------------------------------------------
89 # - Linear Algebra library (BLAS or VSIPL)-----------------------------
90 #----------------------------------------------------------------------
91 # LAinc tells the C compiler where to find the Linear Algebralibrary
92 # header files, LAlib is defined to be the name of thelibrary to be
93 # used. The variable LAdir is only used for defining LAincand LAlib.
94 #
95 LAdir = /root
96 LAinc =
97 LAlib = /root/hpl/libgoto_opteronp-r1.07.a
把第97行的LAlib的值改为goto库所在的绝对路径。其中如果是Opteron平台就使用附件里面的libgoto_opteronp-r1.07.a(建议采用Pathscale编译器编译的),是Xeon平台就是用附件里面的libgoto_core2p-r1.07.a(建议采用Intel编译器编译的)。
找到
165 #----------------------------------------------------------------------
166 # - Compilers / linkers - Optimization flags---------------------------
167 #----------------------------------------------------------------------
168 #
169 CC = /opt/mpich-ether-gnu/bin/mpicc
170 CCNOOPT = $(HPL_DEFS)
171 CCFLAGS = $(HPL_DEFS) -fomit-frame-pointer -O3-funroll-loops -W -Wall
172 #
173 # On some platforms, it is necessary to use the Fortranlinker to find
174 # the Fortran internals used in the BLAS library.
175 #
176 LINKER = /opt/mpich-ether-gnu/bin/mpif77
把169行和176行的编译器改为正确的C编译器和链接器。
至此,所有修改都已经OK。
执行如下命令进行编译hpl
#make arch=Goto
如果没有错误产生的话,将在当前目录下产生bin/Goto目录,里面是编译生成的xhpl和HPL.dat文件,如果有错误要重新编译的话,可以执行#make arch=Goto clean 进行清理以后再修改相关参数进行编译。
4.下面要调整HPL.dat参数,以运行xhpl
1 HPLinpack benchmark input file
2 Innovative Computing Laboratory, University of Tennessee
3 HPL.out5 output file name (if any)
4 8 device out(6=stdout,7=stderr,8=file)
5 1 # of problems sizes (N)
6 50000 Ns
7 2 # of NBs
8 256 192 NBs
9 0 PMAP process mapping (0=Row-,1=Column-major)
10 1 # of process grids (P xQ)
11 1 Ps
12 1 Qs
13 16.0 threshold
14 1 # of panel fact
15 0 1 2 PFACTs (0=left, 1=Crout, 2=Right)
16 1 # of recursive stopping criterium
17 2 4 NBMINs (>= 1)
18 1 # of panels in recursion
19 2 NDIVs
20 1 # of recursive panel fact.
21 0 1 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)
24 1 # of lookahead depth
25 1 DEPTHs (>=0)
26 2 SWAP (0=bin-exch,1=long,2=mix)
27 64 swapping threshold
28 0 L1 in (0=transposed,1=no-transposed) form
29 0 U in (0=transposed,1=no-transposed) form
30 1 Equilibration (0=no,1=yes)
31 8 memory alignment in double (> 0)
其中第4行改为8,这样运行完成以后会产生一个HPL.out的输出文件。
第6行N的大小选择,可以按照内存的80%来考量,比方说现在内存如果是32GB=32*1024*1024*1024Bytes
取内存的80%来作为hpl运行时的内存。N*N*8(1个double占用8个Bytes)= 32*1024*1024*1024*80% (总内存的80%),则可以得出N=58617
第7,8两行NB的选择上,建议采用256,192也可以。
第11,12行P和Q的乘积要符合你跑的进程总数。
比方一个两路4核的机器,共8个core,如果你要跑2个进程的话(每个进程跑4个线程),这里的P=1,Q=2。而如果你要跑1个进程的话(每个进程跑8个线程),则P=Q=1,其它的参数对LinPack的值影响不大,如果要求不是太苛刻,可以不用调整。更详细的参数调整,请参考曹振南的《如何做Linpack测试及性能优化》一文。
5.HPL运行
经过上面的参数调整,现在就可以运行HPL了。
#cd bin/Goto
编辑一个machinefile
#vi hostfile.mf
内容是你的hostname,尽量别用localhost。
比方说内容是:
node1
node1
node1
node1
node1
node1
node1
node1
接着设定每个进程要启动的线程总数,用OMP_NUM_THREADS环境变量来指定,需要注意的是该值与HPL.dat里面指定的进程数(P*Q)之积应该等于你的CPUcore总数。
#export OMP_NUM_THREADS=8
这里假设待测的机器上有8个Core,测试中用1个进程,每个进程起动8个线程。
然后就可以执行如下语句运行了:
#/opt/mpich-ether-gnu/bin/mpirun -machinefile ./hostfile.mf -np1 ./xhpl
测试中可以试试不同的进程、线程组合(如1个进程8线程,或者2个进程4线程)的优略。切记运行mpirun之前要确定OMP_NUM_THREADS的值是不是你期望的(可以用#echo$OMP_NUM_THREAD来查看)。