00001 #ifndef COMLIBMANAGER_H
00002 #define COMLIBMANAGER_H
00003
00004
00138 #include <math.h>
00139 #include <map>
00140 #include <set>
00141
00142 #include "convcomlibmanager.h"
00143 #include "ComlibStrategy.h"
00144 #include "ComlibArrayListener.h"
00145 #include "cksection.h"
00146
00147 #define CHARM_MPI 0
00148 #define MAX_NSTRAT 1024
00149 #define LEARNING_PERIOD 1000 //Number of iterations after which the
00150
00151
00152
00153 #include "ComlibStats.h"
00154
00155 #include "comlib.decl.h"
00156
00157 CkpvExtern(CkGroupID, cmgrID);
00160 class ComlibDummyMsg: public CMessage_ComlibDummyMsg {
00161 int dummy;
00162 };
00163
00164
00165
00170
00171 struct ComlibMulticastIndexCount {
00172 int pe;
00173 int count;
00174 };
00175
00177 inline int indexCountCompare(const void *a, const void *b) {
00178 ComlibMulticastIndexCount a1 = *(ComlibMulticastIndexCount*) a;
00179 ComlibMulticastIndexCount b1 = *(ComlibMulticastIndexCount*) b;
00180
00181 if(a1.pe < b1.pe)
00182 return -1;
00183
00184 if(a1.pe == b1.pe)
00185 return 0;
00186
00187 if(a1.pe > b1.pe)
00188 return 1;
00189
00190 return 0;
00191 }
00192
00193
00197 class ComlibMulticastMsg : public CkMcastBaseMsg,
00198 public CMessage_ComlibMulticastMsg {
00199 public:
00200 int nPes;
00201 ComlibMulticastIndexCount *indicesCount;
00202 CkArrayIndex *indices;
00203 char *usrMsg;
00204 };
00205
00206
00207 void ComlibAssociateProxy(ComlibInstanceHandle cinst, CProxy &proxy);
00208 void ComlibAssociateProxy(Strategy *strat, CProxy &proxy);
00209
00211 ComlibInstanceHandle ComlibRegister(Strategy *strat);
00212
00213 void ComlibBegin(CProxy &proxy, int iteration);
00214 void ComlibEnd(CProxy &proxy, int iteration);
00215
00220 inline void ComlibResetSectionProxy(CProxySection_ArrayBase &sproxy) {
00221 sproxy.ckGetSectionInfo().info.sInfo.cInfo.id = 0;
00222 }
00223
00224
00225 void ComlibInitSectionID(CkSectionID &sid);
00226
00227 class LBMigrateMsg;
00228
00235 class ComlibManager: public CkDelegateMgr {
00236
00237
00238 int *bcast_pelist;
00239
00241 int section_send_event;
00242
00243 CkArrayIndex dummyArrayIndex;
00244
00246 ConvComlibManager *converseManager;
00247
00248
00253 std::map<ComlibInstanceHandle, std::set<CharmMessageHolder*> > delayMessageSendBuffer;
00254
00255
00257 int setupComplete;
00258
00259 int prioEndIterationFlag;
00260
00261 ComlibGlobalStats clib_gstats;
00262 int numStatsReceived;
00263
00264 int curComlibController;
00265 int clibIteration;
00266
00267
00268
00269 void init();
00270
00271
00272 void multicast(CharmMessageHolder *cmsg, int instid);
00273
00274
00275
00276 friend void ComlibBegin(CProxy&, int iteration);
00277 friend void ComlibEnd(CProxy&, int iteration);
00278
00280 void beginIteration(int instid, int iteration);
00281
00285 void endIteration(int instid, int iteration);
00286
00287 void printPeList(const char* note, int *peList);
00288
00289
00290 bool shouldBufferMessagesNow(int instid);
00291 void sendBufferedMessages(int instid, int step=-1);
00292 void sendBufferedMessagesAllStrategies();
00293
00294 public:
00295
00296 ComlibLocalStats clib_stats;
00297
00298
00299 ComlibManager();
00300
00301 ComlibManager(CkMigrateMessage *m) { }
00302 int useDefCtor(void){ return 1; }
00303
00304
00305
00306
00307 void barrier(void);
00308 void resumeFromSetupBarrier();
00309
00310
00311
00312 void ArraySend(CkDelegateData *pd,int ep, void *msg,
00313 const CkArrayIndex &idx, CkArrayID a);
00314 void GroupSend(CkDelegateData *pd, int ep, void *msg, int onpe,
00315 CkGroupID gid);
00316 void ArrayBroadcast(CkDelegateData *pd,int ep,void *m,CkArrayID a);
00317 void GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g);
00318 void ArraySectionSend(CkDelegateData *pd, int ep ,void *m,
00319 int nsid, CkSectionID *s, int opts);
00320 CkDelegateData* ckCopyDelegateData(CkDelegateData *data);
00321 CkDelegateData *DelegatePointerPup(PUP::er &p,CkDelegateData *pd);
00322
00323 inline Strategy *getStrategy(int instid)
00324 {return converseManager->getStrategy(instid);}
00325
00326 inline StrategyTableEntry *getStrategyTableEntry(int instid)
00327 {return converseManager->getStrategyTable(instid);}
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 void bracketedCatchUpPE(int instid, int step);
00338 void bracketedReceiveCount(int instid, int pe, int count, int isFirst, int step);
00339 void bracketedStartErrorRecoveryProcess(int instid, int step);
00340 void bracketedErrorDetected(int instid, int step);
00341 void bracketedConfirmCount(int instid, int step);
00342 void bracketedCountConfirmed(int instid, int count, int step);
00343 void bracketedReceiveNewCount(int instid, int step);
00344 void bracketedReceiveNewPeList(int instid, int step, int *count);
00345
00346 void bracketedFinalBarrier(int instid, int step);
00347 void bracketedReleaseCount(int instid, int step);
00348 void bracketedReleaseBufferedMessages(int instid, int step);
00349
00350 void bracketedStartDiscovery(int instid);
00351 void bracketedDiscover(int instid, CkArrayID aid, CkArrayIndex &idx, int isSrc);
00352 void bracketedContributeDiscovery(int instid, int pe, int nsrc, int ndest, int step);
00353
00354
00355
00356 void AtSync();
00357 void lbUpdate(LBMigrateMsg *);
00358
00359
00360
00361
00362
00363
00364 void collectStats(ComlibLocalStats &s, int src);
00365
00366
00368 void printDiagnostics(int cinst);
00369
00371 void printDiagnostics();
00372
00373 };
00374
00379 class ComlibDelegateData : public CkDelegateData {
00380 private:
00381 int _instid;
00382
00383 friend void ComlibAssociateProxy(ComlibInstanceHandle, CProxy&);
00384 friend CkDelegateData *ComlibManager::ckCopyDelegateData(CkDelegateData*);
00385 ComlibDelegateData(int instid);
00386
00387 public:
00388 ComlibDelegateData(CkMigrateMessage *) : CkDelegateData() { ref(); }
00389
00390 void beginIteration();
00391 void endIteration();
00392
00394 inline int getID() {return _instid;}
00395
00396 void pup(PUP::er &p) {
00397 p | _instid;
00398 }
00399
00400 };
00401
00402 void ComlibAtSync(void *msg);
00403 void ComlibNotifyMigrationDoneHandler(void *msg);
00404 void ComlibLBMigrationUpdate(LBMigrateMsg *);
00405
00406
00407 #ifdef filippo
00408
00409 #define RECORD_SENDSTATS(sid, bytes, dest) { \
00410 CProxy_ComlibManager cgproxy(CkpvAccess(cmgrID)); \
00411 cgproxy.ckLocalBranch()->clib_stats.recordSend(sid, bytes, dest); \
00412 }\
00413
00414 #define RECORD_RECV_STATS(sid, bytes, src) { \
00415 CProxy_ComlibManager cgproxy(CkpvAccess(cmgrID)); \
00416 cgproxy.ckLocalBranch()->clib_stats.recordRecv(sid, bytes, src); \
00417 }\
00418
00419 #define RECORD_SENDM_STATS(sid, bytes, dest_arr, ndest) { \
00420 CProxy_ComlibManager cgproxy(CkpvAccess(cmgrID)); \
00421 cgproxy.ckLocalBranch()->clib_stats.recordSendM(sid, bytes, dest_arr, ndest); \
00422 }\
00423
00424 #define RECORD_RECVM_STATS(sid, bytes, src_arr, nsrc) { \
00425 CProxy_ComlibManager cgproxy(CkpvAccess(cmgrID)); \
00426 cgproxy.ckLocalBranch()->clib_stats.recordRecvM(sid, bytes, src_arr, nsrc); \
00427 }\
00428
00429 #else
00430
00431 #define RECORD_SEND_STATS(sid, bytes, dest)
00432 #define RECORD_RECV_STATS(sid, bytes, src)
00433 #define RECORD_SENDM_STATS(sid, bytes, dest_arr, ndest)
00434 #define RECORD_RECVM_STATS(sid, bytes, src_arr, nsrc)
00435 #endif
00436
00439 #endif