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;
281 aa x{{ {0,1,2},{3,4,5} }};
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));
479 const std::string send_string =
480 "More than 64 bytes to avoid false positives with Small String Optimization libraries";
483 std::string recv_string(send_string.size(),
' ');
494 TIMPI_UNIT_ASSERT (send_string == recv_string);
502 constexpr std::size_t N=5;
503 std::vector<unsigned int> local_vals(N),
504 min_vals(N, std::numeric_limits<unsigned int>::max());
507 std::size_t tests_done = 0;
509 std::vector<Request> reqs;
510 for (std::size_t i=0; i != N; ++i)
519 TIMPI_UNIT_ASSERT (min_vals[i] == static_cast<unsigned int>(4+i));
525 std::size_t i = std::size_t(-1);
528 while (i != std::size_t(-1))
530 TIMPI_UNIT_ASSERT (min_vals[i] == static_cast<unsigned int>(4+i));
535 TIMPI_UNIT_ASSERT (tests_done == N);
544 true_sum += rank + 1;
553 TIMPI_UNIT_ASSERT (true_sum == sum);
561 unsigned int min = std::numeric_limits<unsigned int>::max();
567 TIMPI_UNIT_ASSERT (min == static_cast<unsigned int>(0));
578 TIMPI_UNIT_ASSERT (min == static_cast<unsigned int>(0));
590 constexpr std::size_t vec_size = 2345;
591 std::vector<bool> vec_bool(vec_size,
true);
592 for (std::size_t i=0; i < vec_size; i += (rank+2))
597 for (std::size_t i=0; i != vec_size; ++i)
599 bool should_be_true =
true;
603 should_be_true =
false;
606 TIMPI_UNIT_ASSERT (vec_bool[i] == should_be_true);
615 unsigned long min = 1;
617 min = std::numeric_limits<unsigned long>::max();
620 (MPI_Allreduce (MPI_IN_PLACE, &min, 1,
621 MPI_UNSIGNED_LONG, MPI_MIN,
624 TIMPI_UNIT_ASSERT (min == 1);
627 template <
typename T>
633 min = std::numeric_limits<T>::max();
637 TIMPI_UNIT_ASSERT (min == 1);
651 TIMPI_UNIT_ASSERT (cast_int<processor_id_type>(max+1) ==
663 TIMPI_UNIT_ASSERT (cast_int<processor_id_type>(max+1) ==
677 constexpr std::size_t vec_size = 2345;
678 std::vector<bool> vec_bool(vec_size,
false);
679 for (std::size_t i=0; i < vec_size; i += (rank+2))
684 for (std::size_t i=0; i != vec_size; ++i)
686 bool should_be_true =
false;
690 should_be_true =
true;
693 TIMPI_UNIT_ASSERT (vec_bool[i] == should_be_true);
714 for (
int p=0; p<N; ++p)
715 TIMPI_UNIT_ASSERT (data[p] == p);
729 data[std::string(
"key") + std::to_string(rank)] = rank;
735 for (
int p=0; p<N; ++p)
736 TIMPI_UNIT_ASSERT (data[std::string(
"key") + std::to_string(p)] == p);
744 unsigned int minid = 0;
748 TIMPI_UNIT_ASSERT (min == static_cast<int>(0));
757 unsigned int maxid = 0;
761 TIMPI_UNIT_ASSERT (max+1 ==
771 unsigned int minid = 0;
775 TIMPI_UNIT_ASSERT (min == static_cast<int>(0));
776 TIMPI_UNIT_ASSERT (minid == static_cast<unsigned int>((
TestCommWorld->
size()-1)%2));
784 unsigned int minid = 0;
788 TIMPI_UNIT_ASSERT (min ==
double(0));
797 unsigned int maxid = 0;
801 TIMPI_UNIT_ASSERT (max == static_cast<int>(1));
802 TIMPI_UNIT_ASSERT (maxid == static_cast<unsigned int>((
TestCommWorld->
size()-1)%2));
810 unsigned int maxid = 0;
824 int min_tag = min + 3;
825 unsigned int minid = 0;
827 std::pair<int, int> p{min, min_tag};
831 TIMPI_UNIT_ASSERT (p.first == static_cast<int>(0));
832 TIMPI_UNIT_ASSERT (p.second == static_cast<int>(3));
841 int max_tag = max + 3;
842 unsigned int maxid = 0;
844 std::pair<int, int> p{max, max_tag};
848 TIMPI_UNIT_ASSERT (p.first+1 ==
850 TIMPI_UNIT_ASSERT (p.second+1 ==
859 double min = std::numeric_limits<double>::infinity();
863 TIMPI_UNIT_ASSERT (min == std::numeric_limits<double>::infinity());
865 min = -std::numeric_limits<double>::infinity();
869 TIMPI_UNIT_ASSERT (min == -std::numeric_limits<double>::infinity());
876 double max = std::numeric_limits<double>::infinity();
880 TIMPI_UNIT_ASSERT (max == std::numeric_limits<double>::infinity());
882 max = -std::numeric_limits<double>::infinity();
886 TIMPI_UNIT_ASSERT (max == -std::numeric_limits<double>::infinity());
899 std::vector<unsigned int> src_val(3), recv_val(3);
921 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
923 for (std::size_t i=0; i<src_val.size(); i++)
924 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
929 std::fill (recv_val.begin(), recv_val.end(), 0);
940 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
942 for (std::size_t i=0; i<src_val.size(); i++)
943 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
960 std::vector<unsigned int> src_val(3), recv_val(3);
982 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
984 for (std::size_t i=0; i<src_val.size(); i++)
985 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
989 std::fill (recv_val.begin(), recv_val.end(), 0);
1001 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1003 for (std::size_t i=0; i<src_val.size(); i++)
1004 TIMPI_UNIT_ASSERT( src_val[i] == recv_val[i] );
1020 std::set<unsigned int> src_val, recv_val;
1024 src_val.insert(1337);
1035 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1037 for (std::set<unsigned int>::const_iterator
1038 it = src_val.begin(), end = src_val.end(); it != end;
1040 TIMPI_UNIT_ASSERT ( recv_val.count(*it) );
1058 std::vector<std::vector<unsigned int> > src_val(3), recv_val;
1060 src_val[0].push_back(4);
1061 src_val[2].push_back(procup);
1073 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1075 for (std::size_t i = 0; i != 3; ++i)
1076 TIMPI_UNIT_ASSERT ( src_val[i].size() == recv_val[i].size() );
1078 TIMPI_UNIT_ASSERT ( recv_val[0][0] == static_cast<unsigned int> (4) );
1079 TIMPI_UNIT_ASSERT ( recv_val[2][0] == static_cast<unsigned int> (
TestCommWorld->
rank()) );
1080 TIMPI_UNIT_ASSERT ( recv_val[2][1] == procdown );
1101 std::vector<std::vector<unsigned int> > src_val(3), recv_val;
1103 src_val[0].push_back(4);
1104 src_val[2].push_back(procup);
1116 TIMPI_UNIT_ASSERT ( src_val.size() == recv_val.size() );
1118 for (std::size_t i = 0; i != 3; ++i)
1119 TIMPI_UNIT_ASSERT ( src_val[i].size() == recv_val[i].size() );
1121 TIMPI_UNIT_ASSERT ( recv_val[0][0] == static_cast<unsigned int> (4) );
1122 TIMPI_UNIT_ASSERT ( recv_val[2][0] == static_cast<unsigned int> (
TestCommWorld->
rank()) );
1123 TIMPI_UNIT_ASSERT ( recv_val[2][1] == procdown );
1133 double inf = std::numeric_limits<double>::infinity();
1139 inf = -std::numeric_limits<double>::infinity();
1147 const std::string s =
"Violin";
1157 const std::vector<int> v = {1, 2, 3};
1165 template<
typename T>
1180 unsigned int color = rank % 2;
1183 TIMPI_UNIT_ASSERT(subcomm.
size() >= 1);
1195 #ifdef TIMPI_HAVE_MPI 1196 type = MPI_COMM_TYPE_SHARED;
1201 TIMPI_UNIT_ASSERT(subcomm.
size() >= 1);
1205 template <
typename NonBuiltin>
1215 int main(
int argc,
const char *
const * argv)
1222 testSum<std::map<int,int>>();
1223 testSum<std::unordered_map<int,int>>();
1224 testSumOpFunction<std::pair<int,int>>();
1225 testNonFixedTypeSum<std::map<std::string,int>>();
1226 testNonFixedTypeSum<std::unordered_map<std::string,int>>();
1238 testBroadcast<std::vector<unsigned int>>({0,1,2});
1239 testBroadcast<std::map<int, int>>({{0,0}, {1,1}, {2,2}});
1240 testBroadcast<std::map<int, std::string>>({{0,
"foo"}, {1,
"bar"}, {2,
"baz"}});
1241 testBroadcast<std::unordered_map<int, int>>({{0,0}, {1,1}, {2,2}});
1242 testBroadcast<std::unordered_map<int, std::string>>({{0,
"foo"}, {1,
"bar"}, {2,
"baz"}});
1253 testMinLarge<char>();
1254 testMinLarge<unsigned char>();
1255 testMinLarge<short>();
1256 testMinLarge<unsigned short>();
1257 testMinLarge<int>();
1258 testMinLarge<unsigned int>();
1259 testMinLarge<long>();
1260 testMinLarge<unsigned long>();
1261 testMinLarge<long long>();
1262 testMinLarge<unsigned long long>();
1263 testMinLarge<float>();
1264 testMinLarge<double>();
1265 testMinLarge<long double>();
1266 testMapMax<std::map<int, int>>();
1267 testMapMax<std::unordered_map<int, int>>();
1268 testNonFixedTypeMapMax<std::map<std::string,int>>();
1269 testNonFixedTypeMapMax<std::unordered_map<std::string,int>>();
1288 testSemiVerifyType<bool>();
1289 testSemiVerifyType<char>();
1290 testSemiVerifyType<unsigned char>();
1291 testSemiVerifyType<short>();
1292 testSemiVerifyType<unsigned short>();
1293 testSemiVerifyType<int>();
1294 testSemiVerifyType<unsigned int>();
1295 testSemiVerifyType<long>();
1296 testSemiVerifyType<unsigned long>();
1297 testSemiVerifyType<long long>();
1298 testSemiVerifyType<unsigned long long>();
1299 testSemiVerifyType<float>();
1300 testSemiVerifyType<double>();
1301 testSemiVerifyType<long double>();
1310 testStandardTypeAssignment<TIMPI_DEFAULT_SCALAR_TYPE>();
1311 testStandardTypeAssignment<std::pair<unsigned, unsigned>>();
1312 testStandardTypeAssignment<std::array<unsigned, 1>>();
1313 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 testNonblockingString()
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()
const unsigned int any_source
Processor id meaning "Accept from any source".
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()