1. 下载并安装MPI
windows下:
- mpich下载地址:https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx?f=255&MSPPError=-2147217396
- 点进download之后包含两个文件:msmpisdk.msi和MSMpiSetup.exe
- 分别下载并安装
- 添加BIN目录到系统路经
- 命令行安装mpi4py:pip install mpi4py
2. MPI与mpi4py
MPI是Message Passing Interface的简称,也就是消息传递。消息传递指的是并行执行的各个进程具有自己独立的堆栈和代码段,作为互不相关的多个程序独立执行,进程之间的信息交互完全通过显示地调用通信函数来完成。
Mpi4py是构建在mpi之上的python库,使得python的数据结构可以在进程(或者多个cpu)之间进行传递。
2.1.简单的工作方式
很简单,就是你启动了一组MPI进程,每个进程都是执行同样的代码!然后每个进程都有一个ID,也就是rank
来标记我是谁。
from mpi4py import MPI
print("my rank is: %d" %MPI.COMM_WORLD.Get_rank())
注意:
在IDE中运行是一个进程,如果要实现多个进程的效果,可以将代码保存为py文件,然后在命令行中运行
如果使用的pycharm,直接在terminal里运行
-n 4 指定启动4个mpi进程来执行后面的程序。相当于对脚本拷贝了4份,每个进程运行一份,互不干扰。在运行的时候代码里面唯一的不同,就是各自的rank也就是ID不一样。
2.2.点对点的通信
点对点通信(Point-to-PointCommunication)的能力是信息传递系统最基本的要求。意思就是让两个进程直接可以传输数据,也就是一个发送数据,另一个接收数据。接口就两个,send和recv,来个例子:
from mpi4py import MPI
comm = MPI.COMM_WORLD # 表示进程所在的通信组
comm_rank = comm.Get_rank()
comm_size = comm.Get_size() # mpi的进程个数
# 点对点通信
data_send = comm_rank
comm.send(data_send, dest=(comm_rank + 1) % comm_size)
# 如果comm_rank-1<0,会自动加comm_size变为正数再求余
data_recv = comm.recv(source=(comm_rank - 1) % comm_size)