以下代码提供了此错误消息:
在引发“boost::exception_detail::clone_impl”实例后调用终止 what():MPI_Test: MPI_ERR_TRUNCATE:消息截断
这个问题可能与这个职位中讨论的boost::mpi的错误有关。我想确定错误的原因。
如果我只循环一次(for (int z=0; z<1; ++z)),代码就会工作,但是对于z<2,我会得到所提到的错误消息。
#include <boost/mpi.hpp>
class MyClass
{
std::vector<double> vec;
public:
void send_data(const boost::mpi::communicator& world, boost::mpi::request& req)
{
if (world.rank() == 0)
{
vec.resize(1000);
req = world.isend(1, 0, vec);
}
}
void recv_data(const boost::mpi::communicator& world)
{
if (world.rank() == 1)
{
while (true)
{
boost::mpi::request req = world.irecv(boost::mpi::any_source, 0, vec);
if (!req.test())
{
req.cancel();
//req.wait(); <-- hangs the program.
break;
}
}
}
}
};
int main()
{
boost::mpi::environment env;
boost::mpi::communicator world;
MyClass myclass;
for (int z=0; z<2; ++z) // works if loop only once.
{
boost::mpi::request req;
myclass.send_data(world, req);
world.barrier();
myclass.recv_data(world);
world.barrier();
if (world.rank() == 0)
req.wait();
}
return 0;
}发布于 2017-05-24 18:29:35
当同一个通信器、标记、序列化类型的源上有多个似乎非常相关的臭虫时,就会出现irecv。所以你可以用不同的标签试试。尽管如此,由于cancel的错误,这是行不通的.
https://stackoverflow.com/questions/44162979
复制相似问题