inefficiency fixed
[charm.git] / src / conv-com / pipebroadcastconverse.h
1 #ifndef PIPE_BROADCAST_CONVERSE
2 #define PIPE_BROADCAST_CONVERSE
3 #include "ckhashtable.h"
4 #include "charm++.h"
5 #include "envelope.h"
6 #include "convcomlibstrategy.h"
7 #include "convcomlibmanager.h"
8
9 #define DEFAULT_PIPE   8196
10
11 struct PipeBcastInfo {
12   short bcastPe;     // pe who is doing the broadcast, used for the hash key
13   short seqNumber;
14   int chunkSize;   // it is the size of the data part of the message (without the converse header)
15   int chunkNumber;
16   int messageSize;   // the entire message size, all included
17   short srcPe;       // pe from whom I'm receiving the message
18 };
19
20 class PipeBcastHashKey{
21  public:
22
23     int srcPe;
24     int seq;
25     PipeBcastHashKey(int _pe, int _seq):srcPe(_pe), seq(_seq){};
26
27     //These routines allow PipeBcastHashKey to be used in
28     //  a CkHashtableT
29     CkHashCode hash(void) const;
30     static CkHashCode staticHash(const void *a,size_t);
31     int compare(const PipeBcastHashKey &ind) const;
32     static int staticCompare(const void *a,const void *b,size_t);
33 };
34
35 // sequential numbers must be below 2^16, so the number of processors must
36 inline CkHashCode PipeBcastHashKey::hash(void) const
37 {
38     register int _seq = seq;
39     register int _pe = srcPe;
40     
41     register CkHashCode ret = (_seq << 16) + _pe;
42     return ret;
43 }
44
45 inline int PipeBcastHashKey::compare(const PipeBcastHashKey &k2) const
46 {
47     if(seq == k2.seq && srcPe == k2.srcPe)
48         return 1;
49     
50     return 0;
51 }
52
53 class PipeBcastHashObj{
54  public:
55   char *message;
56   int dimension;
57   int remaining;
58   PipeBcastHashObj (int dim, int rem, char *msg) :dimension(dim),remaining(rem),message(msg) {};
59
60 };
61
62 typedef const UInt  constUInt;
63 typedef void (*setFunction)(char*, constUInt);
64
65 class PipeBroadcastConverse : public Strategy {
66  protected:
67
68   int pipeSize; // this is the size of the splitted messages, including the converse header
69   int topology;
70   //double log_of_2_inv;
71   int seqNumber;
72   CkQ <MessageHolder*> *messageBuf;
73   CkHashtableT<PipeBcastHashKey, PipeBcastHashObj *> fragments;
74   //int propagateHandle;
75   int propagateHandle_frag;
76
77  public:
78   PipeBroadcastConverse(int top=USE_HYPERCUBE, int size=DEFAULT_PIPE, Strategy* st=NULL);
79   PipeBroadcastConverse(CkMigrateMessage *) {};
80   int getPipeSize() { return pipeSize; };
81   void commonInit();
82   void deliverer(char *msg, int dim);
83   void storing(char *msg, int isFrag);
84   void propagate(char *msg, int isFrag, int srcPeNumber, int totalSendingSize, setFunction setPeNumber);
85
86   void conversePipeBcast(char *env, int size);
87   void insertMessage(MessageHolder *msg);
88   void doneInserting();
89
90   virtual void pup(PUP::er &p);
91   PUPable_decl(PipeBroadcastConverse);
92 };
93
94 #endif