并行计算——MPI(一)

并行计算相关go on~

MPI基础

  • MPI是一个库,而不是一门语言。
  • MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。
  • MPI是一种消息传递的编程模型,并成为这种编程模型的代表和事实上的标准

MPI的六个基本接口

MPI初始化

MPI_INIT():
一个MPI程序的第一个调用必须是初始化接口的调用。它完成MPI程序的所以初始化工作.
c语言中的定义:

int MPI_Init(int *argc, char ***argv)
MPI结束

MPI_FINALIZE():一个MPI程序的最后一个调用,它结束MPI程序的运行,必须是最后一条可执行语句,否则程序的运行结果是不可预知的。
c语言中的定义:

    int MPI_Finalize(void)
当前标识进程

MPI_COMM_RANK(comm,rank):
comm: 输入, 该进程所在的通信域
rank: 输出, 调用进程在comm中的标识号
这一调用返回调用进程在给定通信域中的进程标识号,获得这个标识号,不同的进程就可以将自身和其他的进程区别开来,实现各进程的并行和协作。
c语言中的定义:

    int MPI_Comm_rank(MPI_Comm comm, int *rank)
通信域包含的进程数

MPI_COMM_SIZE(comm,size):
comm: 输入,通信域
size:输出,通信域comm中包括的进程数(整数)
这一调用返回给定的通信域中所包括的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在执行并行。
c语言中的定义:

    int MPI_Comm_size(MPI_Comm comm,int *size)
消息发送

MPI_SEND(buf,count,datatype,dest,comm):
buf: 输入,发送缓冲区的起始地址
count: 输入,将发送的数据的个数(非负整数)
datatype: 输入,发送数据的数据类型
dest: 输入,目的进程的标识号
tag: 输入,该发送消息的消息标识(整型)
comm: 输入,通信域

该接口将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag。使用标志可以把本次发送和本进程向同一目的进程发送的其他消息区别开来。
c语言中的定义:

int MPI_Send(void* buf,int count, MPI_Datatype datatype, int dest,int tag,MPI_Comm comm)
消息接收

MPI_RECV(buf, count, datatype, source,tag,comm,status):
buf: 输出, 接收数据的缓冲区的起始地址
count: 输入,最多可接收的数据的个数
datatype: 输入,接收数据的数据类型
source: 输入,接收数据的来源,即发送数据的进程的进程标识号
tag: 输入,消息标识,与相应的发送操作的tag相匹配的标识
comm: 输入,本进程和发送进程所在的通信域
status: 输出,返回状态。返回状态变量,status是MPI定义的一个数据类型。在c实现中,状态变量是由至少三个域组成的结构类型,通过调用status.MPI_SOURCE,status.MPI_TAG,status.MPI_ERROR,就可以得到返回状态中所包含的发送数据进程的标识,发送数据的tag标识,本接收操作返回的错误代码。

c语言中的定义:

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_Status *status)

MPI_RECV从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的 datatype和tag相一致。
接收到的消息所包含的数据元素的个数最多不能超过count。接收到消息的长度必须小于或等于接收缓冲区的长度,这是因为如果接收到的数据过大 MPI没有截断,接收缓冲区会发生溢出错误。count可以是零,这种情况下消息的数据部是空的。
其中datatype数据类型可以是MPI的预定义类型,也可以是用户自定义的类型,通过指定不同的数据类型调用MPI_RECV,可以接收不同类型的数据。

MPI预定义数据类型

数据类型

MPI消息

MPI消息的组成:
数据:<起始地址,数据个数, 数据类型>
信封:<源/目的地,标识, 通信域>

任意源: MPI_ANY_SOURCE,接收者可以用这个值表示任何进程发送的消息都可以接收,但其他要求还必须满足tag的匹配。
任意标识:MPI_ANY_TAG,该值表示接收者可以接收任意tag的标识值。
MPI允许一个进程可以给自己发送一个消息,但是这种操作要注意死锁的产生。

MPI通信域

MPI通信域包括两部分: 进程组和通信上下文。进程的编号为0-N-1;通信上下文提供一个相对独立的通信域。
一个预定义的通信域MPI_COMM_WORLD由MPI提供。MPI初始化后就会产生这一描述,包括可以获得的全部进程。
MPI允许在原有的通信域的基础上,定义新的通信域。通信域为库和通信模式提供一种重要的封装机制。允许各模式由自己的独立通信域和自己的进程计数方案。

MPI通信模式


MPI共有四种通信模式,这几种通信模式对应于不同的通信需求。可以根据几种情况来区分:1 是否需要对发送的数据进行缓存?2 是否只有当接收调用执行后才可以执行发送操作?3 什么时候发送调用可以正确返回?等

通信模式

标准通信模式


在MPI采用标准通信模式时,是否对发送的数据进行缓存由MPI自身决定。 如果MPI缓存将要发送的数据,发送操作可以正确返回而对接收操作没有任何要求。 由于缓存数据会延长通信时间,且缓冲区并不一定可以得到,这时MPI可以决定不缓存数据,这样只有当相应的接收调用被执行后,并且发送数据完全到达接收区后,发送才算完成。

缓存通信模式

缓存通信发送数据函数:

int MPI_Bsend(void* buf,int count, MPI_Datatype datatype, int dest,int tag,MPI_Comm comm)

该函数与MPI_Send的不同之处仅表现在通信时是使用标准的系统提供的缓冲区还是用户自己提供的缓冲区。缓存通信模式不管接收操作是否启动,发送操作都可以执行。用户必须保证发送消息之前有缓冲区可用。
采用缓存通信模式,消息发送能否进行及能否正确返回完全依赖于是否有足够的通信域可以用。缓冲区只有当其中的消息发送出去后才可以重用或者释放。

MPI_BUFFER_ATTACH(buffer,size)
buffer: 输入,初始缓存地址
size: 输入,按字节计数的缓存跨度

int MPI_Buffer_attach(void *buffer, int size)

该函数将大小为size的缓冲区递交给MPI。

MPI_BUFFER_DETACH(buffer,size):
buffer: 输出,缓冲区的初始地址
size: 输出,以字节为单位的缓冲区大小

int MPI_Buffer_detach(void **buffer, int size)

该函数将提交大小为size的缓冲区buffer收回。阻塞调用,函数将等到使用该缓存的消息发送完毕后才返回。这一调用返回后用户可以重新使用该缓冲区或者将这一缓冲区释放。

同步通信模式

MPI_SSEND(buf,count,datatype,dest,tag,comm)

同步通信模式的开始不依赖于接收进程相应的接收操作是否启动,但是同步发送却必须等到相应的接收进程开始后才可以正确返回。

用于测试消息中数据个数的函数:

int MPI_Get_count(MPI_Status *status,MPI_datatype datatype, int *count)

就绪通信模式

MPI_RSEND(buf,count,datatype,dest,tag,comm)
在就绪通信模式中,只有当接收操作已经启动时,才可以在发送进程启动发送操作,否则发送操作将出错。对于非阻塞发送操作的正确返回,并不意味着发送已经完成,但对于阻塞发送的正确返回,则发送缓冲区可以重复使用。

阻塞通信

当一个阻塞通信正确返回后,

  • 该调用要求的通信操作已正确完成 即消息已成功发出或成功接收
  • 该调用的缓冲区可用 若是发送操作,则该缓冲区可以被其它的操作更新。若是接收操作,该缓冲区中的数据已经完整,可以被正确引用。

在阻塞通信中,对于接收进程 在接收消息时,除了要求接收到的消息的消息信封和接收操作自身的消息信封相一致外,还要求它接收到的消息是最早发送给自己的消息。


   转载规则


《并行计算——MPI(一)》 tannl 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
并行计算--MPI(二) 并行计算--MPI(二)
高级MPI并行程序设计这一部分为了提高MPI程序的性能、通用性、移植性等而引入的MPI高级特性,包括非阻塞通信、组通信、不连续的数据的传送以及虚拟进程拓扑等。 非阻塞通信的MPI程序设计非阻塞通信主要用于实现计算与通信的重叠。所有阻塞通信的
2020-04-01
下一篇 
Web前端—HTML学习笔记 Web前端—HTML学习笔记
HTML简介 Web上的通用标记语言 书写Web文档的一套语法规范 用HTML语言写成的文件称为网页或页面 是一种解释型语言 由Web浏览器解释执行 HTML5文档结构<!DOCTYPE html> <!--文档类型
2020-03-05
  目录