- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在收到 boost::mpi
使用 irecv()
的消息功能。我有一个等待循环,调用 test()
在 request
上irecv
返回的对象并且,如果请求完成,则执行某些操作。然而,试图找出发件人的等级,我得到一个异常(exception):
boost::optional<T>::reference_type boost::optional<T>::get() [with T = boost::mpi::status; boost::optional<T>::reference_type = boost::mpi::status&]: Assertion `this->is_initialized()' failed.
这是我的代码片段:
mpi::request inc = world.irecv(mpi::any_source, MpiHandler::MPI_RESULT, pxl_results);
do {
if(inc.test()) {
// fails here, as the optional<status> returned by inc.test() is not initialized.
world.send(inc.test().get().source(), MpiHandler::MPI_WORK, package);
...
}
} while(...);
如果我检查 inc.test().is_initialized()
,我发现 optional<status>
确实是未初始化的。这里发生了什么,为什么我找不到关于我的 MPI 发送器的任何信息?可能是mpi::any_source
吗?这与 irecv
不兼容?
补充一下:通常,可以从请求对象中找到 MPI 消息的发送者和标记,如 this answer 中所述。 .
最佳答案
我很高兴你解决了这个问题,但也许这会进一步解释它。
问题正在调用 req.test()
在成功调用 req.test()
后再次调用. MPI - 完整引用:第 1 卷,MPI 核心:
A request object is deallocated automatically by a successful call to MPI_WAIT or MPI_TEST.
此外,来自 boost mpi 文档:
optional< status > test(); Determine whether the communication associated with this request has completed successfully. If so, returns the status object describing the communication. Otherwise, returns an empty optional<> to indicate that the communication has not completed yet. Note that once test() returns a status object, the request has completed and wait() should not be called.
因此,在if(req.test())
之后成功返回 boost::optional<mpi::status>
随后调用 req.test()
可能会返回一个空的 optional<>
导致你的异常。
为了看到这一点,我们首先从链接答案中的 Jonathan Dursi 的 hello world 示例中创建一个示例:
#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;
std::string rmsg;
req = world.irecv(mpi::any_source, mpi::any_tag, rmsg);
do {
if(req.test()) {
// fails here, as the optional<status> returned by inc.test() is not initialized.
std::cout << "From " << req.test().get().source() << std::endl;
std::cout << "Got " << rmsg << std::endl;
break;
}
} while(1);
}
return 0;
}
构建并运行它会导致预期的异常:
[ronin:~/Documents/CPP] aichao% mpirun --hostfile hostfile -np 2 ./test_mpi_request
From Assertion failed: (this->is_initialized()), function get, file /Users/Shared/Tools/boost_1_53_0/boost/optional/optional.hpp, line 631.
解决这个问题:
req.test()
返回 boost::optional<mpi::status>
对象。boost::optional
反对看是否req.test()
成功返回,如果成功,使用返回的 mpi::status
.代码:
#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;
std::string rmsg;
req = world.irecv(mpi::any_source, mpi::any_tag, rmsg);
do {
boost::optional<mpi::status> stat = req.test();
if (stat) {
std::cout << "From " << stat->source() << std::endl;
std::cout << "Got " << rmsg << std::endl;
std::cout << "Tagged " << stat->tag() << std::endl;
break;
}
} while(1);
}
return 0;
}
现在,我们成功了:
[ronin:~/Documents/CPP] aichao% mpirun --hostfile hostfile -np 2 ./test_mpi_request
From 0
Got Hello from rank 0.
Tagged 17
关于c++ - boost::mpi 的 irecv() 返回未初始化的状态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546941/
我正在运行以下代码,该代码使用命令 rank 将数组从 0 1 发送到 mpirun -n 2 python -u test_irecv.py > output 2>&1 。 from mpi4py
我使用MPI非阻塞通信(MPI_Irecv, MP_Isend)来监控slaves的空闲状态,代码如下。 排名 0: int dest = -1; while( dest <= 0){ int
我正在创建一个程序,其中来自数组的信息被传递到不同的处理器。在下面的代码中,我尝试使用 for 循环反复向处理器发送信息或从处理器发送信息。当我在 5 核和 2 核上运行程序时,所有打印语句都按预期在
我正在收到 boost::mpi使用 irecv() 的消息功能。我有一个等待循环,调用 test()在 request 上irecv 返回的对象并且,如果请求完成,则执行某些操作。然而,试图找出发件
我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到生产线上的下一个流程,然后当前流程才能处理它的业务。 接收进程需要接收才能继续计算,但是当我没有 MPI
我在 c 中有一个简单的 MPI 代码,我试图在其中学习如何在进程之间进行通信。这是代码: 已编辑代码 -> 问题已解决 #include #include #include #include
一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。 基本问题是我是否需要为 MPI::Isend 提供相应的 MPI::Irecv? 也就是说,即使消息发送是非阻塞的,只要我在重用发送缓冲区之
当我使用 Send/Recv 时,我的代码可以工作,但是当我用 Isend/Irecv 替换 Send/Recv 时,它会产生段错误。但在去其他地方之前,我想验证一下以下代码片段是否看起来很重要。 其
当使用序列化数据对同一标签执行多个 isend/irecv 传输时,我发现 boost::mpi 出现了 MPI_ERR_TRUNCATE 错误。这些不是并发传输,即不涉及线程。同时只有不止一项未完成
我正在尝试并行生成导数矩阵。我有两个线程的整个热方程求解器,但现在我试图找出如何将底行发送到下一个级别的 rec2,并将顶行发送到上一个级别的 rec1。我试着弄乱请求矩阵中的数字,但没有任何效果。出
我正在创建一个程序来使用 MPI 计算两个导体之间的电势。我正在使用非阻塞发送和接收,因此可以在处理器之间发送信息时进行计算。 但是,isend 和 irecv 之间的 if 语句以及包含计算的 wa
我是一名优秀的程序员,十分优秀!