【问题标题】:What should I do for recieving when the number of send messages is unknown in MPI?当 MPI 中发送消息的数量未知时,我应该怎么做才能接收?
【发布时间】:2014-01-29 21:00:10
【问题描述】:

我正在使用 MPI 编程。我想向另一个处理器发送一些东西并在那里接收它,但我不知道我将发送多少条消息。事实上,发送到另一个处理器的消息数量取决于我在程序中读取它的文件,所以我不知道我应该在另一端写多少接收。我应该使用哪种方法和功能?

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    您仍然可以使用发送和接收,但您还可以添加一种新的消息,告诉接收进程不会有新消息。通常这是通过使用不同的标签发送来处理的。所以你的程序看起来像这样:

    if (sender) {
        while (data_to_send == true) {
            MPI_Send(data, size, datatype, receiving_rank, 0, MPI_COMM_WORLD);
        }
        for (i = 0; i < size; i++) {
            MPI_Send(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD);
        }
    } else {
        while (1) {
            MPI_Recv(data, size, datatype, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
            if (status.MPI_TAG == 1) break;
    
            /* Do processing */
        }
    }
    

    如果您有非阻塞集合体(来自 MPI-3),则有一种更好的方法。在开始接收数据之前,您发布了一个非阻塞屏障。然后你开始发布非阻塞接收。不是只等待接收,而是对两个请求都使用 waitany ,当屏障完成时,你知道这里不会再有数据了。在发送方,您只需继续发送数据直到没有更多数据,然后做一个非阻塞屏障来完成事情。

    【讨论】:

    • 谢谢,但是对于第一个解决方案,我还有一个问题,如果发送消息的过程有例如 3 个单独的发送,带有不同的标签,我如何识别从 while 中断?我应该打破吗?因为有 3 条消息,而不仅仅是一条。消息。
    • 您只需选择一个标签,这将表明您已完成算法。您可以拥有任意数量的标签。
    • 很酷的把戏!不幸的是,当有很多发件人进程并且我们不知道哪个是最后一个发件人时,它似乎不起作用。就我而言,我有许多从节点可能会或可能不会向主节点发送消息。所以目前主节点不知道有多少接收。知道该怎么做吗?
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2011-01-02
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多