天天看点

5.15 vs2019 静态编译_HPCC S01E01 编译 win10,ubuntu 安装

本文使用 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下面。这样的话,如下配置

5.15 vs2019 静态编译_HPCC S01E01 编译 win10,ubuntu 安装

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

注意环境变量的问题。

5.15 vs2019 静态编译_HPCC S01E01 编译 win10,ubuntu 安装

选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

继续阅读