技术背景

在之前的博客中我们介绍过concurrent等python多进程任务的方案,而之所以我们又在考虑MPI等方案来实现python并行计算的原因,其实是将python的计算任务与并行计算的任务调度分层实现。在concurrent和multiprocessing等方案中,我们的python计算任务和调度任务是一体化的,而且还有一个比较大的限制是没办法跨节点操作的,这对于任务与环境的定制化程度要求是比较高的。而MPI的方案在设计初期就考虑到了多节点之间通信的问题,而这种分层式的任务调度解决方案其实在架构上看也更加的合理。做计算的人只要考虑单个进程下的任务如何执行就可以了,至于任务如何并行如何调度,那就是上层的MPI该做的事情了。

mpi4py的安装

这里推荐使用conda直接安装,如果采用pip安装的话,可能会有些环境依赖的问题出现:

$ conda install mpi4py
Collecting package metadata (current_repodata.json): done
Solving environment: done ## Package Plan ## environment location: /home/dechin/anaconda3 added / updated specs:
- mpi4py The following packages will be downloaded: package | build
---------------------------|-----------------
mpi-1.0 | mpich 13 KB defaults
mpi4py-3.0.3 | py38h028fd6f_0 572 KB defaults
mpich-3.3.2 | hc856adb_0 3.8 MB defaults
------------------------------------------------------------
Total: 4.4 MB The following NEW packages will be INSTALLED: mpi pkgs/main/linux-64::mpi-1.0-mpich
mpi4py pkgs/main/linux-64::mpi4py-3.0.3-py38h028fd6f_0
mpich pkgs/main/linux-64::mpich-3.3.2-hc856adb_0 The following packages will be UPDATED: ca-certificates 2021.9.30-h06a4308_1 --> 2021.10.26-h06a4308_2 Proceed ([y]/n)? y Downloading and Extracting Packages
mpi4py-3.0.3 | 572 KB | ############################################## | 100%
mpich-3.3.2 | 3.8 MB | ############################################## | 100%
mpi-1.0 | 13 KB | ############################################## | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

安装完成后可以通过python3 -c "from mpi4py import MPI"来检查是否安装成功,下面我们来看一些具体的使用案例。

使用案例

首先了解下mpi的基本使用方法,如果我们使用mpirun -n 3 python3 test.py这样的指令去运行一个程序,那么就会给每一个不同的test.py中发送一个互不相同的rank,这个rank的范围是从0开始数的。比如如下案例我们使用Get_rank()方法就可以获取到mpi所传递下来的rank id,这样进程就知道了自己所处的进程编号,我们写好每个编号下所需要执行的任务即可:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
print('My rank is ',rank)

执行效果如下:

$ mpirun -n 4 python3 mpi_test.py
My rank is 2
My rank is 1
My rank is 0
My rank is 3

当然,因为每个任务都是平级的关系,因此mpi的rank id也是随机发放的,这个没办法控制,但是我们可以用如下的方法在进程间通信:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank() if rank == 0:
idata = 1
comm.send(idata, dest=1)
print ('This is process {}'.format(rank), '\nData send to process 1 successfully!')
elif rank == 1:
idata = comm.recv(source=0)
print ('This is process {}, data is '.format(rank),idata)

在这个案例中,我们从rank id为0的进程向rank id为1的进程发送了一个整数变量的数据。因为我们并不知道这个脚本什么时候会被分配到rank 0什么时候会被分配到rank 1,因此在同一个脚本内我们就需要分别对这两种可能发生的情况进行针对性的处理。运行结果如下:

$ mpirun -n 2 python3 mpi_test.py
This is process 0
Data send to process 1 successfully!
This is process 1, data is 1

整数型的变量被成功的传递,当然,这里面其实还有个更加重要的意义是,rank为1的进程实际上是对rank为0的进程有时间序列上的依赖的,我们必须执行完rank 0中的任务,才能再执行rank 1中的任务,这个是有可能在实际的应用过程中被频繁使用的功能,尤其是任务之间互相有依赖的情况下。当然,进程之间的通信不仅仅可以传递整数型的变量,还可以传递其他类型,比如字典或者一个numpy的数组:

from mpi4py import MPI
import numpy as np comm = MPI.COMM_WORLD
rank = comm.Get_rank() if rank == 0:
numData = 10
comm.send(numData, dest=1)
data = np.linspace(0.0, 3.14, numData)
comm.Send(data, dest=1)
print ('This is process {}'.format(rank), '\nData send to process 1 successfully!') elif rank == 1:
numData = comm.recv(source=0)
print('Number of data to receive: ', numData) data = np.empty(numData, dtype='d')
comm.Recv(data, source=0)
print ('This is process {}, data is '.format(rank),data)

运行结果如下:

$ mpirun -n 2 python3 mpi_test.py
This is process 0
Data send to process 1 successfully!
Number of data to receive: 10
This is process 1, data is [0. 0.34888889 0.69777778 1.04666667 1.39555556 1.74444444
2.09333333 2.44222222 2.79111111 3.14 ]

可以看到结果是被成功的接收了的。

总结概要

在这篇文章中,我们并没有介绍非常多的MPI的应用,其实在普通的并行或者分布式任务中,掌握了各个进程的任务处理过程以及进程间的通信方法就足够了。总体来说,MPI是一个非常通用也非常高效的并行计算软件。有了这些专业的并行化任务调度软件,我们就可以专注于专业任务的代码和算法上,而不需要过多的去关注并行任务的调度和分配问题。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/mpi4py.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

python并行计算之mpi4py的安装与基本使用的更多相关文章

  1. Python 高性能并行计算之 mpi4py

    MPI  和    MPI4PY   的搭建上一篇文章已经介绍,这里面介绍一些基本用法. mpi4py  的  helloworld from mpi4py import MPI print(&quo ...

  2. python笔记:windows 下安装 python lxml

    原文:http://blog.csdn.net/zhaokuo719/article/details/8209496 windows 环境下安装 lxml python 1.首先保证你的python ...

  3. 如何在windows下的Python开发工具IDLE里安装其他模块?

    以安装Httplib2模块为例 1 下载模块 到 “https://code.google.com/p/httplib2/” 下载一款适合你的压缩包“httplib2-0.4.0.zip” 2 解压下 ...

  4. Python中MySQLdb模块的安装

    安装 MySQLdb是Python语言访问mysql数据库的一个模块,如果你不确定自己的Python环境中是否已经安装了这个模块,可以打开Python shell,输入import MySQLdb,如 ...

  5. python的egg包的安装和制作]

    Defining Python Source Code Encodings Python egg 的安装 egg文件制作与安装 2011-06-10 14:22:50|  分类: python |   ...

  6. python 使用 setup.py 方式安装及包的卸载

     安装:         可通过 --home 或 --prefix 指定安装目录 --prefix=xx/xxx    选择安装目录 --record files.txt   记录所有安装文件的路径 ...

  7. linux下Python网络编程框架-Twisted安装

    Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...

  8. python学习--Linux下dlib安装(主要是cmake和boost的安装)

    昨天我们使用了dlib和opencv进行了人脸检测标注(http://www.cnblogs.com/take-fetter/p/8310298.html) 但是运行环境是基于windows的而且可能 ...

  9. python环境jieba分词的安装

    我的python环境是Anaconda3安装的,由于项目需要用到分词,使用jieba分词库,在此总结一下安装方法. 安装说明======= 代码对 Python 2/3 均兼容 * 全自动安装:`ea ...

随机推荐

  1. Java(6)流程控制语句中分支结构if与switch

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201528.html 博客主页:https://www.cnblogs.com/testero ...

  2. Java(7)流程控制语句中的for、while、do while循环

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...

  3. c语言中“ld返回值1退回状态”

    在c语言运行中我们经常会看到error:ld return 1 exit status的运行错误,其翻译为"ld返回值1退回状态".在生成程序时.有多个工具参与到步骤的运行中以创建 ...

  4. 【UE4】GAMES101 图形学作业0:矩阵初识

    作业描述 给定一个点P=(2,1), 将该点绕原点先逆时针旋转45◦,再平移(1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算). UE4 知识点 主要矩阵 FMatrix FBasisVec ...

  5. [对对子队]会议记录5.16(Scrum Meeting3)

    今天已完成的工作 何瑞 ​ 工作内容:搭建关卡5.6,优化之前的成本系统 ​ 相关issue:搭建关卡4.5.6 ​ 相关签入:feat: 第五第六关搭建完成 吴昭邦 ​ 工作内容:搭建关卡5.6 ​ ...

  6. Noip模拟57 2021.9.20

    规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...

  7. Noip模拟35 2021.8.10

    考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...

  8. 用python检查矩阵的计算

    鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...

  9. cf22A Second Order Statistics(STL-UNIQUE的使用)

    题意: N个数,找出第二大的数.如果没有输出-1. 思路: UNIQUE的使用. 代码: int a[105]; int n; int main(){ cin>>n; rep(i,0,n- ...

  10. hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)

    题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100 ...