MPI_Test: MPI_ERR_TRUNCATE

Следующий код дает это сообщение об ошибке:

завершить вызов после броска экземпляра
‘Повышение :: 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;
}

0

Решение

Есть Жук когда есть несколько irecv на том же коммуникаторе, теге, источнике для сериализованных типов, который кажется очень связанным. Так что вы можете попробовать это с разными тегами. Тем не менее, это не будет работать из-за ошибки с отменой …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]