XFS的零知识证明网络

CSS浮动的使用与清除,自我成长之路

  返回  

MPI 点对点通信

2021/7/21 15:57:39 浏览:

定义

点对点通信是两个进程之间的通信,从源进程发送消息到目标进程。通信是发生在同一个通信器内,并且进程可以通过其在通信器内的标号标识。

MPI 系统的通信方式都是建立在点对点通信之上。

阻塞式点对点通信

阻塞式点对点通信主要涉及四个函数:
MPI_SEND
MPI_Recv
MPI_Get_count(查询接收到的消息长度)
MPI_Sendrecv(捆绑发送和接受)

消息

MPI 消息包括信封和数据两个部分。信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。信封和数据又分别包括三个部分,可以用一个三元组来表示:
信封:<源/目 标识 通信域>
数据:<起始地址 数据个数 数据类型>

image-20210721150425515 image-20210721150452841

消息标签

在消息信封中除了 源 / 目 外,为什么还有 tag 标识呢?这是因为,当发送者发送两个相同类型的数据给同一个接收者时,如果没有消息标识,接收者将无法区别这两个消息;如图 18 所示。

image-20210721150607800

消息匹配

  • 接收 buffer 必须至少可以容纳 count 个由 datatype 参数指明类型的数据。如果接收 buf 太小, 将导致溢出、出错
  • 在阻塞式消息传送中不允许 Source == Dest,否则会导致死锁
  • 消息传送被限制在同一个 communicator
  • 在 send 函数中必须指定唯一的接收者

一个接收操作对消息的选择是由消息的信封管理的。如果消息的信封与接收操作所指定的值 source,tag 和 comm 相匹配,那么这个接收操作能接收这个消息。接收者可以给 source 指定一个任意值MPI_ANY_SOURCE 标识任何进程发送的消息都可以接收,即本接收操作可以匹配任何进程发送的消息,但其它的要求还必须满足,比如tag的匹配。如果给tag一个任意值MPI_ANY_TAG 则任何tag都是可接收的。 在某种程度上类似于统配符的概念。

MPI_ANY_SOURCE 和 MPI_ANY_TAG 可以同时使用或分别单独使用,但是不能给 comm 指定任意值。如果一个消息被发送到接收进程,接收进程有匹配的通信域,有匹配的 source (或其source = MPI_ANY_SOURCE),有匹配的tag(或其tag = MPI_ANY_TAG),那么这个消息能被这个接收操作接收。

由于 MPI_ANY_SOURCE 和 MPI_ANY_TAG 的存在,导致了发送操作和接收操作间的不对称性,即一个接收操作可以接收任何发送者的消息,但是对于一个发送操作则必须指明 一个单独的接收者。

MPI 允许发送者=接收者 Source = destination,即一个进程可以给自己发送一个消息。但是这种操作要注意死锁的产生。

阻塞式消息发送模式

按照发送方式和接受方式的不同,可以分为四类:

image-20210721152306394

这四个函数拥有完全一样的入口参数,共用一个标准的消息接收函数。

标准消息发送函数 MPI_SEND
image-20210721152511014
  • 发送操作不管接收操作是否启动,都可以开始
  • 发送返回的条件:
    1)发送数据被MPI系统存入系统缓存,此时不要求接收操作收到发送数据
    2)不缓存,则数据被接收到接收缓冲区
缓存消息发送函数 MPI_BSEND
image-20210721152522555
  • 发送操作不管接收操作是否启动,都可以开始
  • 直接对缓冲区进行控制,用户直接对通信缓冲区进行申请、使用、释放
    1)发送消息前必须有足够的缓冲区可用,否则发送失败
    2)缓存发送返回后,不意味申请的缓存区可自由使用,须等待消息发送出去方可使用
  • 优势:发送操作在缓存了发送数据后,可以立刻返回
同步消息发送函数 MPI_SSEND
image-20210721152532542
  • 同步通信模式的开始不依赖于接收进程相应的接收操作是否已经启动
  • 发送返回条件,需在标准模式上确认接收方已经开始接收数据
  • 优势:这种模式发送和接收最为安全
就绪消息发送函数 MPI_RSEND
image-20210721152539512
  • 发送操作必须要求接收操作启动,才可以开始
    1)启动接受操作,意味着接收进程正等待接收发送的消息
    2)若发送操作启动而相应接收操作没有启动,发送操作将出错
  • 优势:减少消息发送时间开销,可能获得好的计算性能

非阻塞式点对点通信

非阻塞式通信涉及到的主要函数如下:

  • MPI_Isend/MPI_Irecv
  • MPI_Wait/MPI_Waitany/MPI_Waitall/MPI_Waitsome
  • MPI_Test/MPI_Testany/MPI_Testall/MPI_Testsome
  • MPI_Request_free
  • MPI_Cancel
  • MPI_Test_cancelled
  • MPI_Probe/MPI_Iprobe

阻塞式通信与非阻塞式通信对比

image-20210721153725101

非阻塞式点对点通信图示

image-20210721154248567

参考文献

  • PPT.5-1.MPI并行编程40-67页
  • 都志辉.MPI并行程序设计[M/CD]: 33-35

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号