MPI与mpi4py的编译安装

mpi4py是sysumoc程序使用的必备模块,它的编译安装有着严格的要求。默认情况下,编译sysumoc所链接的MPI库和编译mpi4py所链接的MPI库需要是同一个MPI库,否则程序就会无法运行。在超算上普通用户没有root权限,甚至会无法连接网络,所以会从源码编译安装mpi4py就非常重要。

一、有网络下pip编译安装mpi4py方法

注意,无论是否使用 conda 虚拟环境,都不建议用 conda install 的方式安装,因为 conda 安装的模块是事先编译好的,只有通过pip安装的包才会重新编译。

pip安装的mpi4py是默认使用当前环境下的mpicc命令编译的,pip安装命令:

1
2
3
4
5
pip3 uninstall mpi4py  # 安装前先删除旧的包
pip3 install mpi4py --no-cache-dir --user

--no-cache-dir # 防止直接从缓存安装mpi4py,因为缓存里的mpi4py也是编译好的。
--user # 没有root权限,mpi4py只能安装在用户目录

二、本地编译mpi4py

先将mpi4py的源码下载到本地,mpi4py 仓库地址:https://github.com/mpi4py/mpi4py

进入mpi4py源码文件夹,编译安装命令:

1
2
3
rm -rf build  # 删除编译好的文件,这一步非常重要,要不然切换MPI链接库后重新编译会没有作用
python3 setup.py build --mpicc=[需要链接的mpicc的路径]
python3 setup.py install --user

运行以下命令查看mpi4py链接的mpicc:

python3 -c “import mpi4py; print(mpi4py.get_config())”
输入下面命令可以查看mpicc路径

1
which mpicc

为什么说”链接的MPI库“而不是说“mpicc的版本”呢?
因为mpicc本身不是一个编译器,如果我们用vim打开mpicc文件,会发现其实它是一个脚本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
! /bin/bash

# (C) 2006 by Argonne National Laboratory.
See COPYRIGHT in top-level directory.

# mpicc
Simple script to compile and/or link MPI programs.
This script knows the default flags and libraries, and can handle
alternative C compilers and the associated flags and libraries.
The important terms are:
includedir, libdir - Directories containing an *installed* mpich
prefix, execprefix - Often used to define includedir and libdir
CC - C compiler
WRAPPER_CFLAGS - Any special flags needed to compile
WRAPPER_LDFLAGS - Any special flags needed to link
WRAPPER_LIBS - Any special libraries needed in order to link

# We assume that (a) the C compiler can both compile and link programs

# Handling of command-line options:
This is a little tricky because some options may contain blanks.

# Special issues with shared libraries - todo

# --------------------------------------------------------------------------
Set the default values of all variables.

输入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加载就会加载其他很多不必要的环境)。

作者

echo

发布于

2022-12-01

更新于

2024-08-10

许可协议

评论