diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
commit | 19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch) | |
tree | 42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/mpi/test/all_gather_test.cpp | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/mpi/test/all_gather_test.cpp')
-rw-r--r-- | src/boost/libs/mpi/test/all_gather_test.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/boost/libs/mpi/test/all_gather_test.cpp b/src/boost/libs/mpi/test/all_gather_test.cpp new file mode 100644 index 000000000..c2385f61e --- /dev/null +++ b/src/boost/libs/mpi/test/all_gather_test.cpp @@ -0,0 +1,148 @@ +// Copyright (C) 2005-2006 Douglas Gregor <doug.gregor@gmail.com> + +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// A test of the all_gather() collective. + +#include <algorithm> + +#include <boost/mpi/collectives/all_gather.hpp> +#include <boost/mpi/collectives/all_gatherv.hpp> +#include <boost/mpi/environment.hpp> +#include <boost/mpi/communicator.hpp> +#include <boost/serialization/string.hpp> +#include <boost/serialization/list.hpp> +#include <boost/iterator/counting_iterator.hpp> +#include <boost/lexical_cast.hpp> + +#define BOOST_TEST_MODULE mpi_all_gather +#include <boost/test/included/unit_test.hpp> + +#include "gps_position.hpp" + +namespace mpi = boost::mpi; + +template<typename Generator> +void +all_gather_test(const mpi::communicator& comm, Generator generator, + std::string kind) +{ + typedef typename Generator::result_type value_type; + value_type value = generator(comm.rank()); + + std::vector<value_type> values; + if (comm.rank() == 0) { + std::cout << "Gathering " << kind << "..."; + std::cout.flush(); + } + + mpi::all_gather(comm, value, values); + + std::vector<value_type> expected_values; + for (int p = 0; p < comm.size(); ++p) + expected_values.push_back(generator(p)); + BOOST_CHECK(values == expected_values); + if (comm.rank() == 0 && values == expected_values) + std::cout << "OK." << std::endl; + + (comm.barrier)(); +} + +template<typename Generator> +void +all_gatherv_test(const mpi::communicator& comm, Generator generator, + std::string kind) +{ + typedef typename Generator::result_type value_type; + using boost::mpi::all_gatherv; + + std::vector<value_type> myvalues, expected, values; + std::vector<int> sizes; + for(int r = 0; r < comm.size(); ++r) { + value_type value = generator(r); + sizes.push_back(r+1); + for (int k=0; k < r+1; ++k) { + expected.push_back(value); + if(comm.rank() == r) { + myvalues.push_back(value); + } + } + } + if (comm.rank() == 0) { + std::cout << "Gathering " << kind << "..."; + std::cout.flush(); + } + + mpi::all_gatherv(comm, myvalues, values, sizes); + + BOOST_CHECK(values == expected); + + if (comm.rank() == 0 && values == expected) + std::cout << "OK." << std::endl; + + (comm.barrier)(); +} + +// Generates integers to test with gather() +struct int_generator +{ + typedef int result_type; + + int operator()(int p) const { return 17 + p; } +}; + +// Generates GPS positions to test with gather() +struct gps_generator +{ + typedef gps_position result_type; + + gps_position operator()(int p) const + { + return gps_position(39 + p, 16, 20.2799); + } +}; + +struct string_generator +{ + typedef std::string result_type; + + std::string operator()(int p) const + { + std::string result = boost::lexical_cast<std::string>(p); + result += " rosebud"; + if (p != 1) result += 's'; + return result; + } +}; + +struct string_list_generator +{ + typedef std::list<std::string> result_type; + + std::list<std::string> operator()(int p) const + { + std::list<std::string> result; + for (int i = 0; i <= p; ++i) { + std::string value = boost::lexical_cast<std::string>(i); + result.push_back(value); + } + return result; + } +}; + +BOOST_AUTO_TEST_CASE(all_gather) +{ + boost::mpi::environment env; + mpi::communicator comm; + all_gather_test(comm, int_generator(), "integers"); + all_gather_test(comm, gps_generator(), "GPS positions"); + all_gather_test(comm, string_generator(), "string"); + all_gather_test(comm, string_list_generator(), "list of strings"); + + all_gatherv_test(comm, int_generator(), "integers"); + all_gatherv_test(comm, gps_generator(), "GPS positions"); + all_gatherv_test(comm, string_generator(), "string"); + all_gatherv_test(comm, string_list_generator(), "list of strings"); +} |