Python使用MPI(mpi4py)实现并行计算

图片

前言

计算机编程语言很多,但是适合高性能数值计算的语言却并不多,在高性能计算的项目中通常会使用到的语言有 Fortran、C、C++ 等,他们是传统的高性能计算机语言,这主要得益于它们的静态编译特性,使得有它们生成的机器代码,在底层上做了很多优化,能够充分发挥硬件的性能,但是这一特性也限制了它们的灵活性和易用性。一些动态的计算机语言在灵活性和易用性方面有着明显的优势,但是由于性能等其他方面的原因却并不适合用来做大规模的数值计算,更别说用到高性能计算领域了。

但是近年来 Python 却在数值计算领域占据了越来越大的份额,甚至在高性能计算领域也看到越来越多 Python 的身影。这是因为 Python 已经不仅仅只是作为一个单独的计算机编程语言,而是变成了一个由庞大的库和工具组成的完整生态系统,在数值计算方面也是如此,包含着有 Numpy、Scipy、Pandas 等构成的科学数值计算库。这些数值计算库和工具在底层一般封装和调用由 Fortran、C、C++ 等实现的高效算法库,因此在一定程度上弥补了 Python 本身性能上的不足,却丝毫不损害其灵活性和易用性。但是将 Python 应用到高性能计算上还需要有相应的支持工具,MPI(消息传递接口)就是其中非常重要的一个。本文就将简要介绍 mpi4py,一个构建在 MPI 之上的 Python库,允许在 Python 环境下使用 MPI 接口进行多进程并行甚至分布式的高性能计算。

MPI (Message Passing Interface)

MPI 的全称是 Message Passing Interface,即消息传递接口。它是一种用于编写并行程序的标准,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性,有 MPICH、OpenMPI 等一些具体的实现,提供 Fortran、C、C++ 的相应编程接口。MPI 的目标是高性能,大规模性,和可移植性。MPI 在今天仍为高性能计算的主要模型。MPI 的工作方式很好理解,我们可以同时启动一组进程,在同一个通信域中不同的进程都有不同的编号,程序员可以利用 MPI 提供的接口来给不同编号的进程分配不同的任务和帮助进程相互交流最终完成同一个任务。就好比包工头给工人们编上了工号然后指定一个方案来给不同编号的工人分配任务并让工人相互沟通完成任务。

MPI 的具体实现并没有提供 Python 的编程接口,这就使得我们没法直接地使用 Python 调用 MPI 实现高性能的计算,不过幸运的是,我们有 mpi4py。mpi4py 是一个构建在 MPI 之上的 Python 库,主要使用 Cython 编写,它以一种面向对象的方式提供了在 Python 环境下调用 MPI 标准的编程接口,这些接口是构建在 MPI-2 C++ 编程接口的基础之上的,因此和 C++ 的 MPI 编程接口非常类似,了解和有 C、C++ MPI 编程经验的人很容易地上手和使用 mpi4py 编写基于 MPI 的高性能并行计算程序。

mpi4py 简介

mpi4py 是一个构建在 MPI 之上的 Python 库,它实现了很多 MPI 标准中的接口,包括点对点通信,集合通信、阻塞/非阻塞通信、组间通信等,基本上能用到的 MPI 接口都有相应的实现。

mpi4py安装

1、访问mpi4py下载链接mpi4py · PyPI,下载对应的安装包;

图片

2、解压缩mpi4py安装包;

3、切换到当前系统中需要使用的mpicc版本;

图片

4、在解压后的目录中执行python3  ./setup.py  build;

执行后若报了“Python.h”文件不存在,则需要安装对应python版本的python-devel;图片

5、安装python-devel

图片

通过yum安装对应版本的python-devel;

yum install python36-devel.x86_64 -y;安装完成后再次执行python3 ./setup.py build 则无报错信息。

6、执行python3 ./setup.py install进行mpi4py的安装;

7、安装完成后,尝试通过mpi4py导入MPI无报错信息,恭喜mpi4py安装成功!

图片

8、尝试在集群系统中使用mpirun/slurm等提交运行程序,程序可以正常运行。

图片

THE END