COMBINATORIAL_BLAS 1.6
 
Loading...
Searching...
No Matches
basic.cpp
Go to the documentation of this file.
1#include "../Serialize.h"
2#include <sstream>
3#include <mpi.h>
4#include <cassert>
5#include <chrono>
6#include "boost/serialization/vector.hpp"
7#include "boost/serialization/set.hpp"
8#include "boost/archive/binary_iarchive.hpp"
9#include "boost/archive/binary_oarchive.hpp"
10
11#define NUM_SEND 1000000
12
13using namespace std;
14
15template<class T>
16void test_send(const T& t) {
17 stringbuf ss;
18 chrono::time_point<chrono::high_resolution_clock> start = chrono::high_resolution_clock::now();
19 encode(ss, t);
20 chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now();
21 chrono::duration<double> dur = end - start;
22 double rate = ss.str().size() / dur.count() / 1024 / 1024;
23 cout << ss.str().size() << " bytes at " << rate << " MB/s encode" << endl;
24
25 MPI_Send(ss.str().data(), ss.str().size(), MPI_BYTE, 1, 0, MPI_COMM_WORLD);
26}
27
28template<class T>
29void test_send_boost(const T& t) {
30 stringbuf ss;
31 boost::archive::binary_oarchive oa(ss);
32 chrono::time_point<chrono::high_resolution_clock> start = chrono::high_resolution_clock::now();
33 oa << t;
34 chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now();
35 chrono::duration<double> dur = end - start;
36 double rate = ss.str().size() / dur.count() / 1024 / 1024;
37 cout << ss.str().size() << " bytes at " << rate << " MB/s encode (boost)" << endl;
38
39 MPI_Send(ss.str().data(), ss.str().size(), MPI_BYTE, 1, 1, MPI_COMM_WORLD);
40}
41
42template<class T>
43void test_recv(const T& t) {
44 // find out how much data we are recieving
45 MPI_Status status;
46 int count;
47 MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
48 MPI_Get_count(&status, MPI_BYTE, &count);
49
50 // recieve data
51 string s(count, 0);
52 MPI_Recv((void *)s.data(), count, MPI_BYTE, 0, 0, MPI_COMM_WORLD, &status);
53
54 // decode data
55 stringbuf iss(s);
56 T tt;
57
58 chrono::time_point<chrono::high_resolution_clock> start = chrono::high_resolution_clock::now();
59 decode(iss, tt);
60 chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now();
61 chrono::duration<double> dur = end - start;
62 auto rate = count / dur.count() / 1024 / 1024;
63 cout << rate << " MB/s decode" << endl;
64
65 if (t != tt) throw;
66}
67
68template<class T>
69void test_recv_boost(const T& t) {
70 // find out how much data we are recieving
71 MPI_Status status;
72 int count;
73 MPI_Probe(0, 1, MPI_COMM_WORLD, &status);
74 MPI_Get_count(&status, MPI_BYTE, &count);
75
76 // recieve data
77 string s(count, 0);
78 MPI_Recv((void *)s.data(), count, MPI_BYTE, 0, 1, MPI_COMM_WORLD, &status);
79
80 // decode data
81 stringbuf iss(s);
82 boost::archive::binary_iarchive oa(iss);
83 T tt;
84
85 chrono::time_point<chrono::high_resolution_clock> start = chrono::high_resolution_clock::now();
86 oa >> tt;
87 chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now();
88 chrono::duration<double> dur = end - start;
89 auto rate = count / dur.count() / 1024 / 1024;
90 cout << rate << " MB/s decode (boost)" << endl;
91
92 if (t != tt) throw;
93}
94
95int main(int argc, char* argv[])
96{
97 int nprocs, myrank;
98 MPI_Init(&argc, &argv);
99 MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
100 MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
101
102 vector<set<int>> myVector;
103 for(int i = 0; i < NUM_SEND; i++) {
104 myVector.emplace_back(set<int>{i,i,i,i,i,i});
105 }
106
107 if (myrank == 0) {
108 cout << "Testing " << "std::vector<std::set<int>>" << " size: " << myVector.size() << endl;
109 test_send(myVector);
110 test_send_boost(myVector);
111 } else if (myrank == 1) {
112 test_recv(myVector);
113 test_recv_boost(myVector);
114 cout << "Test passed" << endl;
115 }
116 MPI_Finalize();
117}
int main()
Definition Driver.cpp:12
void decode(std::streambuf &os, T *t, size_t size=1)
Definition Serialize.h:26
void encode(std::streambuf &os, T *t, size_t size=1)
Definition Serialize.h:21
void test_recv(const T &t)
Definition basic.cpp:43
void test_send_boost(const T &t)
Definition basic.cpp:29
void test_recv_boost(const T &t)
Definition basic.cpp:69
#define NUM_SEND
Definition basic.cpp:11
void test_send(const T &t)
Definition basic.cpp:16
int nprocs
Definition comms.cpp:55