【问题标题】:How to know the receiver and the sender of an MPI request如何知道 MPI 请求的接收方和发送方
【发布时间】:2015-02-08 18:29:17
【问题描述】:

不知道有没有办法知道boost中MPI通信的接收方进程、发送方进程和标签值。

现在,我有一些进程可以相互发送/接收大量消息。而且,我在接收方有一个 boost::mpi::request 集合。此集合存储已收到的请求项。通信操作完成后,我可以从这个集合中提取谁是接收者进程和发送者进程吗? (我还需要知道标签值。)或者,我应该改变我的策略吗?也许有一个请求集合没有意义?

【问题讨论】:

  • 您的意思是,一旦您完成了 IRECV,您想要找出谁发送了数据,或者您想要查看一个 Request 对象并找出它的发件人或发件人?
  • 这是一个非此即彼的问题,而不是一个是/否的问题。无论如何,如果您的意思是第一个选项,那么 Jonathan Dursi 下面的答案就是您想要的。如果是第二个,你会更加失望。
  • 第一个正是我的意思

标签: c++ boost request mpi


【解决方案1】:

该信息处于请求完成后的状态,而不是请求本身。

#include <boost/mpi.hpp>
#include <iostream>
#include <string>
#include <boost/serialization/string.hpp>
namespace mpi = boost::mpi;

int main()
{
    mpi::environment env;
    mpi::communicator world;

    if (world.rank() == 0) {
        std::string msg, out_msg = "Hello from rank 0.";
        world.send(1, 17, out_msg);
    } else {
        mpi::request req[1];
        mpi::status stat[1];
        std::string rmsg;

        req[0] = world.irecv(mpi::any_source, mpi::any_tag, rmsg);
        mpi::wait_all(req, req + 1, stat);

        std::cout << "Got " << rmsg << std::endl;
        std::cout << "From   " << stat[0].source() << std::endl;
        std::cout << "Tagged " << stat[0].tag() << std::endl;
    }

    return 0;
}

【讨论】:

  • 非常感谢,这正是我所需要的。但是,我想为下一位读者添加一些内容。如果我定义大小为 1 的状态数组,那么在链接步骤中我会遇到一些 MPI 错误。我无法弄清楚为什么会这样。所以,我不得不将它定义为 mpi::status stat[2]。
  • 我没有看到任何这些链接错误。 wait_all 有一个超级模板原型:boost.org/doc/libs/1_57_0/doc/html/boost/mpi/wait_all.html。我对 boost 很陌生,所以我无法弄清楚为什么 status[1] 数组与 status[2] 数组不同。我的 boost 链接器问题只是我的分发库(g++ 内置 1.55)和自制库(clang++ 内置 1.57)冲突。也许你也遇到过类似的事情?
  • 很可能,您是对的。我正在使用一个名为 Repast HPC 的多代理仿真平台,它还使用了一些其他库。他们之间可能有冲突。但现在,我将继续处理 status[2]。
  • 好吧,状态数组应该和请求数组的大小相同——如果只等待一个请求,当然你实际上不需要wait_all()。我这里只有一个请求/状态作为示例。
  • 请求不止一个。有几个请求等待交付。 isend() 函数运行后,我想取消其中一些无法发送的。因此,我将这些取消的请求存储在一个集合中。在程序结束时,我再次开始发送这些未传递的消息。顺便说一句,我使用 test_all() 命令,而不是 wait_all()。因此,如果由于某种原因无法发送消息,那么我将其取消。
猜你喜欢
  • 2020-01-04
  • 1970-01-01
  • 2014-08-15
  • 2013-04-15
  • 2019-12-30
  • 2018-03-12
  • 2013-12-20
  • 2016-06-15
  • 2012-03-13
相关资源
最近更新 更多