【问题标题】:Mpi4py mpi_test always returns falseMpi4py mpi_test 总是返回 false
【发布时间】:2016-08-03 16:27:45
【问题描述】:

我在这里找不到类似的问题,所以这里是: 为什么下面的代码总是输出(False, None)?不应该是(True, None),如果在进程0发送消息后3秒调用test()?另外,如果我在test() 之前调用req.wait(),我会得到我需要的输出,但是它不是不可阻塞的,所以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();

【问题讨论】:

  • 您确定这是您正在运行的程序吗?有一些不属于的;。如果将sleep/test 放入循环中会发生什么?
  • 很奇怪。如果我连续两次调用test 命令,则第二个(以及以后的)输出很好。不过,这不是正常行为,所以如果有人可以给我任何进一步的指示,将不胜感激..

标签: python mpi mpi4py


【解决方案1】:

我不是 mpi4py 方面的专家,但假设它的行为类似于它的 MPI C 对应物(这似乎是一个合理的假设),那么确实,这里没有什么令人惊讶的。

好吧,公平地说,MPI 标准并未规定您的代码输出。保证是在 a number 次调用MPI_Test() 函数后,它将返回true。这个数字可以是任何东西,因此它在第一次调用时返回true,或者在第二次调用时,或者仅在十亿次调用之后......因此,使用MPI_Test() 函数的常用/推荐方法是在这里使用它并且在那里,并以它的无限循环(基于其输出的退出条件)结束,或者使用MPI_Wait() 调用。

现在,原因如下:MPI 库通常不会在显式 MPI 调用之外执行任何操作。因此,为了看到非阻塞通信的进展,您必须执行 一些 MPI 调用。这些调用不需要与常规通信相关(通常任何 MPI 调用都会在内部触发消息队列的某种程度的进展),但您需要将手交给 MPI 库才能获得。这就是调用MPI_Test() 所做的事情。这也解释了为什么这与时间无关:您对 sleep() 函数的调用确实为通信提供了时间,但由于 MPI 库没有介入,因此实际上什么也没发生.

最后,对我上面的解释稍作调整:

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

【讨论】:

    【解决方案2】:

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

    我不明白你为什么有:

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

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

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

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

    【讨论】:

    • 这或多或少是一个测试,因为我是 MPI 的新手,我在帖子中显示的代码按照我描述的方式运行,并且它被隔离在它自己的脚本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    • 2018-11-05
    • 2019-05-06
    • 2017-04-29
    • 2013-04-30
    • 2015-01-20
    相关资源
    最近更新 更多