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 GrpReduce() {}
00049 virtual ~GrpReduce() {};
00050 virtual void reduce(T*target, T*data, int n) = 0;
00051 };
00052
00053 template <class T>
00054 class GrpSumReduce: public GrpReduce<T> {
00055 public:
00056 GrpSumReduce() : GrpReduce<T>() {}
00057 ~GrpSumReduce() {};
00058 void reduce(T*target, T*data, int nelement);
00059 };
00060
00061 template <class T>
00062 class GrpMinReduce: public GrpReduce<T> {
00063 public:
00064 GrpMinReduce() : GrpReduce<T>() {}
00065 ~GrpMinReduce() {};
00066 void reduce(T*target, T*data, int nelement);
00067 };
00068
00069 template <class T>
00070 class GrpMaxReduce: public GrpReduce<T> {
00071 public:
00072 GrpMaxReduce() : GrpReduce<T>() {}
00073 ~GrpMaxReduce() {};
00074 void reduce(T*target, T*data, int nelement);
00075 };
00076
00077 template <class T>
00078 class GrpArithmeticAndReduce: public GrpReduce<T> {
00079 public:
00080 void reduce(T*target, T*data, int nelement);
00081 };
00082
00083 template <class T>
00084 class GrpArithmeticOrReduce: public GrpReduce<T> {
00085 public:
00086 void reduce(T*target, T*data, int nelement);
00087 };
00088
00089 template <class T>
00090 class GrpArithmeticXOrReduce: public GrpReduce<T> {
00091 public:
00092 void reduce(T*target, T*data, int nelement);
00093 };
00094
00095 template <class T>
00096 class GrpProductReduce: public GrpReduce<T> {
00097 public:
00098 void reduce(T*target, T*data, int nelement);
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 };
00109
00113 class MessageGrp: public DescribedClass {
00114 public:
00115 class MessageInfo {
00116 friend class MessageGrp;
00117 private:
00118 int sender_;
00119 int type_;
00120 int nbyte_;
00121 public:
00122 int sender() const { return sender_; }
00123 int type() const { return type_; }
00124 int nbyte() const { return nbyte_; }
00125 };
00126 enum { AnyType = -1 };
00127 enum { AnySender = -1 };
00128 class MessageHandle {
00129 friend class MessageGrp;
00130 private:
00131 void *id_;
00132 public:
00133 MessageHandle(): id_(0) {}
00134 MessageHandle(const MessageHandle &h): id_(h.id_) {}
00135 };
00136 private:
00137
00138 int me_;
00139 int n_;
00140 int nclass_;
00141 int gop_max_;
00142 std::map<ClassDescP,int> classdesc_to_index_;
00143 ClassDescP *index_to_classdesc_;
00144 protected:
00151 void initialize(int me, int n);
00152
00153 Ref<MachineTopology> topology_;
00154
00155 int debug_;
00156
00157 void set_sender(MessageInfo *info,int sender) {
00158 if (info) info->sender_ = sender;
00159 }
00160 void set_type(MessageInfo *info,int type) {
00161 if (info) info->type_ = type;
00162 }
00163 void set_nbyte(MessageInfo *info,int nbyte) {
00164 if (info) info->nbyte_ = nbyte;
00165 }
00166
00167 void set_id(MessageHandle *handle,void *id) {
00168 handle->id_ = id;
00169 }
00170 void *get_id(const MessageHandle *handle) {
00171 return handle->id_;
00172 }
00173 public:
00174
00175 MessageGrp();
00176 MessageGrp(const Ref<KeyVal>&);
00177 virtual ~MessageGrp();
00178
00180 int n() { return n_; }
00182 int me() { return me_; }
00183
00186 virtual Ref<MessageGrp> clone(void)=0;
00187
00190 static void set_default_messagegrp(const Ref<MessageGrp>&);
00192 static MessageGrp* get_default_messagegrp();
00193
00200 static MessageGrp* initial_messagegrp(int &argc, char** &argv);
00201
00209 virtual void send(int target, const double* data, int ndata);
00210 virtual void send(int target, const unsigned int* data, int ndata);
00211 virtual void send(int target, const int* data, int ndata);
00212 virtual void send(int target, const char* data, int nbyte);
00213 virtual void send(int target, const unsigned char* data, int nbyte);
00214 virtual void send(int target, const signed char* data, int nbyte);
00215 virtual void send(int target, const short* data, int ndata);
00216 virtual void send(int target, const long* data, int ndata);
00217 virtual void send(int target, const float* data, int ndata);
00219 void send(int target, double data) { send(target,&data,1); }
00221 void send(int target, int data) { send(target,&data,1); }
00222 virtual void raw_send(int target, const void* data, int nbyte) = 0;
00224
00233 virtual void sendt(int target, int type, const double* data, int ndata,
00234 bool rcvrdy=false);
00235 virtual void sendt(int target, int type, const unsigned int* data, int ndata,
00236 bool rcvrdy=false);
00237 virtual void sendt(int target, int type, const int* data, int ndata,
00238 bool rcvrdy=false);
00239 virtual void sendt(int target, int type, const char* data, int nbyte,
00240 bool rcvrdy=false);
00241 virtual void sendt(int target, int type, const unsigned char* data, int nbyte,
00242 bool rcvrdy=false);
00243 virtual void sendt(int target, int type, const signed char* data, int nbyte,
00244 bool rcvrdy=false);
00245 virtual void sendt(int target, int type, const short* data, int ndata,
00246 bool rcvrdy=false);
00247 virtual void sendt(int target, int type, const long* data, int ndata,
00248 bool rcvrdy=false);
00249 virtual void sendt(int target, int type, const float* data, int ndata,
00250 bool rcvrdy=false);
00252 void sendt(int target, int type, double data,
00253 bool rcvrdy=false) {sendt(target,type,&data,1,rcvrdy);}
00255 void sendt(int target, int type, int data,
00256 bool rcvrdy=false) {sendt(target,type,&data,1,rcvrdy);}
00257 virtual void raw_sendt(int target, int type, const void* data, int nbyte,
00258 bool rcvrdy=false) = 0;
00260
00267 virtual void recv(int sender, double* data, int ndata);
00268 virtual void recv(int sender, unsigned int* data, int ndata);
00269 virtual void recv(int sender, int* data, int ndata);
00270 virtual void recv(int sender, char* data, int nbyte);
00271 virtual void recv(int sender, unsigned char* data, int nbyte);
00272 virtual void recv(int sender, signed char* data, int nbyte);
00273 virtual void recv(int sender, short* data, int ndata);
00274 virtual void recv(int sender, long* data, int ndata);
00275 virtual void recv(int sender, float* data, int ndata);
00277 void recv(int sender, double& data) { recv(sender,&data,1); }
00279 void recv(int sender, int& data) { recv(sender,&data,1); }
00280 virtual void raw_recv(int sender, void* data, int nbyte,
00281 MessageInfo *info=0) = 0;
00283
00291 virtual void recvt(int sender, int type, double* data, int ndata);
00292 virtual void recvt(int sender, int type, unsigned int* data, int ndata);
00293 virtual void recvt(int sender, int type, int* data, int ndata);
00294 virtual void recvt(int sender, int type, char* data, int nbyte);
00295 virtual void recvt(int sender, int type, unsigned char* data, int nbyte);
00296 virtual void recvt(int sender, int type, signed char* data, int nbyte);
00297 virtual void recvt(int sender, int type, short* data, int ndata);
00298 virtual void recvt(int sender, int type, long* data, int ndata);
00299 virtual void recvt(int sender, int type, float* data, int ndata);
00301 void recvt(int sender, int type, double& data) {
00302 recvt(sender,type,&data,1);
00303 }
00305 void recvt(int sender, int type, int& data) {
00306 recvt(sender,type,&data,1);
00307 }
00308 virtual void raw_recvt(int sender, int type, void* data, int nbyte,
00309 MessageInfo *info=0) = 0;
00311
00329 virtual void nb_sendt(int target, int type,
00330 const double* data, int ndata,
00331 MessageHandle&handle,
00332 bool rcvrdy=false);
00333 virtual void nb_sendt(int target, int type,
00334 const unsigned int* data, int ndata,
00335 MessageHandle&handle,
00336 bool rcvrdy=false);
00337 virtual void nb_sendt(int target, int type,
00338 const int* data, int ndata,
00339 MessageHandle&handle,
00340 bool rcvrdy=false);
00341 virtual void nb_sendt(int target, int type,
00342 const char* data, int nbyte,
00343 MessageHandle&handle,
00344 bool rcvrdy=false);
00345 virtual void nb_sendt(int target, int type,
00346 const unsigned char* data, int nbyte,
00347 MessageHandle&handle,
00348 bool rcvrdy=false);
00349 virtual void nb_sendt(int target, int type,
00350 const signed char* data, int nbyte,
00351 MessageHandle&handle,
00352 bool rcvrdy=false);
00353 virtual void nb_sendt(int target, int type,
00354 const short* data, int ndata,
00355 MessageHandle&handle,
00356 bool rcvrdy=false);
00357 virtual void nb_sendt(int target, int type,
00358 const long* data, int ndata,
00359 MessageHandle&handle,
00360 bool rcvrdy=false);
00361 virtual void nb_sendt(int target, int type,
00362 const float* data, int ndata,
00363 MessageHandle&handle,
00364 bool rcvrdy=false);
00365 void nb_sendt(int target, int type, double data,
00366 MessageHandle&handle,
00367 bool rcvrdy=false) {
00368 nb_sendt(target,type,&data,1,handle,rcvrdy);
00369 }
00370 void nb_sendt(int target, int type, int data,
00371 MessageHandle&handle,
00372 bool rcvrdy=false) {
00373 nb_sendt(target,type,&data,1,handle,rcvrdy);
00374 }
00375 virtual void raw_nb_sendt(int target, int type,
00376 const void* data, int nbyte,
00377 MessageHandle&,
00378 bool rcvrdy=false) = 0;
00380
00396 virtual void nb_recvt(int sender, int type, double* data, int ndata,
00397 MessageHandle&handle);
00398 virtual void nb_recvt(int sender, int type, unsigned int* data, int ndata,
00399 MessageHandle&handle);
00400 virtual void nb_recvt(int sender, int type, int* data, int ndata,
00401 MessageHandle&handle);
00402 virtual void nb_recvt(int sender, int type, char* data, int nbyte,
00403 MessageHandle&handle);
00404 virtual void nb_recvt(int sender, int type, unsigned char* data, int nbyte,
00405 MessageHandle&handle);
00406 virtual void nb_recvt(int sender, int type, signed char* data, int nbyte,
00407 MessageHandle&handle);
00408 virtual void nb_recvt(int sender, int type, short* data, int ndata,
00409 MessageHandle&handle);
00410 virtual void nb_recvt(int sender, int type, long* data, int ndata,
00411 MessageHandle&handle);
00412 virtual void nb_recvt(int sender, int type, float* data, int ndata,
00413 MessageHandle&handle);
00415 void nb_recvt(int sender, int type, double& data,
00416 MessageHandle&handle) {
00417 nb_recvt(sender,type,&data,1,handle);
00418 }
00420 void nb_recvt(int sender, int type, int& data,
00421 MessageHandle&handle) {
00422 nb_recvt(sender,type,&data,1,handle);
00423 }
00424 virtual void raw_nb_recvt(int sender, int type,
00425 void* data, int nbyte,
00426 MessageHandle&) = 0;
00428
00434 virtual void wait(const MessageHandle&handle,
00435 MessageInfo *info=0) = 0;
00436
00438 virtual int probet(int sender, int type, MessageInfo*info=0) = 0;
00439
00443 virtual void bcast(double* data, int ndata, int from = 0);
00444 virtual void bcast(unsigned int* data, int ndata, int from = 0);
00445 virtual void bcast(int* data, int ndata, int from = 0);
00446 virtual void bcast(char* data, int nbyte, int from = 0);
00447 virtual void bcast(unsigned char* data, int nbyte, int from = 0);
00448 virtual void bcast(signed char* data, int nbyte, int from = 0);
00449 virtual void bcast(short* data, int ndata, int from = 0);
00450 virtual void bcast(long* data, int ndata, int from = 0);
00451 virtual void bcast(float* data, int ndata, int from = 0);
00452 virtual void raw_bcast(void* data, int nbyte, int from = 0);
00453 void bcast(double& data, int from = 0) { bcast(&data, 1, from); }
00454 void bcast(int& data, int from = 0) { bcast(&data, 1, from); }
00456
00461 virtual void raw_collect(const void *part, const int *lengths,
00462 void *whole, int bytes_per_datum=1);
00463 void collect(const double *part, const int *lengths, double *whole);
00465
00468 virtual void sum(double* data, int n, double* = 0, int target = -1);
00469 virtual void sum(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00470 virtual void sum(int* data, int n, int* = 0, int target = -1);
00471 virtual void sum(long* data, int n, long* = 0, int target = -1);
00472 virtual void sum(char* data, int n, char* = 0, int target = -1);
00473 virtual void sum(unsigned char* data, int n,
00474 unsigned char* = 0, int target = -1);
00475 virtual void sum(signed char* data, int n,
00476 signed char* = 0, int target = -1);
00477 void sum(double& data) { sum(&data, 1); }
00478 void sum(int& data) { sum(&data, 1); }
00480
00483 virtual void max(double* data, int n, double* = 0, int target = -1);
00484 virtual void max(int* data, int n, int* = 0, int target = -1);
00485 virtual void max(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00486 virtual void max(char* data, int n, char* = 0, int target = -1);
00487 virtual void max(unsigned char* data, int n,
00488 unsigned char* = 0, int target = -1);
00489 virtual void max(signed char* data, int n,
00490 signed char* = 0, int target = -1);
00491 void max(double& data) { max(&data, 1); }
00492 void max(int& data) { max(&data, 1); }
00494
00497 virtual void min(double* data, int n, double* = 0, int target = -1);
00498 virtual void min(int* data, int n, int* = 0, int target = -1);
00499 virtual void min(unsigned int* data, int n, unsigned int* = 0, int target = -1);
00500 virtual void min(char* data, int n, char* = 0, int target = -1);
00501 virtual void min(unsigned char* data, int n,
00502 unsigned char* = 0, int target = -1);
00503 virtual void min(signed char* data, int n,
00504 signed char* = 0, int target = -1);
00505 void min(double& data) { min(&data, 1); }
00506 void min(int& data) { min(&data, 1); }
00508
00511 virtual void reduce(double*, int n, GrpReduce<double>&,
00512 double*scratch = 0, int target = -1);
00513 virtual void reduce(int*, int n, GrpReduce<int>&,
00514 int*scratch = 0, int target = -1);
00515 virtual void reduce(unsigned int*, int n, GrpReduce<unsigned int>&,
00516 unsigned int*scratch = 0, int target = -1);
00517 virtual void reduce(char*, int n, GrpReduce<char>&,
00518 char*scratch = 0, int target = -1);
00519 virtual void reduce(unsigned char*, int n, GrpReduce<unsigned char>&,
00520 unsigned char*scratch = 0, int target = -1);
00521 virtual void reduce(signed char*, int n, GrpReduce<signed char>&,
00522 signed char*scratch = 0, int target = -1);
00523 virtual void reduce(short*, int n, GrpReduce<short>&,
00524 short*scratch = 0, int target = -1);
00525 virtual void reduce(float*, int n, GrpReduce<float>&,
00526 float*scratch = 0, int target = -1);
00527 virtual void reduce(long*, int n, GrpReduce<long>&,
00528 long*scratch = 0, int target = -1);
00529 void reduce(double& data, GrpReduce<double>& r) { reduce(&data, 1, r); }
00530 void reduce(int& data, GrpReduce<int>& r) { reduce(&data, 1, r); }
00532
00534 virtual void sync();
00535
00537 Ref<MachineTopology> topology() { return topology_; }
00538
00546 int classdesc_to_index(const ClassDesc*);
00547 const ClassDesc* index_to_classdesc(int);
00548 int nclass() const { return nclass_; }
00550 };
00551
00552 struct message_struct {
00553 void *buf;
00554 int size;
00555 int type;
00556 struct message_struct *p;
00557 };
00558 typedef struct message_struct message_t;
00559
00560
00563 class ProcMessageGrp: public MessageGrp {
00564 private:
00565
00566 message_t *sync_messages;
00567 message_t *type_messages;
00568
00569 void sendit(message_t *& messages, int dest, int msgtype, const void* buf, int bytes);
00570 void recvit(message_t *& messages, int source, int type, void* buf, int bytes,
00571 int& last_size, int& last_type);
00572
00573 public:
00574 ProcMessageGrp();
00575 ProcMessageGrp(const Ref<KeyVal>&);
00576 ~ProcMessageGrp();
00577
00578 Ref<MessageGrp> clone(void);
00579
00580 void raw_send(int target, const void* data, int nbyte);
00581 void raw_sendt(int target, int type, const void* data, int nbyte,
00582 bool rcvrdy=false);
00583 void raw_recv(int sender, void* data, int nbyte,
00584 MessageInfo *info=0);
00585 void raw_recvt(int sender, int type, void* data, int nbyte,
00586 MessageInfo *info=0);
00587 void raw_bcast(void* data, int nbyte, int from);
00588
00589 void raw_nb_sendt(int sender, int type,
00590 const void* data, int nbyte,
00591 MessageHandle&,
00592 bool rcvrdy=false);
00593 void raw_nb_recvt(int sender, int type,
00594 void* data, int nbyte,
00595 MessageHandle&);
00596 void wait(const MessageHandle&,
00597 MessageInfo *info=0);
00598
00599 int probet(int sender, int type, MessageInfo *info=0);
00600 void sync();
00601 };
00602
00603 }
00604
00605 #include <util/group/messaget.h>
00606
00607 #endif
00608
00609
00610
00611
00612
00613