3 #define TIMPI_UNIT_ASSERT(expr) \ 37 for (
int p=0; p<N; ++p)
44 for (
int p=0; p<N; ++p)
45 TIMPI_UNIT_ASSERT( data[p] == N*(N-1)/2 );
50 template <
class Gettable>
62 TIMPI_UNIT_ASSERT(std::get<0>(data) == N*(N-1)/2);
63 TIMPI_UNIT_ASSERT(std::get<1>(data) == N*(N-1));
75 for (
int p=0; p<N; ++p)
82 for (
int p=0; p<N; ++p)
83 TIMPI_UNIT_ASSERT( data[std::string(
"key") + std::to_string(p)] == N*(N-1)/2 );
90 std::vector<processor_id_type> vals;
95 TIMPI_UNIT_ASSERT( i == vals[i] );
102 std::vector<std::string> vals;
107 TIMPI_UNIT_ASSERT(
"Processor" +
pt_number[i % 10] == vals[i] );
114 std::vector<processor_id_type> vals;
118 TIMPI_UNIT_ASSERT( i == vals[i] );
124 std::vector<std::string> vals;
128 TIMPI_UNIT_ASSERT(
"Processor" +
pt_number[i % 10] == vals[i] );
134 std::vector<std::string> gathered;
139 for (std::size_t i = 0; i < gathered.size(); ++i)
140 TIMPI_UNIT_ASSERT(gathered[i] ==
"Processor" + std::to_string(i));
145 std::vector<std::string> vals;
152 TIMPI_UNIT_ASSERT(
"Processor" +
pt_number[i % 10] +
"A" == vals[2*i] );
153 TIMPI_UNIT_ASSERT(
"Processor" +
pt_number[i % 10] +
"B" == vals[2*i+1] );
159 std::vector<int> vals;
162 std::vector<std::vector<int>> allvals;
167 TIMPI_UNIT_ASSERT(allvals[i].size() == i%10);
169 TIMPI_UNIT_ASSERT(allvals[i][j] ==
int(3*j));
175 std::vector<std::vector<double>> allvals;
192 TIMPI_UNIT_ASSERT(allvals.size() == 1);
196 int r = i > 0 ? (i+1) : i;
197 TIMPI_UNIT_ASSERT(allvals[i].size() == 2);
198 TIMPI_UNIT_ASSERT(allvals[i][0] == r);
199 TIMPI_UNIT_ASSERT(allvals[i][1] == r*2);
205 std::vector<std::string> vals;
208 std::vector<std::vector<std::string>> allvals;
213 TIMPI_UNIT_ASSERT(allvals[i].size() == i%10);
215 TIMPI_UNIT_ASSERT(allvals[i][j] ==
pt_number[j]);
221 std::vector<std::string> vals;
224 TIMPI_UNIT_ASSERT( vals.empty() );
231 std::vector<std::string> vals;
234 vals.push_back(
"Proc 0 only");
238 TIMPI_UNIT_ASSERT( vals[0] == std::string(
"Proc 0 only") );
243 template <
class Container>
246 Container dest = src;
254 for (std::size_t i=0; i<src.size(); i++)
255 TIMPI_UNIT_ASSERT( src[i] == dest[i] );
260 std::string src =
"hello";
261 std::string dest = src;
270 for (std::size_t i=0; i<src.size(); i++)
271 TIMPI_UNIT_ASSERT( src[i] == dest[i] );
277 typedef array<array<int, 3>, 2> aa;
282 std::vector<aa> src(3), dest(3,x);
308 for (std::size_t i=0; i<src.size(); i++)
309 for (std::size_t j=0; j<2; j++)
310 for (std::size_t k=0; k<3; k++)
311 TIMPI_UNIT_ASSERT(src[i][j][k] == dest[i][j][k]);
317 typedef pair<pair<pair<pair<int, int>,
int>,
int>,
int> pppp;
318 std::vector<pppp> src(3), dest(3);
320 src[0].first.first.first.first=0;
321 src[0].first.first.first.second=-1;
322 src[0].first.second = -2;
324 src[1].first.first.first.first=10;
325 src[1].first.first.first.second=9;
326 src[1].first.second = 8;
328 src[2].first.first.first.first=20;
329 src[2].first.first.first.second=19;
330 src[2].first.second = 18;
338 for (std::size_t i=0; i<src.size(); i++)
340 TIMPI_UNIT_ASSERT(src[i].first.first.first.first ==
341 dest[i].first.first.first.first);
342 TIMPI_UNIT_ASSERT(src[i].first.first.first.second ==
343 dest[i].first.first.first.second);
344 TIMPI_UNIT_ASSERT(src[i].first.first.second ==
345 dest[i].first.first.second);
346 TIMPI_UNIT_ASSERT(src[i].first.second ==
347 dest[i].first.second);
348 TIMPI_UNIT_ASSERT(src[i].second ==
359 std::vector<processor_id_type> src;
376 std::vector<unsigned int> src;
377 std::vector<unsigned int> dest;
378 static const unsigned int CHUNK_SIZE = 3;
383 for (std::size_t i=0; i<src.size(); i++)
389 for (
unsigned int i=0; i<CHUNK_SIZE; i++)
395 std::vector<unsigned int> src;
396 std::vector<unsigned int> dest;
397 std::vector<int> counts;
405 for (std::size_t i=0; i<src.size(); i++)
408 counts[i] = static_cast<int>(i+1);
415 TIMPI_UNIT_ASSERT( start_value + i == dest[i] );
420 std::vector<std::vector<unsigned int>> src;
421 std::vector<unsigned int> dest;
427 for (std::size_t i=0; i<src.size(); ++i)
430 unsigned int global_counter = 0;
431 for (std::size_t i=0; i<src.size(); i++)
432 for (std::size_t j=0; j<src[i].size(); j++)
433 src[i][j] = global_counter++;
440 TIMPI_UNIT_ASSERT( start_value + i == dest[i] );
455 unsigned int min = std::numeric_limits<unsigned int>::max();
462 while(!req.
test()) {}
464 TIMPI_UNIT_ASSERT (min == static_cast<unsigned int>(3));
472 constexpr std::size_t N=5;
473 std::vector<unsigned int> local_vals(N),
474 min_vals(N, std::numeric_limits<unsigned int>::max());
477 std::size_t tests_done = 0;
479 std::vector<Request> reqs;
480 for (std::size_t i=0; i != N; ++i)
489 TIMPI_UNIT_ASSERT (min_vals[i] == static_cast<unsigned int>(4+i));
495 std::size_t i = std::size_t(-1);
498 while (i != std::size_t(-1))
500 TIMPI_UNIT_ASSERT (min_vals[i] == static_cast<unsigned int>(4+i));
505 TIMPI_UNIT_ASSERT (tests_done == N);
514 true_sum += rank + 1;
523 TIMPI_UNIT_ASSERT (true_sum == sum);
531 unsigned int min = std::numeric_limits<unsigned int>::max();
537 TIMPI_UNIT_ASSERT (min == static_cast<unsigned int>(0));
548 TIMPI_UNIT_ASSERT (min == static_cast<unsigned int>(0));
560 constexpr std::size_t vec_size = 2345;
561 std::vector<bool> vec_bool(vec_size,
true);
562 for (std::size_t i=0; i < vec_size; i += (rank+2))
567 for (std::size_t i=0; i != vec_size; ++i)
569 bool should_be_true =
true;
573 should_be_true =
false;
576 TIMPI_UNIT_ASSERT (vec_bool[i] == should_be_true);
585 unsigned long min = 1;
587 min = std::numeric_limits<unsigned long>::max();
590 (MPI_Allreduce (MPI_IN_PLACE, &min, 1,
591 MPI_UNSIGNED_LONG, MPI_MIN,
594 TIMPI_UNIT_ASSERT (min == 1);
597 template <
typename T>
603 min = std::numeric_limits<T>::max();
607 TIMPI_UNIT_ASSERT (min == 1);
621 TIMPI_UNIT_ASSERT (cast_int<processor_id_type>(max+1) ==
633 TIMPI_UNIT_ASSERT (cast_int<processor_id_type>(max+1) ==
647 constexpr std::size_t vec_size = 2345;
648 std::vector<bool> vec_bool(vec_size,
false);
649 for (std::size_t i=0; i < vec_size; i += (rank+2))
654 for (std::size_t i=0; i != vec_size; ++i)
656 bool should_be_true =
false;
660 should_be_true =
true;
663 TIMPI_UNIT_ASSERT (vec_bool[i] == should_be_true);
684 for (
int p=0; p<N; ++p)
685 TIMPI_UNIT_ASSERT (data[p] == p);
699 data[std::string(
"key") + std::to_string(rank)] = rank;
705 for (
int p=0; p<N; ++p)
706 TIMPI_UNIT_ASSERT (data[std::string(
"key") + std::to_string(p)] == p);
714 unsigned int minid = 0;
718 TIMPI_UNIT_ASSERT (min == static_cast<int>(0));
727 unsigned int maxid = 0;
731 TIMPI_UNIT_ASSERT (max+1 ==
741 unsigned int minid = 0;
745 TIMPI_UNIT_ASSERT (min == static_cast<int>(0));
746 TIMPI_UNIT_ASSERT (minid == static_cast<unsigned int>((
TestCommWorld->
size()-1)%2));
754 unsigned int minid = 0;
758 TIMPI_UNIT_ASSERT (min ==
double(0));
767 unsigned int maxid = 0;
771 TIMPI_UNIT_ASSERT (max == static_cast<int>(1));
772 TIMPI_UNIT_ASSERT (maxid == static_cast<unsigned int>((
TestCommWorld->
size()-1)%2));
780 unsigned int maxid = 0;
794 int min_tag = min + 3;
795 unsigned int minid = 0;
797 std::pair<int, int> p{min, min_tag};
801 TIMPI_UNIT_ASSERT (p.first == static_cast<int>(0));
802 TIMPI_UNIT_ASSERT (p.second == static_cast<int>(3));
811 int max_tag = max + 3;
812 unsigned int maxid = 0;
814 std::pair<int, int> p{max, max_tag};
818 TIMPI_UNIT_ASSERT (p.first+1 ==
820 TIMPI_UNIT_ASSERT (p.second+1 ==
829 double min = std::numeric_limits<double>::infinity();
833 TIMPI_UNIT_ASSERT (min == std::numeric_limits<double>::infinity());
835 min = -std::numeric_limits<double>::infinity();
839 TIMPI_UNIT_ASSERT (min == -std::numeric_limits<double>::infinity());
846 double max = std::numeric_limits<double>::infinity();
850 TIMPI_UNIT_ASSERT (max == std::numeric_limits<double>::infinity());
852 max = -std::numeric_limits<double>::infinity();
856 TIMPI_UNIT_ASSERT (max == -std::numeric_limits<double>::infinity());
869 std::vector<unsigned int> src_val(3), recv_val(3);
891 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
893 for (std::size_t i=0; i<src_val.size(); i++)
894 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
899 std::fill (recv_val.begin(), recv_val.end(), 0);
910 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
912 for (std::size_t i=0; i<src_val.size(); i++)
913 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
930 std::vector<unsigned int> src_val(3), recv_val(3);
952 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
954 for (std::size_t i=0; i<src_val.size(); i++)
955 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
959 std::fill (recv_val.begin(), recv_val.end(), 0);
971 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
973 for (std::size_t i=0; i<src_val.size(); i++)
974 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
990 std::set<unsigned int> src_val, recv_val;
994 src_val.insert(1337);
1005 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1007 for (std::set<unsigned int>::const_iterator
1008 it = src_val.begin(), end = src_val.end(); it != end;
1010 TIMPI_UNIT_ASSERT ( recv_val.count(*it) );
1028 std::vector<std::vector<unsigned int> > src_val(3), recv_val;
1030 src_val[0].push_back(4);
1031 src_val[2].push_back(procup);
1043 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1045 for (std::size_t i = 0; i != 3; ++i)
1046 TIMPI_UNIT_ASSERT ( src_val[i].size() == recv_val[i].size() );
1048 TIMPI_UNIT_ASSERT ( recv_val[0][0] == static_cast<unsigned int> (4) );
1049 TIMPI_UNIT_ASSERT ( recv_val[2][0] == static_cast<unsigned int> (
TestCommWorld->
rank()) );
1050 TIMPI_UNIT_ASSERT ( recv_val[2][1] == procdown );
1071 std::vector<std::vector<unsigned int> > src_val(3), recv_val;
1073 src_val[0].push_back(4);
1074 src_val[2].push_back(procup);
1086 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1088 for (std::size_t i = 0; i != 3; ++i)
1089 TIMPI_UNIT_ASSERT ( src_val[i].size() == recv_val[i].size() );
1091 TIMPI_UNIT_ASSERT ( recv_val[0][0] == static_cast<unsigned int> (4) );
1092 TIMPI_UNIT_ASSERT ( recv_val[2][0] == static_cast<unsigned int> (
TestCommWorld->
rank()) );
1093 TIMPI_UNIT_ASSERT ( recv_val[2][1] == procdown );
1103 double inf = std::numeric_limits<double>::infinity();
1109 inf = -std::numeric_limits<double>::infinity();
1117 const std::string s =
"Violin";
1127 const std::vector<int> v = {1, 2, 3};
1135 template<
typename T>
1150 unsigned int color = rank % 2;
1153 TIMPI_UNIT_ASSERT(subcomm.
size() >= 1);
1165 #ifdef TIMPI_HAVE_MPI 1166 type = MPI_COMM_TYPE_SHARED;
1171 TIMPI_UNIT_ASSERT(subcomm.
size() >= 1);
1175 template <
typename NonBuiltin>
1185 int main(
int argc,
const char *
const * argv)
1192 testSum<std::map<int,int>>();
1193 testSum<std::unordered_map<int,int>>();
1194 testSumOpFunction<std::pair<int,int>>();
1195 testNonFixedTypeSum<std::map<std::string,int>>();
1196 testNonFixedTypeSum<std::unordered_map<std::string,int>>();
1208 testBroadcast<std::vector<unsigned int>>({0,1,2});
1209 testBroadcast<std::map<int, int>>({{0,0}, {1,1}, {2,2}});
1210 testBroadcast<std::map<int, std::string>>({{0,
"foo"}, {1,
"bar"}, {2,
"baz"}});
1211 testBroadcast<std::unordered_map<int, int>>({{0,0}, {1,1}, {2,2}});
1212 testBroadcast<std::unordered_map<int, std::string>>({{0,
"foo"}, {1,
"bar"}, {2,
"baz"}});
1223 testMinLarge<char>();
1224 testMinLarge<unsigned char>();
1225 testMinLarge<short>();
1226 testMinLarge<unsigned short>();
1227 testMinLarge<int>();
1228 testMinLarge<unsigned int>();
1229 testMinLarge<long>();
1230 testMinLarge<unsigned long>();
1231 testMinLarge<long long>();
1232 testMinLarge<unsigned long long>();
1233 testMinLarge<float>();
1234 testMinLarge<double>();
1235 testMinLarge<long double>();
1236 testMapMax<std::map<int, int>>();
1237 testMapMax<std::unordered_map<int, int>>();
1238 testNonFixedTypeMapMax<std::map<std::string,int>>();
1239 testNonFixedTypeMapMax<std::unordered_map<std::string,int>>();
1258 testSemiVerifyType<bool>();
1259 testSemiVerifyType<char>();
1260 testSemiVerifyType<unsigned char>();
1261 testSemiVerifyType<short>();
1262 testSemiVerifyType<unsigned short>();
1263 testSemiVerifyType<int>();
1264 testSemiVerifyType<unsigned int>();
1265 testSemiVerifyType<long>();
1266 testSemiVerifyType<unsigned long>();
1267 testSemiVerifyType<long long>();
1268 testSemiVerifyType<unsigned long long>();
1269 testSemiVerifyType<float>();
1270 testSemiVerifyType<double>();
1271 testSemiVerifyType<long double>();
1279 testStandardTypeAssignment<TIMPI_DEFAULT_SCALAR_TYPE>();
1280 testStandardTypeAssignment<std::pair<unsigned, unsigned>>();
1281 testStandardTypeAssignment<std::array<unsigned, 1>>();
1282 testStandardTypeAssignment<std::tuple<unsigned, unsigned, unsigned>>();
void testBroadcast(Container &&src)
MPI_Request request
Request object for non-blocking I/O.
void send_mode(const SendMode sm)
Explicitly sets the SendMode type used for send operations.
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
Take a vector of length this->size(), and fill in recv[processor_id] = the value of send on that proc...
void testSemiVerifyString()
void testAllGatherVectorVector()
void scatter(const std::vector< T, A > &data, T &recv, const unsigned int root_id=0) const
Take a vector of local variables and scatter the ith item to the ith processor in the communicator...
void testBroadcastNestedType()
MPI_Info info
Info object used by some MPI-3 methods.
void minloc(T &r, unsigned int &min_id) const
Take a local variable and replace it with the minimum of it's values on all processors, returning the minimum rank of a processor which originally held the minimum value.
static const request null_request
void testAllGatherEmptyVectorString()
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
Take a vector of length comm.size(), and on processor root_id fill in recv[processor_id] = the value ...
The TIMPIInit class, when constructed, initializes any dependent libraries (e.g.
void testBroadcastArrayType()
void sum(T &r) const
Take a local variable and replace it with the sum of it's values on all processors.
void barrier() const
Pause execution until all processors reach a certain point.
void testAllGatherVectorVectorPacked()
void testAllGatherString()
processor_id_type rank() const
void testNonblockingTest()
Templated class to provide the appropriate MPI datatype for use with built-in C types or simple C++ c...
void testAllGatherHalfEmptyVectorString()
void testNonblockingMin()
void testStandardTypeAssignment()
Encapsulates the MPI_Comm object.
void testSendRecvVecVecs()
processor_id_type size() const
std::vector< std::string > pt_number
uint8_t processor_id_type
void testNonblockingSum()
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
Blocking-receive from one processor with data-defined type.
Communicator * TestCommWorld
void min(const T &r, T &o, Request &req) const
Non-blocking minimum of the local value r into o with the request req.
void testAllGatherVectorString()
void split(int color, int key, Communicator &target) const
void testSemiVerifyType()
void maxloc(T &r, unsigned int &max_id) const
Take a local variable and replace it with the maximum of it's values on all processors, returning the minimum rank of a processor which originally held the maximum value.
timpi_pure bool semiverify(const T *r) const
Check whether a local pointer points to the same value on all processors where it is not null...
void testNonblockingWaitany()
void testNonblockingMax()
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
Take a local value and broadcast it to all processors.
void split_by_type(int split_type, int key, info i, Communicator &target) const
void testAllGatherVectorVectorInPlace()
Encapsulates the MPI_Request.
std::size_t waitany(std::vector< Request > &r)
Wait for at least one non-blocking operation to finish.
void max(const T &r, T &o, Request &req) const
Non-blocking maximum of the local value r into o with the request req.
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
Blocking-send to one processor with data-defined type.
void testBroadcastString()
int main(int argc, const char *const *argv)
Status wait(Request &r)
Wait for a non-blocking send or receive to finish.
void testNonFixedTypeSum()
void testNonFixedTypeMapMax()
void testRecvIsendVecVecs()
const Communicator & comm() const
Returns the Communicator created by this object, which will be a compatibility shim if MPI is not ena...
void testSemiVerifyVector()