我在这里找不到一个类似的问题,所以这里有:
为什么以下代码始终输出(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();
答案 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
环境变量,一旦设置为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之间插入更多代码,这可能就是您的意思。