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
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值