MPI即Message Passing Interface、 消息传递Message Passing是进程间通信的一种方式。回顾一下操作系统的知识,进程间通信IPC主要有两种模型,一种是共享内存shared memory。另外一种便是消息传递Message Passing.
1.MPI
2.基于消息传递的并行编程
3.6个基本函数
4.MPI HelloWorld
5.点对点通信
6.集群通信
MPI
- MPI是一个消息传递接口标准,(而不是指对它的实现)。
- 有很多MPI的实现,MPICH,MVAPICH,OpenMP,Intel MPI等。
- MPI支持对C/C++,和Fortran语言的绑定
- MPI已语言独立的形式存在,可以运行在不同的操作系统和硬件平台上。
OpenMPI是MPI的一个开源实现,支持标准MPI2.2.
使用OpenMPI我们可以方便的编写基于消息传递的并行程序。
基于消息传递的并行编程
在基于消息传递的并行编程模型中,每个进程都有一个独立的地址空间,一个进程不能直接访问其他进程中的数据。使用消息传递来实现进程间的通信。
用户需要显式的通过发送和接受消息来实现处理器之间的数据交换。 这种编程方式适用于MPP,Cluster.
使用消息传递的开销比较大,因此它主要用来开发大粒度和粗粒度的并行性。
对于一个问题进行分解,可以有两种方式,一种是域分解,一种是函数分解。所谓域分解就是讲问题的区域分为若干较小的区域,然后进行并行求解。 另外一种方式,函数求解又叫做功能分解。即使将一个大问题分解为若干子问题,然后对其并行求解。
对应于这两种形式,就是所谓的SPMD,MPMD两种编程模式。
- 有SPMD,MPMD两种模式
- 程序员需要指定有哪些进程,不同进程间要发送哪些消息,发送发与接收方是谁?
- MPI适用于分布式系统
问题
什么是SPMD?MPMD?
为什么会有SPMD,MPMD适用于什么情况?
MPI适合什么类型的体系结构? SMP,MPP,DSM,Cluster?
OpenMPI OpenMP 区别?
6个基本函数
OpenMPI提供了数以百计的API接口,但是完成一个基本的基于MPI的并行程序,一般只需要利用的其中六个,用这六个基本函数就可以求解很多问题。
包括启动与结束MPI环境,识别进程以及发送接收消息。
1. MPI_Init()
2. MPI_Comm_size()
3. MPI_COmm_rank()
4. MPI_Send()
5. MPI_Recv()
6. MPI_Finalize()
问题
什么是通信域?
什么是进程?和操作系统中的进程有什么区别?
通信域与进程间关系?
为什么要有消息标签?
消息如何打包Pack,解包Unpack?
MPI_Status?
MPI HelloWorld
不会Fortran,只会C。在此只介绍如何用c来写mpi程序。
关于如何安装mpi,此处略去。
欲使用MPI编写并行程序,必须将头文件mpi.h包含进去。
#include<mpi.h>
#include<stdio.h>
int main(int argc, char * argv[])
{
int rank,size;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
printf("Hello world from process %d of%d\n",rank,size);
MPI_Finalize();
return 0;
}
点对点通信
通信机制
- 阻塞通信机制
- 非阻塞通信机制
通信模式
- 缓冲
- 同步
- 标准
- 就绪
不同通信模式和不同通信机制的结合,便 产生了非常丰富的点对点通信函数
发送方:
(阻塞, 非阻塞) × (缓冲,同步,标准,就绪)
共有8中发送方式
接收方有阻塞接收,非阻塞接收两种方式。
问题
什么是阻塞?什么是非阻塞?
缓冲,同步,标准,就绪的含义?
集群通信
群集通信(Collective Communications)是一个进 程组中的所有进程都参加的全局通信操作。
群集通信实现三个功能:通信、聚集和同步
- 通信功能主要完成组内数据的传输
- 聚集功能在通信的基础上对给定的数据完成一定的操 作
- 同步功能实现组内所有进程在执行进度上取得一致
群集通信,按照通信方向的不同,又可以分为三 种:一对多通信,多对一通信和多对多通信。
- 对多通信:一个进程向其它所有的进程发送消息, 这个负责发送消息的进程叫做Root进程。
- 多对一通信:一个进程负责从其它所有的进程接收消 息,这个接收的进程也叫做Root进程。
- 多对多通信:每一个进程都向其它所有的进程发送或 者接收消息。
具体操作?
含义?
例子?
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rat_racer@qq.com