Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python mpi4py(并行编程 23)

python mpi4py(并行编程 23)

作者头像
用户5760343
发布于 2019-07-30 02:36:04
发布于 2019-07-30 02:36:04
1.7K00
代码可运行
举报
文章被收录于专栏:sktjsktj
运行总次数:0
代码可运行

https://www.cnblogs.com/zhbzz2007/p/5827059.html

1.概述

MPI(Message Passing Interface),消息传递接口,是一个标准化和轻便的能够运行在各种各样并行计算机上的消息传递系统。消息传递指的是并行执行的各个进程拥有自己独立的堆栈和代码段,作为互不相关的多个程序独立执行,进程之间的信息交互完全通过显示地调用通信函数来完成。

mpi4py是构建在MPI之上的Python非官方库,使得Python的数据可以在进程之间进行传递。

2.MPI执行模型

并行程序是指一组独立、同一的处理过程;

  • 所有的进程包含相同的代码;
  • 进程可以在不同的节点或者不同的计算机;
  • 当使用Python,使用n个Python解释器; mpirun -np 32 python parallel_script.py

并行执行模型如下所示,

2.1 MPI基本概念

rank:给予每个进程的id;

  • 可通过rank进行查询;
  • 根据rank,进程可以执行不同的任务;

Communicator:包含进程的群组;

  • mpi4py中基本的对象,通过它来调用方法;
  • MPI_COMM_WORLD,包含所有的进程(mpi4py中是MPI.COMM_WORLD);

2.2 数据模型

所有的变量和数据结构都是进程的局部值;

进程之间通过发送和接收消息来交换数据;

image

2.3 使用mpi4py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from mpi4py import MPI
comm = MPI.COMM_WORLD   #Communicator对象包含所有进程
size = comm.Get_size()
rank = comm.Get_rank()
print "rank = %d,size = %d"%(rank,size)

2.4 安装mpi4py

MPI Python环境搭建

MPI Windows集群环境搭建

3.工作方式

工作方式主要有点对点和群体通信两种;点对点通信就是一对一,群体通信是一对多;

3.1 点对点

example 1

点对点发送Python内置dict对象;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Broadcasting a Python dict
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
    data = {"a":7,"b":3.14}
    comm.send(data,dest = 1,tag = 11)
    print "send data = ",data
elif rank == 1:
    data = comm.recv(source = 0,tag = 11)
    print "recv data = ",data

任意的Python内置对象可以通过send和recv进行通信,目标rank和源rank和tag都要互相匹配;

send(data,dest,tag)

  • data,待发送的Python内置对象;
  • dest,目标rank;
  • tag,发送消息的id;

recv(source,tag)

  • source,源rank;
  • tag,发送消息的id;

example 2

点对点发送Python内置dict对象,非阻塞通信;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#point to point communication Python objects with non-blocking communication
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank ==0:
    data = {"a":7,"b":3.14}
    req = comm.isend(data,dest = 1,tag = 11)
    req.wait()
    print "send data = ",data
elif rank == 1:
    req = comm.irecv(source = 0,tag = 11)
    data = req.wait()
    print "recv data = ",data

example 3

发送Numpy数组;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#point to point communication Python objects Numpy arrays
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

# automatic MPI datatypes discovery
if rank == 0:
    data = np.arange(100,dtype = np.int)
    comm.Send(data, dest = 1,tag = 13)
    print "send data = ",data
elif rank == 1:
    data = np.empty(100,dtype = np.int)
    comm.Recv(data, source = 0,tag = 13)
    print "recv data = ",data

当发送消息时,任意的Python对象转换为字节流; 当接收消息时,字节流被转换为Python对象;

Send(data,dest,tag),Recv(data,source,tag),连续型数组,速度快;

send(data,dest,tag),recv(source,tag),Python内置对象,速度慢;

3.2 群体通信

群体通信分为发送和接收,发送是一次性把数据发给所有人,接收是一次性从所有人那里回收结果;

example 1

root进程新建data dict,然后将data数据广播给所有的进程,这样所有的进程都拥有这个data dict;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Broadcasting a Python dict
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
    data = {"key1":[7,2.72,2+3j],"key2":("abc","xyz")}
else:
    data = None

data = comm.bcast(data,root = 0)
print "rank = ",rank," data = ",data

example 2

root进程新建了一个list,然后将它散播给所有的进程,相当于对这个list做了划分,每个进程获得等分的数据,这里就是list中的每一个数字(主要根据list的索引来划分,list索引为第i份的数据就发送给第i个进程),如果是矩阵,那么久等分的划分行,每个进程获得相同的行数进行处理;

MPI的工作方式是每个进程都会执行所有的代码,每个进程都会执行scatter这个指令,但是只有root进程执行它的时候,它才兼备发送者和接收者的身份(root进程也会得到数据它自己的那份数据),对于其他进程来说,他们都只是接收者而已;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Scattering Python objects
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

if rank == 0:
    data = [(i+1)**2 for i in range(size)]
else:
    data = None

data = comm.scatter(data,root = 0)
assert data == (rank+1)**2
print "rank = ",rank," data = ",data

example 3

gather是将所有进程的数据收集回来,然后合并成一个列表;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Gathering Python objects
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

data = (rank+1)**2
data = comm.gather(data,root = 0)
if rank == 0:
    for i in range(size):
        assert(data[i] == (i+1)**2)
    print "data = ",data
else:
    assert data is None

example 4

广播Numpy数组;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Broadcasting Numpy array
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
    data = np.arange(100, dtype = 'i')
else:
    data = np.empty(100,dtype = 'i')
comm.Bcast(data,root = 0)
for i in range(100):
    assert(data[i] == i)
print "rank = ",rank," data = ",data

example 5

散播Numpy数组;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Scattering Numpy arrays
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

senbuf = None
if rank == 0:
    senbuf = np.empty([size,100],dtype = 'i')
    senbuf.T[:,:] = range(size)
recvbuf = np.empty(100,dtype = 'i')
comm.Scatter(senbuf,recvbuf,root = 0)
assert np.allclose(recvbuf,rank)
print "rank = ",rank," recvbuf = ",recvbuf

example 6

收集Numpy数组;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Gathering Numpy array
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

sendbuf = np.zeros(100, dtype='i') + rank
recvbuf = None
if rank == 0:
    recvbuf = np.empty([size, 100], dtype='i')
comm.Gather(sendbuf, recvbuf, root=0)
if rank == 0:
    for i in range(size):
        assert np.allclose(recvbuf[i,:], i)

4.Reference

mpi4py tutorial

Python多核编程mpi4py实践

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux下MPI的安装与vscode的配置
近期由于一些原因接触到了并行计算,对于这个陌生的领域我最先接触到的是MPI框架。MPI(Message Passing Interface),可以理解为是一种独立于语言的信息传递标准。目前它有两种具体的实现OpenMPI和MPICH,也就是说如果我们要使用MPI标准进行并行计算,就需要安装OpenMPI或MPICH库。本文以MPICH为例,在ubantu中安装MPI的环境,并对vscode进行配置。
Here_SDUT
2022/09/19
11.8K1
Linux下MPI的安装与vscode的配置
Python多进程并行编程实践-mpi4py的使用
專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。 blog:http://ipytlab.com github:https://github.com/PytLab ❈— 前言 在高性能计算的项目中我们通常都会使用效率更高的编译型的语言例如C、C++、Fort
Python中文社区
2018/01/31
3.7K0
python 并行进程 mpi4py
from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() print("hello world from process ", rank)
用户5760343
2022/05/13
6020
初探并行编程技术之消息传递接口(Message Passing Interface, MPI)
之前的文章中介绍了天河二号的架构,我们大致了解到了天河二号是一个由很多计算节点组成的具有强大运算能力的超级计算机。
用户1621951
2019/06/06
3.9K0
初探并行编程技术之消息传递接口(Message Passing Interface, MPI)
并行for循环,简单的改动让python飞起来
Python在处理大的数据集的时候总是速度感人。代码一旦开始运行,剩下的时间只好满心愧疚地刷手机。
自学气象人
2023/09/05
1K0
并行for循环,简单的改动让python飞起来
用MPI进行分布式内存编程(入门篇)
0x00 前言 本篇是MPI的入门教程,主要是为了简单地了解MPI的设计和基本用法,方便和现在的Hadoop、Spark做对比,并尝试理解它们之间在设计上有什么区别。 身处Hadoop、Spark这些优秀的分布式开发框架蓬勃发展的今天,老的分布式编程模型是否没有必要学习?这个很难回答,但是我更倾向于花一个下午的时候来学习和了解它。 关于并发和并行编程系列的文章请参考文章集合 文章结构 举个最简单的例子,通过这个例子让大家对MPI有一个基本的理解。 解释一些和MPI相关的概念。 列举一些MPI的常用函数
木东居士
2018/05/25
4.3K0
[源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块
在前文中,我们介绍了PipeDream的总体架构,Profile阶段,计算分区阶段,模型转换阶段和运行时引擎,本文我们介绍PipeDream 的通信模块,通信模块是引擎的基础,同时也是PyTorch DDP,P2P 如何使用的一个万花筒和完美示例。
罗西的思考
2021/09/14
6930
python并行计算之mpi4py的安装与基本使用
在之前的博客中我们介绍过concurrent等python多进程任务的方案,而之所以我们又在考虑MPI等方案来实现python并行计算的原因,其实是将python的计算任务与并行计算的任务调度分层实现。在concurrent和multiprocessing等方案中,我们的python计算任务和调度任务是一体化的,而且还有一个比较大的限制是没办法跨节点操作的,这对于任务与环境的定制化程度要求是比较高的。而MPI的方案在设计初期就考虑到了多节点之间通信的问题,而这种分层式的任务调度解决方案其实在架构上看也更加的合理。做计算的人只要考虑单个进程下的任务如何执行就可以了,至于任务如何并行如何调度,那就是上层的MPI该做的事情了。
DechinPhy
2021/12/02
3.2K0
并行排序ShearSort ---[MPI , c++]
思想: (1) 对于一个nxm的数组,使用N个work进行处理. (2) 先按行对数组进行升序和降序排序【由左至右】,一般奇数序列work升序,偶数序号的work进行降序 (3)再按列对数组进行
Gxjun
2018/12/27
9310
并发学习一、MPI初步认识
学习参考地址:https://www.jianshu.com/p/2fd31665e816
梅花
2020/09/28
1.2K0
MPI编程入门详解
说到并行计算,我们有一个不可绕开的话题——MPI编程。MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口。
狼啸风云
2020/02/13
7.6K0
[源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎
在前文中,我们介绍了PipeDream的总体架构,Profile阶段,计算分区阶段和模型转换阶段,本文我们介绍运行时执行引擎,这是一个统一基础设施层。
罗西的思考
2021/09/14
7960
[源码解析] 深度学习流水线并行 PipeDream(4)--- 运行时引擎
[源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行
NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并行来复现 GPT3,值得我们深入分析其背后机理。
罗西的思考
2022/05/09
2.6K0
[源码解析] 模型并行分布式训练 Megatron (4) --- 如何设置各种并行
MPI 之 点对点通信的一个实例
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159986.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/16
5870
MPI 之 点对点通信的一个实例
InfiniBand与MPI
IB(InfiniBand)和 RDMA(Remote Direct Memory Access)是一种高性能网络技术,通常用于加速数据传输。它们不是基于传统的 TCP/IP 协议栈,而是使用自己的协议栈,以实现低延迟、高带宽的数据传输。
用户8891103
2023/09/14
2.4K0
遗传算法:自然选择的计算艺术
在优化问题的迷雾森林中,遗传算法犹如达尔文主义的灯塔,将生物进化原理转化为强大的计算范式。当传统优化方法在复杂地形中步履维艰时,这种模拟自然选择的智能算法展现出惊人的适应能力——它不依赖目标函数的梯度信息,不畏惧多峰搜索空间的局部陷阱,而是通过种群进化的集体智慧探索解空间。遗传算法的核心思想在于将问题解编码为染色体,在选择压力下通过遗传操作实现解的迭代优化,最终逼近全局最优解。这种计算框架的优雅之处在于其通用性:从航天器轨道设计到神经网络架构搜索,从蛋白质折叠预测到金融投资组合优化,遗传算法以统一的生物学隐喻解决千差万别的工程问题。
熊猫钓鱼
2025/08/01
1080
遗传算法:自然选择的计算艺术
安装MPICH并运行第一行代码
如果报错说“Aborting because C++ compiler does not work.”,就安装下编译器:
小锋学长生活大爆炸
2022/08/19
2K0
安装MPICH并运行第一行代码
一文入门高性能计算HPC-详解1
高性能计算(HPC) 是使用多组尖端计算机系统执行标准商用计算系统无法实现的复杂模拟、计算和数据分析的艺术和科学。
晓兵
2025/03/29
4030
一文入门高性能计算HPC-详解1
初识并发编程 MPI
MPI是一个跨语言的通讯协议,用于并发编程。MPI标准定义了一组具有可移植性的编程接口。
饶文津
2020/06/02
1.8K0
OpenMPI(一) 点对点通信
如果发送的字节数等于接收的字节数,通信将成功。例如,可以发送一个包含两个int的数组,并接收一个long或者一个double。
Pulsar-V
2019/03/12
1.4K0
相关推荐
Linux下MPI的安装与vscode的配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档