MPI与mpi4py的编译安装
mpi4py是sysumoc程序使用的必备模块,它的编译安装有着严格的要求。默认情况下,编译sysumoc所链接的MPI库和编译mpi4py所链接的MPI库需要是同一个MPI库,否则程序就会无法运行。在超算上普通用户没有root权限,甚至会无法连接网络,所以会从源码编译安装mpi4py就非常重要。
一、有网络下pip编译安装mpi4py方法
注意,无论是否使用 conda 虚拟环境,都不建议用 conda install 的方式安装,因为 conda 安装的模块是事先编译好的,只有通过pip安装的包才会重新编译。
pip安装的mpi4py是默认使用当前环境下的mpicc命令编译的,pip安装命令:
1 | pip3 uninstall mpi4py # 安装前先删除旧的包 |
二、本地编译mpi4py
先将mpi4py的源码下载到本地,mpi4py 仓库地址:https://github.com/mpi4py/mpi4py
进入mpi4py源码文件夹,编译安装命令:
1 | rm -rf build # 删除编译好的文件,这一步非常重要,要不然切换MPI链接库后重新编译会没有作用 |
运行以下命令查看mpi4py链接的mpicc:
python3 -c “import mpi4py; print(mpi4py.get_config())”
输入下面命令可以查看mpicc路径
1 | which mpicc |
为什么说”链接的MPI库“而不是说“mpicc的版本”呢?
因为mpicc本身不是一个编译器,如果我们用vim打开mpicc文件,会发现其实它是一个脚本文件
1 | ! /bin/bash |
输入mpicc -show
,可以发现其实mpicc命令等同于显示出来的命令,如下图显示,他是由gcc为编译器,链接了一些MPI库,添加了一些编译选项。
因此可以认为,MPICC并不是一个编译器,而一个链接了MPI库和添加了一些编译选项的alias。最终决定编译后的程序的是编译时链接的MPI库,而不是使用了哪个alias
mpicc和mpiicc有什么区别?
严格的说,其实就只有mpicc这一种,mpiicc只是intel为了方便区分,使用gcc编译器链接MPI库还是自家的icc编译器链接MPI库。编译器与MPI库是可以任意组合的,比如icc可以和mpich组合,gcc也可以和intel mpi组合。在mpicc文件中我们可以找到这样一行
1 | CC="gcc" |
如果 CC=gcc 那么 mpicc 就是与 gcc 绑定的,如果将CC改为 CC=icc 那么mpicc就与icc绑定的。
icc与mpich绑定的mpicc命令:
超算中尽量使用绝对路径
超算平台有各种版本的python和mpicc,通过conda和module切换虽然方便,但是可能会有冲突,导致不知道当前环境加载的是哪个版本的程序。这里强烈建议使用绝对路径,
比如conda中的python3,就直接使用/public1/home/sc81558/.conda/envs/icc/bin/python3
比如oneapi中的mpicc就直接使用/public1/soft/oneAPI/2021.2/mpi/2021.2.0/bin/mpicc
绝对路径可以防止出现意外,同时也少加载了其他不必要的环境(比如使用oneapi,source加载就会加载其他很多不必要的环境)。
MPI与mpi4py的编译安装