00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_group_message_h
00033 #define _util_group_message_h
00034
00035 #include <map>
00036
00037 #include <math.h>
00038 #include <util/class/class.h>
00039 #include <util/state/state.h>
00040 #include <util/keyval/keyval.h>
00041 #include <util/group/topology.h>
00042
00043 namespace sc {
00044
00045 template <class T>
00046 class GrpReduce {
00047 public:
00048 virtual ~GrpReduce() {};
00049 virtual void reduce(T*target, T*data, int n) = 0;
00050 };
00051
00052 template <class T>
00053 class GrpSumReduce: public GrpReduce<T> {
00054 public:
00055 void reduce(T*target, T*data, int nelement);
00056 ~GrpSumReduce() {};
00057 };
00058
00059 template <class T>
00060 class GrpMinReduce: public GrpReduce<T> {
00061 public:
00062 void reduce(T*target, T*data, int nelement);
00063 ~GrpMinReduce() {};
00064 };
00065
00066 template <class T>
00067 class GrpMaxReduce: public GrpReduce<T> {
00068 public:
00069 void reduce(T*target, T*data, int nelement);
00070 ~GrpMaxReduce() {};
00071 };
00072
00073 template <class T>
00074 class GrpArithmeticAndReduce: public GrpReduce<T> {
00075 public:
00076 void reduce(T*target, T*data, int nelement);
00077 ~GrpArithmeticAndReduce() {};
00078 };
00079
00080 template <class T>
00081 class GrpArithmeticOrReduce: public GrpReduce<T> {
00082 public:
00083 void reduce(T*target, T*data, int nelement);
00084 ~GrpArithmeticOrReduce() {};
00085 };
00086
00087 template <class T>
00088 class GrpArithmeticXOrReduce: public GrpReduce<T> {
00089 public:
00090 void reduce(T*target, T*data, int nelement);
00091 ~GrpArithmeticXOrReduce() {};
00092 };
00093
00094 template <class T>
00095 class GrpProductReduce: public GrpReduce<T> {
00096 public:
00097 void reduce(T*target, T*data, int nelement);
00098 ~GrpProductReduce() {};
00099 };
00100
00101 template <class T>
00102 class GrpFunctionReduce: public GrpReduce<T> {
00103 private:
00104 void (*func_)(T*target,T*data,int nelement);
00105 public:
00106 GrpFunctionReduce(void(*func)(T*,T*,int)):func_(func) {}
00107 void reduce(T*target, T*data, int nelement);
00108 ~GrpFunctionReduce() {};
00109 };
00110
00114 class MessageGrp: public DescribedClass {
00115 private:
00116
00117 int me_;
00118 int n_;
00119 int nclass_;
00120 int gop_max_;
00121 std::map<ClassDescP,int> classdesc_to_index_;
00122 ClassDescP *index_to_classdesc_;
00123 protected:
00130 void initialize(int me, int n);
00131
00132 Ref<MachineTopology> topology_;
00133
00134 int debug_;
00135 public:
00136 MessageGrp();
00137 MessageGrp(const Ref<KeyVal>&);
00138 virtual ~MessageGrp();
00139
00141 int n() { return n_; }
00143 int me() { return me_; }
00144
00147 virtual Ref<MessageGrp> clone(void)=0;
00148
00151 static void set_default_messagegrp(const Ref<MessageGrp>&);
00153 static MessageGrp* get_default_messagegrp();
00154
00161 static MessageGrp* initial_messagegrp(int &argc, char** &argv);
00162
00165 virtual void send(int target, double* data, int ndata);
00166 virtual void send(int target, unsigned int* data, int ndata);
00167 virtual void send(int target, int* data, int ndata);
00168 virtual void send(int target, char* data, int nbyte);
00169 virtual void send(int target, unsigned char* data, int nbyte);
00170 virtual void send(int target, signed char* data, int nbyte);
00171 virtual void send(int target, short* data, int ndata);
00172 virtual void send(int target, long* data, int ndata);
00173 virtual void send(int target, float* data, int ndata);
00174 void send(int target, double data) { send(target,&data,1); }
00175 void send(int target, int data) { send(target,&data,1); }
00176 virtual void raw_send(int target, void* data, int nbyte) = 0;
00177
00180 virtual void sendt(int target, int type, double* data, int ndata);
00181 virtual void sendt(int target, int type, unsigned int* data, int ndata);
00182 virtual void sendt(int target, int type, int* data, int ndata);
00183 virtual void sendt(int target, int type, char* data, int nbyte);
00184 virtual void sendt(int target, int type, unsigned char* data, int nbyte);
00185 virtual void sendt(int target, int type, signed char* data, int nbyte);
00186 virtual void sendt(int target, int type, short* data, int ndata);
00187 virtual void sendt(int target, int type, long* data, int ndata);
00188 virtual void sendt(int target, int type, float* data, int ndata);
00189 void sendt(int target, int type, double data) {sendt(target,type,&data,1);}
00190 void sendt(int target, int type, int data) {sendt(target,type,&data,1);}
00191 virtual void raw_sendt(int target, int type, void* data, int nbyte) = 0;
00192
00195 virtual void recv(int sender, double* data, int ndata);
00196 virtual void recv(int sender, unsigned int* data, int ndata);
00197 virtual void recv(int sender, int* data, int ndata);
00198 virtual void recv(int sender, char* data, int nbyte);
00199 virtual void recv(int sender, unsigned char* data, int nbyte);
00200 virtual void recv(int sender, signed char* data, int nbyte);
00201 virtual void recv(int sender, short* data, int ndata);
00202 virtual void recv(int sender, long* data, int ndata);
00203 virtual void recv(int sender, float* data, int ndata);
00204 void recv(int sender, double& data) { recv(sender,&data,1); }
00205 void recv(int sender, int& data) { recv(sender,&data,1); }
00206 virtual void raw_recv(int sender, void* data, int nbyte) = 0;
00207
00210 virtual void recvt(int type, double* data, int ndata);
00211 virtual void recvt(int type, unsigned int* data, int ndata);
00212 virtual void recvt(int type, int* data, int ndata);
00213 virtual void recvt(int type, char* data, int nbyte);
00214 virtual void recvt(int type, unsigned char* data, int nbyte);
00215 virtual void recvt(int type, signed char* data, int nbyte);
00216 virtual void recvt(int type, short* data, int ndata);
00217 virtual void recvt(int type, long* data, int ndata);
00218 virtual void recvt(int type, float* data, int ndata);
00219 void recvt(int type, double& data) { recvt(type,&data,1); }
00220 void recvt(int type, int& data) { recvt(type,&data,1); }
00221 virtual void raw_recvt(int type, void* data, int nbyte) = 0;
00222
00224 virtual int probet(int type) = 0;
00225
00228 virtual void bcast(double* data, int ndata, int from = 0);
00229 virtual void bcast(unsigned int* data, int ndata, int from = 0);
00230 virtual void bcast(int* data, int ndata, int from = 0);
00231 virtual void bcast(char* data, int nbyte, int from = 0);
00232 virtual void bcast(unsigned char* data, int nbyte, int from = 0);
00233 virtual void bcast(signed char* data, int nbyte, int from = 0);
00234 virtual void bcast(short* data, int ndata, int from = 0);
00235 virtual void bcast(long* data, int ndata, int from = 0);
00236 virtual void bcast(float* data, int ndata, int from = 0);
00237 virtual void raw_bcast(void* data, int nbyte, int from = 0);
00238 void bcast(double& data, int from = 0) { bcast(&data, 1, from); }
00239 void bcast(int& data, int from = 0) { bcast(&data, 1, from); }
00240
00243 virtual void raw_collect(const void *part, const int *lengths,
00244 void *whole, int bytes_per_datum=1);
00245 void collect(const double *part, const int *lengths, double *whole);
00246
00249 virtual void sum(double* data, int n, double* = 0, int target = -1);
00250 virtual void sum(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00251 virtual void sum(int* data, int n, int* = 0, int target = -1);
00252 virtual void sum(char* data, int n, char* = 0, int target = -1);
00253 virtual void sum(unsigned char* data, int n,
00254 unsigned char* = 0, int target = -1);
00255 virtual void sum(signed char* data, int n,
00256 signed char* = 0, int target = -1);
00257 void sum(double& data) { sum(&data, 1); }
00258 void sum(int& data) { sum(&data, 1); }
00261 virtual void max(double* data, int n, double* = 0, int target = -1);
00262 virtual void max(int* data, int n, int* = 0, int target = -1);
00263 virtual void max(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00264 virtual void max(char* data, int n, char* = 0, int target = -1);
00265 virtual void max(unsigned char* data, int n,
00266 unsigned char* = 0, int target = -1);
00267 virtual void max(signed char* data, int n,
00268 signed char* = 0, int target = -1);
00269 void max(double& data) { max(&data, 1); }
00270 void max(int& data) { max(&data, 1); }
00273 virtual void min(double* data, int n, double* = 0, int target = -1);
00274 virtual void min(int* data, int n, int* = 0, int target = -1);
00275 virtual void min(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00276 virtual void min(char* data, int n, char* = 0, int target = -1);
00277 virtual void min(unsigned char* data, int n,
00278 unsigned char* = 0, int target = -1);
00279 virtual void min(signed char* data, int n,
00280 signed char* = 0, int target = -1);
00281 void min(double& data) { min(&data, 1); }
00282 void min(int& data) { min(&data, 1); }
00285 virtual void reduce(double*, int n, GrpReduce<double>&,
00286 double*scratch = 0, int target = -1);
00287 virtual void reduce(int*, int n, GrpReduce<int>&,
00288 int*scratch = 0, int target = -1);
00289 virtual void reduce(unsigned int*, int n, GrpReduce<unsigned int>&,
00290 unsigned int*scratch = 0, int target = -1);
00291 virtual void reduce(char*, int n, GrpReduce<char>&,
00292 char*scratch = 0, int target = -1);
00293 virtual void reduce(unsigned char*, int n, GrpReduce<unsigned char>&,
00294 unsigned char*scratch = 0, int target = -1);
00295 virtual void reduce(signed char*, int n, GrpReduce<signed char>&,
00296 signed char*scratch = 0, int target = -1);
00297 virtual void reduce(short*, int n, GrpReduce<short>&,
00298 short*scratch = 0, int target = -1);
00299 virtual void reduce(float*, int n, GrpReduce<float>&,
00300 float*scratch = 0, int target = -1);
00301 virtual void reduce(long*, int n, GrpReduce<long>&,
00302 long*scratch = 0, int target = -1);
00303 void reduce(double& data, GrpReduce<double>& r) { reduce(&data, 1, r); }
00304 void reduce(int& data, GrpReduce<int>& r) { reduce(&data, 1, r); }
00305
00307 virtual void sync();
00308
00314 int classdesc_to_index(const ClassDesc*);
00315 const ClassDesc* index_to_classdesc(int);
00316 int nclass() const { return nclass_; }
00317 };
00318
00319 struct message_struct {
00320 void *buf;
00321 int size;
00322 int type;
00323 struct message_struct *p;
00324 };
00325 typedef struct message_struct message_t;
00326
00327
00330 class ProcMessageGrp: public MessageGrp {
00331 private:
00332
00333 message_t *sync_messages;
00334 message_t *type_messages;
00335
00336 void sendit(message_t *& messages, int dest, int msgtype, void* buf, int bytes);
00337 void recvit(message_t *& messages, int source, int type, void* buf, int bytes,
00338 int& last_size, int& last_type);
00339
00340 public:
00341 ProcMessageGrp();
00342 ProcMessageGrp(const Ref<KeyVal>&);
00343 ~ProcMessageGrp();
00344
00345 Ref<MessageGrp> clone(void);
00346
00347 void raw_send(int target, void* data, int nbyte);
00348 void raw_sendt(int target, int type, void* data, int nbyte);
00349 void raw_recv(int sender, void* data, int nbyte);
00350 void raw_recvt(int type, void* data, int nbyte);
00351 void raw_bcast(void* data, int nbyte, int from);
00352 int probet(int type);
00353 void sync();
00354 };
00355
00360 class intMessageGrp: public MessageGrp {
00361 protected:
00362 int msgtype_nbit;
00363 int ctl_nbit;
00364 int seq_nbit;
00365 int typ_nbit;
00366 int src_nbit;
00367
00368
00369 int ctl_mask;
00370 int seq_mask;
00371 int typ_mask;
00372 int src_mask;
00373
00374
00375 int ctl_shift;
00376 int seq_shift;
00377 int typ_shift;
00378 int src_shift;
00379
00380 int msgtype_typ(int msgtype);
00381 int typ_msgtype(int usrtype);
00382 int seq_msgtype(int source, int seq);
00383
00384
00385 int *source_seq;
00386 int *target_seq;
00387
00389 virtual void basic_send(int target, int type, void* data, int nbyte) = 0;
00391 virtual void basic_recv(int type, void* data, int nbyte) = 0;
00393 virtual int basic_probe(int type) = 0;
00394
00395 intMessageGrp();
00396 intMessageGrp(const Ref<KeyVal>&);
00397
00398 void initialize(int me, int n, int nbits);
00399 public:
00400 ~intMessageGrp();
00401
00402 void raw_send(int target, void* data, int nbyte);
00403 void raw_recv(int sender, void* data, int nbyte);
00404 void raw_sendt(int target, int type, void* data, int nbyte);
00405 void raw_recvt(int type, void* data, int nbyte);
00406
00407 int probet(int);
00408
00409 int leftover_ctl_bits();
00410 };
00411
00412 }
00413
00414 #include <util/group/messaget.h>
00415
00416 #endif
00417
00418
00419
00420
00421
00422