本文使用 Zhihu On VSCode 创作并发布
首先HPC Challenge的编译需要bash。不能用cmd。
ubuntu会自带bash,win10需要另外安装bash,可以使用msys2 或者git bash
Makefile
hpcc有如下重要的文件夹
hpl,DGEMM,FFT,RandomAccess,src,STREAM,PTRANS
hpcc/hpl/setup 下有非常多的Make开头的文件,后缀表示不同的架构。可以按照自己的平台选
任选一个改,也可以。比如选Make.Linux_Pll_CBLAS
将其中一个文件比如Make.Linux_Pll_CBLAS, 移动到hpcc/hpl文件夹下。重命名为Make.Linux(其他的名也可以 Make.XXX 其中XXX任意
主要需要配置的就是
MPinc,MPlib,LAinc,LAlib ,LINKER,CC,CCFLAGS
MPI
版本:因为HPCC里面用了老的MPI_Address等等函数,所以用openmpi-4.0会报错。mpi 2.0 ok!
其中MPinc是mpi库的头文件mpi.h的路径。在ubuntu下,如果mpi.h不在gcc的默认搜索路径。需要自己添加。
一般在/usr/local/include或者/usr/include下面。
如果是源码编译的,注意./configure --prefix的值。比如有可能在/usr/local/openmpi/include下面
如果是/usr/local/openmpi/include,MPinc= -I/usr/local/openmpi/include 加上-I表示gcc的搜索头文件
gcc 搜索头文件,用-I (include的I) 搜索库文件用-L(library 的L) 链接动态库或静态库用-l(library 的头一个字母) 千万别弄混了。
MPlib是静态库或者动态库。
对于openmpi,需要libmpi.so的路径。对于mpich,需要libmpich.a的路径
如果libmpi.so在/usr/local/openmpi/lib下,MPlib=-L/usr/local/openmpi/lib -lmpi
-L表示静态库或动态库的路径,-l表示动态库或静态库的名字
如果是mpich,需要libmpich.a的路径,MPLib=-L/usr/lib/mpich/lib -lmpich
这里openmpi和mpich分别用动态库和静态库,是因为openmpi安装默认不产生静态库。
如果mpi.h,libmpi.so都在gcc的默认搜索路径里面,(如果用对应的mpicc编译,那必然在默认搜索路径里面)
也可以让MPinc,MPlib为空。
这里有一种糟糕的情况,就是同时安装了openmpi和mpich。这时候就需要注意,CC ,LINKER的mpicc到底是mpich的还是openmpi的。
通过which mpicc可以看到底是那个的
如果2个都装了,可能mpich的mpicc会被命名为mpicc.mpich
如果这种情况,使用mpich,CC,LINKER都需要是mpicc.mpich 运行hpcc的时候,要用mpirun.mpich
BLAS
LAinc,LAlib 类似,代表的是blas库。
Make.Linux里面的
HPL_OPTS = -DHPL_CALL_CBLAS
会保证hpcc使用blas库。
如果用openblas,就需要openblas的头文件cblas.h和静态库libopenblas.a 或者libcblas.a
如果用MKL,最好配置好MKL的环境变量。
MKL默认安装在/opt/intel/mkl
所以头文件路径LAinc= -I/opt/intel/mkl/include
在~/.bashrc中写上
source /opt/intel/mkl/bin/mklvars.sh intel64
然后source ~/.bashrc 就可以配置好mkl的环境变量
LAlib= -L/opt/intel/mkl/lib/intel64 -lmkl_rt 即可
如果不配置mkl的环境变量
LAlib= -L/opt/intel/mkl/lib/intel64 -lm -dl -lpthread -liomp5 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core 应该也可以
提醒:netlib的blas没有任何优化,如果要高性能至少要用openblas这种做了优化的。如果是intel的cpu,最好用mkl
mpich+openblas
最简单的办法。ubuntu的话
sudo apt-get install mpich sudo apt-get install libopenblas-dev在/usr/include 或者/usr/local/include里面找到mpich的头文件mpi.h
在/usr/lib或者/usr/local/lib里面找到libopenblas.a
按上面的方法配置就可以了。
建议用find 命令搜索
我的电脑的话,mpich 在/usr/lib/mpich下面
openblas 在/usr/lib/x86_64-linux-gnu/openblas下面。这样的话,如下配置
CC
CC= mpicc, LINKER= mpicc
或者CC=gcc ,LINKER=gcc
CCFLAGS 里面至少加个-O3 其他的编译器优化以后再说吧
Ubuntu编译
在hpcc文件夹下,打开bash
输入make arch=Linux
如果那个Make.Linux命名成http://Make.XXX,即hpl/http://Make.XXX
输入make arch=XXX也可以
如果编译失败后,改动了http://Make.XXX文件,最好make arch=XXX clean
然后再make arch=XXX
在hpcc文件夹下,有个Makefile,里面有
arch = UNKNOWN
include hpl/Make.$(arch)
输入arch就会改变Makefile include的对象。默认是include Make.UNKNOWN文件
Makefile文件后面有
all:
- $(MKDIR) hpl/lib/$(arch)
( $(CD) hpl/lib/arch/build ; $(MAKE) arch=$(arch) -f Makefile.hpcc )
以Make.Linux文件为例。hpcc/hpl/lib/arch/build下面的Makefile.hpcc文件,实际是负责各代码的实际编译
所以,如果要改动某个c文件的编译,可以去Makefile.hpcc里面改
编译成功后,hpcc文件夹下,会产生可执行文件hpcc
hpcc文件夹下,有_hpccinf.txt 重命名为hpccinf.txt 即可
mpirun -n 进程数 ./hpcc 即可执行hpcc测试
会产生一个hpccoutf.txt文件,即为输出结果。
如果提醒进程数不够的话,那是因为进程数是在hpccinf.txt 里面设定了,进程数的值必须等于hpccinf.txt里面的Ps*Qs
win10编译
win10的编译需要bash。可以用msys2代替。
msys2的环境配置请参考
本专栏的文章scalapack win安装及mingw64环境配置.下载msys2,现在应该可以去清华镜像源找。
安装好mingw64, msmpi 和openblas即可
msys2安装mingw64 gcc的默认头文件在/mingw64/include
默认库文件在/mingw64/lib
注意环境变量的问题。
选mingw-64 64bit那一个
选MSYS2其实也可以,不过要配置环境变量。也可以导入windows的环境变量。
如果用mingw64+msys2 是没有linux的sys头文件库的。
所以需要改一改源代码
用到sys头文件的地方为
hpcc/hpl/testing/ptimer中的HPL_ptimer_cputime.c HPC_ptimer_walltime.c
hpcc/hpl/testing/timer
这2个和计时有关的地方
关于cputime 和walltime的区别
建议参考https://blog.csdn.net/aganlengzi/article/details/21888351
HPL_ptimer_cputime.c中cpu时间有好几种计时方式,因为程序的计时用的是MPI_Wtime
cpu时间对最终的指标没有什么影响。(会反映在一些次要指标上)
为了跨平台,可以保留用time.h 中的clock实现的部分,其他部分删除。
HPC_ptimer_walltime.c中的HPL_ptimer_walltime()
需要gettimeofday函数
参考https://www.jb51.net/article/101476.htm
在win10下实现 ,删掉头文件部分即可。
#include
hpcc/hpl/testing/timer文件夹类似
然后在http://Make.XXX中CCFLAGS加上-DWIN32
改好的Make.msys2中,libmsmpi.a 是用lmsmpi去链接的,CC,LINKER都使用gcc ,其他的如上。
具体修改后的代码放在github
chenlin0/HPCC/S01E01
最后在hpcc文件下,make arch=msys2即可
不过运行的时候,因为msmpi没有提供mpirun
使用mpiexec 代替
参考文献
[1] https://blog.csdn.net/aganlengzi/article/details/21888351
[2] https://www.jb51.net/article/101476.htm