MPI-3 中线程安全的 Mprobe

本文从本人简书博客同步过来

上一篇中我们介绍了 MPI 中多线程的使用,下面我们将介绍 MPI-3 中线程安全的 Mprobe。

Probe 和 Iprobe 操作的作用是在不实际接收消息的情况下检查消息中包含的信息,据此决定接收消息的具体方式——如为待接收消息申请空间等。

但是 Probe 和 Iprobe 操作不是线程安全的,如在多线程中使用 Probe 或 Iprobe 来确定一个消息的来源和大小,然后接收该消息的操作就不是线程安全的,有可能会导致程序无限阻塞或发生错误。因此在多线程环境下,必须通过同步/互斥机制使得同一时刻仅有一个线程执行与期望通信相匹配的操作,如某个线程的接收操作使用 Probe 或 Iprobe 检测得到的 <源进程,tag> 参数时,不得再有其它线程使用同样的 <源进程,tag> 二元组去匹配同一个发送操作来接收数据。

线程安全性在上一篇中已经作过介绍,具体来说,线程安全性是指多个线程可以同时执行消息传递的相关调用而不会相互影响。MPI-3 中引进了线程安全的 Mprobe 和 Improbe 操作,该操作与一个新引进的对象 MPI.Message 绑定,该对象标识被匹配到的特定消息,某个消息一旦被 Mprobe 或 Improbe 匹配到,就不会再被其它的 Mprobe 或 Improbe 匹配到,也不会被相应的 Mrecv 接收到,因此可以在多线程环境下安全地使用,避免 Probe 和 Iprobe 的以上限制,增加程序的安全性并简化编程。被 Mprobe 或 Improbe 匹配到的消息必须由 MPI.Message.Recv 或 MPI.Message.Irecv 来接收,而不能以通常的 MPI.Comm.Recv 或 MPI.Comm.Irecv 来接收。

方法接口

非线程安全的 probe

MPI.Comm.probe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

检测与指定参数相匹配的消息。source 为消息源,tag 为消息 tag,status 如果非 None,为一个 MPI.Status 对象。可使用 MPI.ANY_SOURCE 和 MPI.ANY_TAG 来匹配任意消息。该函数为阻塞操作,直到检测到所匹配的消息才会结束阻塞而返回,此时如果传递了 status 参数,则会为其设置所检测到的消息的状态信息。

注意:此是以小写字母开头的方法,一般应该用来检测被 pickle 系列化的消息。

MPI.Comm.iprobe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

MPI.Comm.probe 的非阻塞版本,参数同。该函数被调用后会立即返回,并且可以对相同的消息检测多次,如果检测到所匹配的消息,会返回 True,否则返回 False。

注意:此是以小写字母开头的方法,一般应该用来检测被 pickle 系列化的消息。

MPI.Comm.Probe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

MPI.Comm.probe 的以大写字母开头的版本,为阻塞操作,一般应该用来检测以缓冲区形式发送的消息。

MPI.Comm.Iprobe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

MPI.Comm.iprobe 的以大写字母开头的版本,为非阻塞操作,一般应该用来检测以缓冲区形式发送的消息。

线程安全的 mprobe

线程安全的 mprobe/improbe/Mprobe/Improbe 都有两种等价的形式,一种为 MPI.Comm 类的方法, 另一种为 MPI.Message 类的类方法。这两种形式的区别是,前者直接在一个通信子对象上调用,后者需将通信子作为一个参数传人。两者都返回一个 MPI.Message 对象。注意:被 mprobe/improbe/Mprobe/Improbe 检测到的消息应该用 MPI.Message 类的接收方法 recv/irecv/Recv/Irecv 来接收,阻塞的检测方法可以用阻塞的接收方法也可以用非阻塞的接收方法,同样非阻塞的检测方法可以用阻塞的接收方法也可以用非阻塞的接收方法,但以小(大)写字母开头的检测方法一般应该与以小(大)写字母开头的接收方法配对使用。

下面是这些方法的使用接口:

MPI.Comm.mprobe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)
MPI.Message.probe(type cls, Comm comm, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

MPI.Message.recv(self, Status status=None)

阻塞的 mprobe 和阻塞的 recv,用于 pickle 系列化的消息。

MPI.Comm.improbe(self, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)
MPI.Message.iprobe(type cls, Comm comm, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)

MPI.Message.irecv(self)

非阻塞的 improbe 和非阻塞的 irecv,用于 pickle 系列化的消息。

MPI.Comm.Mprobe(self, int source=AN
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值