Mpi4py mpi_test总是返回false

时间:2016-04-12 20:49:02

标签: python mpi mpi4py

我在这里找不到一个类似的问题,所以这里有: 为什么以下代码始终输出(False, None)?如果在进程0发送消息3秒后调用(True, None),那不应该是test()吗?另外,如果我在req.wait()之前调用test()我得到了我需要的输出,但是它不是不可阻塞的,所以test()失去了它的目的(我希望能够告诉它进程1在睡眠的3秒内从任何来源收到消息

代码:

import time
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()    

if rank == 0:
    req = comm.isend(0, 1, tag=0);
    req.wait();
elif rank == 1:
    req = comm.irecv();
    time.sleep(3);
    print req.test();

2 个答案:

答案 0 :(得分:1)

我不是mpi4py的专家,但假设它的行为与MPI C相似(这似乎是一个公平的假设),那么确实,这里没有什么惊喜。

嗯,公平地说,MPI标准没有规定代码的输出。保证的是,在对MPI_Test()函数进行多次调用后,它将返回true。这个数字可以是任何数字,因此它在第一次调用时返回true,或者在第二次调用时返回MPI_Test(),或者仅在十亿次调用后返回...因此,使用MPI_Wait()函数的常用/推荐方法是在这里和那里使用它,并完成它的无限循环(基于其输出的退出条件),或使用MPI_Test()调用。

现在,原因如下:MPI库通常不会在显式MPI调用之外执行任何操作。因此,为了查看要阻止的非阻塞通信,您必须执行一些 MPI调用。这些调用不需要与常设通信相关(通常任何MPI调用都会在内部触发消息队列的某种程度的进度),但是您需要将手放到MPI库中才能获得该通信。这就是对sleep()的调用。这也解释了为什么这不是真正与时间相关的:你对MPICH_ASYNC_PROGRESS函数的调用确实给了时间来进行通信,但是因为MPI库没有得到介入,所以没有实际上发生了。

最后,对我上面的解释有所缓和:

  1. 以上假设没有外部机制来推进正在进行的消息。但是,(远程)直接内存访问引擎(例如InfiniBand卡上提供的引擎)确实可以在不必进行额外MPI调用的情况下处理消息。但是,这通常只发生在节点间通信上,并且高度依赖于您的硬件和软件。
  2. 一些MPI库提供了一种扩展,即可以专用CPU线程来进行MPI调用之外的MPI通信。一些基于MPICH的MPI库(例如Intel MPI)提出1环境变量,一旦设置为UIView animateWithDuration:delay:options:animations:completion,将触发创建此MPI通信线程以进行非阻塞通信现场。不确定OpenMPI是否也提出此功能......

答案 1 :(得分:0)

也许只是因为你通过编辑一个更大的程序创建了这个例子,但我只想检查一下他们是不是对非阻塞MPI通信的一些潜在误解......

我不明白为什么你有:

req = comm.isend(0, 1, tag=0);
req.wait();

因为这在功能上与阻止调用相同

comm.send(0, 1, tag=0);

当然,非阻塞形式意味着您可以稍后在isend和wait之间插入更多代码,这可能就是您的意思。