Ticket #1998: main.cpp

File main.cpp, 3.4 KB (added by MIchele De Stefano <micdestefano@…>, 14 years ago)

Small test program for the bug

Line 
1#include <boost/lambda/lambda.hpp>
2#include <boost/lambda/casts.hpp>
3#include <boost/serialization/split_member.hpp>
4#include <algorithm>
5#include <stdexcept>
6#include <boost/mpi.hpp>
7#include <iterator>
8#include <fstream>
9
10template<typename T>
11class Mtx_Wrap {
12
13 size_t Ndims; ///< Total number of dimensions
14 size_t *dimbuf; ///< Buffer of dimensions, from the fastest to the slowest one
15
16 size_t Nel; ///< Total number of elements into the data buffer
17 T *data; ///< Buffer of data
18
19 bool data_owned; ///< TRUE only if the object owns its data
20
21 template<class InIt>
22 void set_dimensions(InIt dimB,InIt dimE) {
23
24 using namespace boost::lambda;
25
26 Ndims = static_cast<size_t>(std::distance(dimB,dimE));
27 delete []dimbuf; dimbuf = NULL;
28 if (Ndims>0) {
29 dimbuf = new size_t[Ndims];
30 std::transform(dimB,dimE,dimbuf,ll_static_cast<size_t>(_1));
31
32 Nel = std::accumulate(dimbuf,dimbuf+Ndims,1,std::multiplies<size_t>());
33 } else {
34 Nel = 0;
35 }
36 }
37
38
39 template<class InIt>
40 void copy_data(InIt dB,InIt dE) {
41
42 using namespace boost::lambda;
43
44 if (Nel != static_cast<size_t>(std::distance(dB,dE))) {
45 throw std::runtime_error("Wrong number of data");
46 }
47 delete []data; data = NULL;
48
49 if (Nel>0) {
50 data_owned = true;
51 data = new T[Nel];
52 std::transform(dB,dE,data,ll_static_cast<T>(_1));
53 }
54 }
55
56 // Split serialization into save/load
57 template<class Archive>
58 void save(Archive & ar,const unsigned int version) const {
59
60 ar << Ndims;
61 ar.save_binary(dimbuf,Ndims*sizeof(size_t));
62 ar << Nel;
63 ar.save_binary(data,Nel*sizeof(size_t));
64 }
65
66 template<class Archive>
67 void load(Archive & ar, const unsigned int version) {
68
69 if (data_owned) {
70 delete []data;
71 data = NULL;
72 }
73 delete []dimbuf;
74 dimbuf = NULL;
75
76 ar >> Ndims;
77 dimbuf = new size_t[Ndims];
78 ar.load_binary(dimbuf,Ndims*sizeof(size_t));
79 ar >> Nel;
80 data_owned = true;
81 data = new T[Nel];
82 ar.load_binary(data,Nel*sizeof(size_t));
83 }
84
85 BOOST_SERIALIZATION_SPLIT_MEMBER()
86
87 template<typename Taux> friend class Mtx_Wrap_RW;
88 friend class boost::serialization::access;
89
90public:
91
92 Mtx_Wrap() : Ndims(0),dimbuf(NULL),Nel(0),data(NULL),data_owned(false) {}
93
94 Mtx_Wrap(const Mtx_Wrap &rhs) : Ndims(0),dimbuf(NULL),Nel(0),data(NULL),data_owned(false) {
95
96 set_dimensions(rhs.dimbuf,rhs.dimbuf+rhs.Ndims);
97
98 copy_data(rhs.data,rhs.data + rhs.Nel);
99 }
100
101 ~Mtx_Wrap() {
102 if (data_owned) {
103 delete []data;
104 data = NULL;
105 }
106 delete []dimbuf;
107 dimbuf = NULL;
108 }
109
110
111 Mtx_Wrap & operator =(const Mtx_Wrap &rhs) {
112
113 if (&rhs == this) return *this;
114
115 set_dimensions(rhs.dimbuf,rhs.dimbuf+rhs.Ndims);
116
117 copy_data(rhs.data,rhs.data + Nel);
118
119 return *this;
120 }
121
122 template<class InItDim,class InItData>
123 void set_data(InItDim dimB,InItDim dimE,InItData dB,InItData dE) {
124
125 set_dimensions(dimB,dimE);
126
127 if (data_owned) {
128 delete []data; data = NULL;
129 }
130
131 copy_data(dB,dE);
132 }
133
134};
135
136namespace mpi = boost::mpi;
137using namespace std;
138
139int main(int argc, char* argv[]) {
140
141 mpi::environment env(argc, argv);
142 mpi::communicator world;
143
144 int rank = world.rank();
145
146 Mtx_Wrap<float> mtx;
147
148 if (rank == 0) {
149
150 float data[] = {1.1,2.2,3.3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
151 size_t dims[] = {1,21};
152
153/* float data[] = {1.1,2.2,3.3};
154 size_t dims[] = {1,3};*/
155
156 size_t Ndims = sizeof(dims)/sizeof(*dims);
157 size_t Ndata = sizeof(data)/sizeof(*data);
158
159 mtx.set_data(dims,dims+Ndims,data,data+Ndata);
160 }
161
162 mpi::broadcast(world,mtx,0);
163
164 return 0;
165}