00001
00009 #ifndef ONE_TIME_MULTICAST_STRATEGY
00010 #define ONE_TIME_MULTICAST_STRATEGY
00011
00012 #include "ComlibManager.h"
00013 #include "ComlibSectionInfo.h"
00014
00040 class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
00041 private:
00042
00043 ComlibSectionInfo sinfo;
00044
00045 void remoteMulticast(ComlibMulticastMsg * multMsg, bool rootPE);
00046 void localMulticast(CharmMessageHolder *cmsg);
00047
00048 public:
00049
00063 virtual void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE , int * &pelist, int &npes);
00064
00065 OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
00066
00067 OneTimeMulticastStrategy();
00068 ~OneTimeMulticastStrategy();
00069
00070 void insertMessage(MessageHolder *msg) {insertMessage((CharmMessageHolder*)msg);}
00071 void insertMessage(CharmMessageHolder *msg);
00072
00074 void handleMessage(void *msg);
00075
00076 void pup(PUP::er &p);
00077
00078 PUPable_decl(OneTimeMulticastStrategy);
00079
00080 };
00081
00082
00083
00084
00085
00089 class OneTimeRingMulticastStrategy: public OneTimeMulticastStrategy {
00090
00091 public:
00092 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE , int * &pelist, int &npes);
00093
00094 OneTimeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00095 OneTimeRingMulticastStrategy(): OneTimeMulticastStrategy() {}
00096 ~OneTimeRingMulticastStrategy() {}
00097
00098 void pup(PUP::er &p){ OneTimeMulticastStrategy::pup(p); }
00099
00100 PUPable_decl(OneTimeRingMulticastStrategy);
00101
00102 };
00103
00104
00105
00109 class OneTimeTreeMulticastStrategy: public OneTimeMulticastStrategy {
00110 private:
00111 int degree;
00112
00113 public:
00114
00115 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
00116
00117 OneTimeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00118
00120 OneTimeTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
00121
00122 ~OneTimeTreeMulticastStrategy() {}
00123
00124 void pup(PUP::er &p){
00125 OneTimeMulticastStrategy::pup(p);
00126 p | degree;
00127 }
00128
00129 PUPable_decl(OneTimeTreeMulticastStrategy);
00130 };
00131
00132
00133
00139 class OneTimeTopoTreeMulticastStrategy: public OneTimeMulticastStrategy
00140 {
00141 private:
00142 int degree;
00143
00144 public:
00145 OneTimeTopoTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00147 OneTimeTopoTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) { }
00148 ~OneTimeTopoTreeMulticastStrategy() {}
00150 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
00151 void pup(PUP::er &p)
00152 {
00153 OneTimeMulticastStrategy::pup(p);
00154 p | degree;
00155 }
00156 PUPable_decl(OneTimeTopoTreeMulticastStrategy);
00157 };
00158
00159
00160
00164 class OneTimeDimensionOrderedMulticastStrategy: public OneTimeMulticastStrategy {
00165 public:
00166
00167 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
00168
00169 OneTimeDimensionOrderedMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00170
00172 OneTimeDimensionOrderedMulticastStrategy(): OneTimeMulticastStrategy() {}
00173
00174 ~OneTimeDimensionOrderedMulticastStrategy() {}
00175
00176 void pup(PUP::er &p){
00177 OneTimeMulticastStrategy::pup(p);
00178 }
00179
00180 PUPable_decl(OneTimeDimensionOrderedMulticastStrategy);
00181 private:
00182 int findMinMaxArray(int min, int len, int *array, bool* notincluded, int notIndex);
00183 };
00184
00185
00186
00187
00191 class OneTimeNodeTreeMulticastStrategy: public OneTimeMulticastStrategy {
00192 private:
00193 int degree;
00194
00195 public:
00196
00197 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
00198
00199 OneTimeNodeTreeMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00200
00202 OneTimeNodeTreeMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
00203
00204 ~OneTimeNodeTreeMulticastStrategy() {}
00205
00206 void pup(PUP::er &p){
00207 OneTimeMulticastStrategy::pup(p);
00208 p | degree;
00209 }
00210
00211 PUPable_decl(OneTimeNodeTreeMulticastStrategy);
00212 };
00213
00214
00215
00219 class OneTimeNodeTreeRingMulticastStrategy: public OneTimeMulticastStrategy {
00220 private:
00221 int degree;
00222
00223 public:
00224
00225 void determineNextHopPEs(const int totalDestPEs, const ComlibMulticastIndexCount* destPEs, const int myIndex, const int rootPE, int * &pelist, int &npes);
00226
00227 OneTimeNodeTreeRingMulticastStrategy(CkMigrateMessage *m): OneTimeMulticastStrategy(m) {}
00228
00230 OneTimeNodeTreeRingMulticastStrategy(int treeDegree=4): OneTimeMulticastStrategy(), degree(treeDegree) {}
00231
00232 ~OneTimeNodeTreeRingMulticastStrategy() {}
00233
00234 void pup(PUP::er &p){
00235 OneTimeMulticastStrategy::pup(p);
00236 p | degree;
00237 }
00238
00239 PUPable_decl(OneTimeNodeTreeRingMulticastStrategy);
00240 };
00241
00242 #endif
00243