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()