Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

message.h

00001 //
00002 // message.h
00003 //
00004 // Copyright (C) 1996 Limit Point Systems, Inc.
00005 //
00006 // Author: Curtis Janssen <cljanss@limitpt.com>
00007 // Maintainer: LPS
00008 //
00009 // This file is part of the SC Toolkit.
00010 //
00011 // The SC Toolkit is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Library General Public License as published by
00013 // the Free Software Foundation; either version 2, or (at your option)
00014 // any later version.
00015 //
00016 // The SC Toolkit is distributed in the hope that it will be useful,
00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 // GNU Library General Public License for more details.
00020 //
00021 // You should have received a copy of the GNU Library General Public License
00022 // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
00024 //
00025 // The U.S. Government is granted a limited license as per AL 91-7.
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() {}; // Fix g++-4.0 breackage
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() {}; // Fix g++-4.0 breakage
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() {}; // Fix g++-4.0 breackage
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() {}; // Fix g++-4.0 breackage
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     // These are initialized by the initialize() member (see below).
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     // Messages are stored in these linked lists
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; // the total number of bits available
00363     int ctl_nbit; // control information bits
00364     int seq_nbit; // sequence information bits
00365     int typ_nbit; // type information bits
00366     int src_nbit; // source information bits
00367 
00368     // Masks for the fields in the type.
00369     int ctl_mask;
00370     int seq_mask;
00371     int typ_mask;
00372     int src_mask;
00373 
00374     // Shifts to construct a message type.
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     // The next sequence number for each node is stored in these.
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 // Local Variables:
00420 // mode: c++
00421 // c-file-style: "CLJ"
00422 // End:

Generated at Tue Jun 14 10:27:57 2005 for MPQC 2.2.3 using the documentation package Doxygen 1.4.3-20050530.