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

2dca854ff1bd30f78a775093b84a35e5.png

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
注意环境变量的问题。

a80af8a2f9696df651d63bc625988903.png


选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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值