]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/mpi/test/scatter_test.cpp
1 // Copyright (C) 2005, 2006 Douglas Gregor.
3 // Use, modification and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // A test of the scatter() and scatterv() collectives.
8 #include <boost/mpi/collectives/scatter.hpp>
9 #include <boost/mpi/collectives/scatterv.hpp>
10 #include <boost/mpi/communicator.hpp>
11 #include <boost/mpi/environment.hpp>
12 #include <boost/test/minimal.hpp>
13 #include "gps_position.hpp"
14 #include <boost/serialization/string.hpp>
15 #include <boost/serialization/list.hpp>
16 #include <boost/iterator/counting_iterator.hpp>
17 #include <boost/lexical_cast.hpp>
19 using boost::mpi::communicator
;
21 template<typename Generator
>
23 scatter_test(const communicator
& comm
, Generator generator
,
24 const char* kind
, int root
= -1)
26 typedef typename
Generator::result_type value_type
;
29 for (root
= 0; root
< comm
.size(); ++root
)
30 scatter_test(comm
, generator
, kind
, root
);
32 using boost::mpi::scatter
;
36 if (comm
.rank() == root
) {
37 std::vector
<value_type
> values
;
39 for (int p
= 0; p
< comm
.size(); ++p
)
40 values
.push_back(generator(p
));
42 std::cout
<< "Scattering " << kind
<< " from root "
43 << root
<< "..." << std::endl
;
45 scatter(comm
, values
, value
, root
);
47 scatter(comm
, value
, root
);
50 BOOST_CHECK(value
== generator(comm
.rank()));
57 template<typename Generator
>
59 scatterv_test(const communicator
& comm
, Generator generator
,
60 const char* kind
, int root
= -1)
62 typedef typename
Generator::result_type value_type
;
65 for (root
= 0; root
< comm
.size(); ++root
)
66 scatterv_test(comm
, generator
, kind
, root
);
68 using boost::mpi::scatterv
;
70 int mysize
= comm
.rank() + 1;
71 std::vector
<value_type
> myvalues(mysize
);
73 if (comm
.rank() == root
) {
74 std::vector
<value_type
> values
;
75 std::vector
<int> sizes(comm
.size());
77 // process p will receive p+1 identical generator(p) elements
78 for (int p
= 0; p
< comm
.size(); ++p
) {
79 for (int i
= 0; i
< p
+1; ++i
)
80 values
.push_back(generator(p
));
84 std::cout
<< "Scatteringv " << kind
<< " from root "
85 << root
<< "..." << std::endl
;
87 scatterv(comm
, values
, sizes
, &myvalues
[0], root
);
89 scatterv(comm
, &myvalues
[0], mysize
, root
);
92 for (int i
= 0; i
< mysize
; ++i
)
93 BOOST_CHECK(myvalues
[i
] == generator(comm
.rank()));
101 // Generators to test with scatter/scatterv
105 typedef int result_type
;
107 int operator()(int p
) const { return 17 + p
; }
112 typedef gps_position result_type
;
114 gps_position
operator()(int p
) const
116 return gps_position(39 + p
, 16, 20.2799);
120 struct string_generator
122 typedef std::string result_type
;
124 std::string
operator()(int p
) const
126 std::string result
= boost::lexical_cast
<std::string
>(p
);
127 result
+= " rosebud";
128 if (p
!= 1) result
+= 's';
133 struct string_list_generator
135 typedef std::list
<std::string
> result_type
;
137 std::list
<std::string
> operator()(int p
) const
139 std::list
<std::string
> result
;
140 for (int i
= 0; i
<= p
; ++i
) {
141 std::string value
= boost::lexical_cast
<std::string
>(i
);
142 result
.push_back(value
);
148 int test_main(int argc
, char* argv
[])
150 boost::mpi::environment
env(argc
, argv
);
154 scatter_test(comm
, int_generator(), "integers");
155 scatter_test(comm
, gps_generator(), "GPS positions");
156 scatter_test(comm
, string_generator(), "string");
157 scatter_test(comm
, string_list_generator(), "list of strings");
159 scatterv_test(comm
, int_generator(), "integers");
160 scatterv_test(comm
, gps_generator(), "GPS positions");
161 scatterv_test(comm
, string_generator(), "string");
162 scatterv_test(comm
, string_list_generator(), "list of strings");