技术背景

在之前的博客中我们介绍过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. 【c++ Prime 学习笔记】第11章 关联容器

    关联容器的元素按照关键字来保存和访问,而顺序容器的元素是按照在容器中的位置来保存和访问 关联容器支持高效的关键字查找和访问 2种关联容器: map中的元素是关键字-值对(key-value对),关键字 ...

  2. [Beta]the Agiles Scrum Meeting 9

    会议时间:2020.5.24 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 撰写技术博客 tq 实现评测机获取评测状态功能 评测部分增加更多评测指标 wjx ...

  3. java中的软,弱,虚引用介绍与特性分析

    java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会 ...

  4. luogu P4243 [JSOI2009]等差数列 题解

    前言: 这题真ex... 强烈谴责在题解里面放毒瘤题链接的屑出题人! 吐 ️ 解析: 这题分成两步走. 首先,既然题目中的修改操作是区间加等差数列,那么就容易想到在差分数组上进行操作. 然后就是相当恶 ...

  5. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  6. IC封装的热特性

    ΘJA是结到周围环境的热阻,单位是°C/W.周围环境通常被看作热"地"点.ΘJA取决于IC封装.电路板.空气流通.辐射和系统特性,通常辐射的影响可以忽略.ΘJA专指自然条件下(没有 ...

  7. STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联网产品外,工作8个,3种定时器,其中一种就是基本定时器.那么STM32单片机的基本定时器如何操作以及编程呢? 下面我们就来详细的了解一下 STM32F1系列的产品,除 ...

  8. 单片机stm32零基础入门之--初识STM32 标准库

    CMSIS 标准及库层次关系 因为基于Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难.为了解决不同的芯片厂商生产的Co ...

  9. Java之父 James Gosling 发表博文 《Too Soon》纪念乔布斯。

    几个礼拜前,我们还在讨论乔布斯的辞职.虽然我们都知道这意味着什么,但是我没有想到一切来的如此之快.已经有很多关于这件事情的文章了,特别是"经济学人"的这篇文章. 乔布斯是一个很独特 ...

  10. 面试官:能用JS写一个发布订阅模式吗?

    目录 1 场景引入 2 代码优化 2.1 解决增加粉丝问题 2.2 解决添加作品问题 3 观察者模式 4 经纪人登场 5 发布订阅模式 6 观察者模式和发布订阅模式的对比 什么是发布订阅模式?能手写实 ...