00001
00002
00018 #ifndef CONVCOMLIBSTRATEGY_H
00019 #define CONVCOMLIBSTRATEGY_H
00020
00021 #if 0
00022
00023 #ifndef COMLIBSTRATEGY_H
00024 #undef CkpvDeclare
00025 #undef CkpvAccess
00026 #undef CkpvExtern
00027 #undef CkpvInitialize
00028 #undef CkpvInitialized
00029 #define CkpvDeclare CpvDeclare
00030 #define CkpvAccess CpvAccess
00031 #define CkpvExtern CpvExtern
00032 #define CkpvInitialize CpvInitialize
00033 #define CkpvInitialized CpvInitialized
00034 #define CkMyPe CmiMyPe
00035 #define CkNumPes CmiNumPes
00036 #undef CkRegisterHandler
00037 #define CkRegisterHandler(x) CmiRegisterHandler(x)
00038 #endif
00039 #endif
00040
00041
00042
00043
00044 #include "converse.h"
00045 #include "pup.h"
00046 #include "cklists.h"
00047 #include <set>
00048
00049
00050
00051
00052
00053
00054 extern int com_debug;
00055 #ifdef CMK_OPTIMIZE
00056 inline void ComlibPrintf(...) {}
00057 #else
00058 #define ComlibPrintf if(com_debug) CmiPrintf
00059
00060 #endif
00061
00062 #define USE_TREE 1 //Organizes the all to all as a tree
00063 #define USE_MESH 2 //Virtual topology is a mesh here
00064 #define USE_HYPERCUBE 3 //Virtual topology is a hypercube
00065 #define USE_DIRECT 4 //A dummy strategy that directly forwards
00066
00067 #define USE_GRID 5 //Virtual topology is a 3d grid
00068 #define USE_LINEAR 6 //Virtual topology is a linear array
00069 #define USE_PREFIX 7 //Prefix router to avoid contention
00070
00071 #define IS_BROADCAST -1
00072 #define IS_SECTION_MULTICAST -2
00073
00079 typedef int ComlibInstanceHandle;
00080
00081
00087 class MessageHolder : public PUP::able {
00088 public:
00089 char *data;
00090 int size;
00091 int isDummy;
00092
00093
00094
00095
00099 int npes;
00100 union {
00101 int *pelist;
00102 int dest_proc;
00103 };
00104
00105 MessageHolder()
00106 {dest_proc = size = isDummy = 0; data = NULL;}
00107
00108 MessageHolder(CkMigrateMessage *m) {}
00109
00111 inline MessageHolder(char * msg, int sz, int proc) {
00112 data = msg;
00113 size = sz;
00114
00115 npes = 1;
00116 dest_proc = proc;
00117
00118 isDummy = 0;
00119 }
00120
00122 inline MessageHolder(char * msg, int sz) {
00123 data = msg;
00124 size = sz;
00125
00126 npes = 0;
00127 dest_proc = 0;
00128
00129 isDummy = 0;
00130 }
00131
00133 inline MessageHolder(char * msg, int sz, int np, int *pes) {
00134 data = msg;
00135 size = sz;
00136
00137 npes = np;
00138 pelist = pes;
00139
00140 isDummy = 0;
00141 }
00142
00143 inline ~MessageHolder() {
00144
00145
00146
00147
00148 }
00149
00150 inline char * getMessage() {
00151 return data;
00152 }
00153
00154 inline int getSize() {
00155 return size;
00156 }
00157
00158 inline void * operator new(size_t size) {
00159 return CmiAlloc(size);
00160 }
00161
00162 inline void operator delete (void *buf) {
00163 CmiFree(buf);
00164 }
00165
00166 virtual void pup(PUP::er &p);
00167 PUPable_decl(MessageHolder);
00168 };
00169
00170
00171 #define CONVERSE_STRATEGY 0 //The strategy works for converse programs
00172 #define NODEGROUP_STRATEGY 1 //Node group level optimizations
00173 #define GROUP_STRATEGY 2 //Charm Processor level optimizations
00174 #define ARRAY_STRATEGY 3 //Array level optimizations
00175
00181 class Strategy : public PUP::able {
00182 protected:
00183
00184
00185 short type;
00187 short isStrategyBracketed;
00188
00189
00190
00191 ComlibInstanceHandle myHandle;
00192
00193
00194
00195
00196
00197
00198 inline int getInstance() {return myHandle;}
00199
00200 public:
00201 Strategy();
00202 Strategy(CkMigrateMessage *m) : PUP::able(m) {
00203
00204
00205
00206
00207 }
00208
00209
00210
00211 inline void setBracketed(){isStrategyBracketed = 1;}
00212 inline int isBracketed(){return isStrategyBracketed;}
00213
00214
00215
00223 virtual void bracketedUpdatePeKnowledge(int *count) {}
00224
00226 virtual void insertMessage(MessageHolder *msg)=0;
00227
00233 virtual void doneInserting() {}
00234
00235
00236
00237
00238 inline int getType() {return type;}
00239
00240 inline void setType(int t) {type = t;}
00241
00243 ComlibInstanceHandle getHandle() {return myHandle;}
00244
00246 virtual void handleMessage(void *msg)=0;
00247
00249 virtual void deliver(char* msg, int size) {
00250 CmiAbort("Strategy::deliverer: If used, should be first redefined\n");
00251 };
00252
00255 virtual void notifyDone() {}
00256
00262 virtual void finalizeCreation() {}
00263
00265 virtual void pup(PUP::er &p);
00266
00267 PUPable_abstract(Strategy);
00268 };
00269
00272 class StrategyWrapper {
00273 public:
00274 Strategy **strategy;
00275 int *position;
00276 CmiBool *replace;
00277 int nstrats;
00278
00279
00280 StrategyWrapper() : nstrats(0), position(NULL), strategy(NULL) {}
00281 StrategyWrapper(int count);
00282 ~StrategyWrapper();
00283 void pup(PUP::er &p);
00284 };
00285
00286
00287
00289 enum CountingErrorMode { NORMAL_MODE = 0,
00290 ERROR_MODE = 1,
00291 CONFIRM_MODE = 2,
00292 ERROR_FIXED_MODE = 3 };
00293
00294
00295 enum CountingServerErrorMode { NORMAL_MODE_SERVER,
00296 ERROR_MODE_SERVER,
00297 CONFIRM_MODE_SERVER,
00298 ERROR_FIXED_MODE_SERVER,
00299 NON_SERVER_MODE_SERVER };
00300
00301
00302 enum DiscoveryErrorMode { NORMAL_DISCOVERY_MODE = 200,
00303 STARTED_DISCOVERY_MODE = 201,
00304 FINISHED_DISCOVERY_MODE = 202 };
00305
00320 class StrategyTableEntry {
00321 public:
00322 Strategy *strategy;
00323
00325 int isReady;
00327 int isNew;
00329 int isInSync;
00330
00331
00345 int bufferOutgoing;
00346
00347
00350 int bracketedSetupFinished;
00351
00353 CkQ<MessageHolder*> tmplist;
00354
00355 int numBufferReleaseReady;
00356
00357 int numElements;
00358
00359
00360 int nBeginItr;
00361 int nEndItr;
00362 int call_doneInserting;
00363
00364
00365 int lastKnownIteration;
00366
00367
00368 int nEndSaved;
00369 int totalEndCounted;
00370 int nProcSync;
00371
00372
00373
00374
00380 int *peList;
00381
00382
00384 int peConfirmCounter;
00386 int total;
00387
00388
00389 void reset();
00390
00391
00392
00393 StrategyTableEntry();
00394
00395
00396
00397 private:
00405 CountingErrorMode errorMode;
00406
00410 CountingServerErrorMode errorModeServer;
00411
00412
00416 DiscoveryErrorMode discoveryMode;
00417
00418
00419 public:
00420
00421 CountingErrorMode getErrorMode(){return errorMode;}
00422 CountingServerErrorMode getErrorModeServer(){return errorModeServer;}
00423 DiscoveryErrorMode getDiscoveryMode(){return discoveryMode;}
00424
00425 void setErrorMode(CountingErrorMode mode){
00426 errorMode=mode;
00427 ComlibPrintf("[%d] %s\n", CmiMyPe(), errorModeString());
00428 }
00429
00430 void setErrorModeServer(CountingServerErrorMode mode){
00431 errorModeServer=mode;
00432 ComlibPrintf("[%d] %s lastKnownIteration=%d\n", CmiMyPe(), errorModeServerString(), lastKnownIteration);
00433 }
00434
00435 void setDiscoveryMode(DiscoveryErrorMode mode){
00436 discoveryMode=mode;
00437 ComlibPrintf("[%d] %s\n", CmiMyPe(), discoveryModeString());
00438 }
00439
00440 const char *errorModeString();
00441 const char *errorModeServerString();
00442 const char *discoveryModeString();
00443
00444 };
00445
00446 typedef CkVec<StrategyTableEntry> StrategyTable;
00447
00448
00449 #endif
00450