【问题标题】:When will MPI_Iprobe return true?MPI_Iprobe 何时返回 true?
【发布时间】:2014-02-17 03:39:09
【问题描述】:

我有一个应用程序,其中每个处理器需要将数据发送到特定数量的处理器,并从未知数量的处理器接收数据,数据大小未知,同时执行本地操作。这就是我的想法:

MPI_Isend(...)
// Do local computation
MPI_Wait(...)

int flag;
MPI_Status st;
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
While(flag) {
    MPI_Irecv(st.MPI_SOURCE,...);
    MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
}

我能保证MPI_Iprobe 在这种情况下能够找到每一条发送的消息吗?我怀疑如果当前排名的工作较少,它将在其他处理器有足够的时间实际发送消息之前达到MPI_Iprobe,在这种情况下我会错过一些消息。在那种情况下,在MPI_Wait 之后使用MPI_Barrier 会解决问题吗?

我还有哪些其他选择可以解决这个问题?

【问题讨论】:

    标签: c mpi distributed-computing hpc


    【解决方案1】:

    除非我误解了你的问题,否则你可以使用普通的MPI_PROBE。这将阻止等待消息实际到达。

    但是,我完全不确定您为什么需要使用探针。从您的示例代码看来,您可以使用普通的MPI_RECVMPI_ANY_SOURCEMPI_RECV 不需要命名源。

    【讨论】:

    • 问题是单个消息的数量、它们的来源以及所有消息的大小都是未知的。这意味着我不能使用MPI_Probe(我认为),因为我无法知道我应该调用它多少次。如果我将其称为不必要的,那么该过程将永远卡住!至于接收,我使用MPI_Irec 来允许计算/通信重叠。让我感到困惑的是,我不完全知道是什么让MPI_Iprobe 确定消息已“到达”
    猜你喜欢
    • 2014-01-26
    • 2021-07-02
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多