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