fixed: wrong root rank in variadic broadcast

change the test to broadcast from rank 1 instead of 0
so this bug does not resurface
This commit is contained in:
Arne Morten Kvarving 2022-09-14 19:38:24 +02:00
parent 67ec01a730
commit 5c78925981
2 changed files with 10 additions and 10 deletions

View File

@ -436,20 +436,20 @@ public:
m_op = Operation::PACK; m_op = Operation::PACK;
variadic_call(args...); variadic_call(args...);
m_packSize = m_position; m_packSize = m_position;
m_comm.broadcast(&m_packSize, 1, 0); m_comm.broadcast(&m_packSize, 1, root);
m_comm.broadcast(m_buffer.data(), m_position, 0); m_comm.broadcast(m_buffer.data(), m_position, root);
} catch (...) { } catch (...) {
m_packSize = std::numeric_limits<size_t>::max(); m_packSize = std::numeric_limits<size_t>::max();
m_comm.broadcast(&m_packSize, 1, 0); m_comm.broadcast(&m_packSize, 1, root);
throw; throw;
} }
} else { } else {
m_comm.broadcast(&m_packSize, 1, 0); m_comm.broadcast(&m_packSize, 1, root);
if (m_packSize == std::numeric_limits<size_t>::max()) { if (m_packSize == std::numeric_limits<size_t>::max()) {
throw std::runtime_error("Error detected in parallel serialization"); throw std::runtime_error("Error detected in parallel serialization");
} }
m_buffer.resize(m_packSize); m_buffer.resize(m_packSize);
m_comm.broadcast(m_buffer.data(), m_packSize, 0); m_comm.broadcast(m_buffer.data(), m_packSize, root);
m_position = 0; m_position = 0;
m_op = Operation::UNPACK; m_op = Operation::UNPACK;
variadic_call(std::forward<Args>(args)...); variadic_call(std::forward<Args>(args)...);

View File

@ -61,18 +61,18 @@ BOOST_AUTO_TEST_CASE(BroadCast)
auto cc = Dune::MPIHelper::getCollectiveCommunication(); auto cc = Dune::MPIHelper::getCollectiveCommunication();
std::vector<double> d(3); std::vector<double> d(3);
if (cc.rank() == 0) if (cc.rank() == 1)
std::iota(d.begin(), d.end(), 1.0); std::iota(d.begin(), d.end(), 1.0);
std::vector<int> i(3); std::vector<int> i(3);
if (cc.rank() == 0) if (cc.rank() == 1)
std::iota(i.begin(), i.end(), 4); std::iota(i.begin(), i.end(), 4);
double d1 = cc.rank() == 0 ? 7.0 : 0.0; double d1 = cc.rank() == 1 ? 7.0 : 0.0;
size_t i1 = cc.rank() == 0 ? 8 : 0; size_t i1 = cc.rank() == 1 ? 8 : 0;
Opm::EclMpiSerializer ser(cc); Opm::EclMpiSerializer ser(cc);
ser.broadcast(0, d, i, d1, i1); ser.broadcast(1, d, i, d1, i1);
for (size_t c = 0; c < 3; ++c) { for (size_t c = 0; c < 3; ++c) {
BOOST_CHECK_EQUAL(d[c], 1.0+c); BOOST_CHECK_EQUAL(d[c], 1.0+c);