00001 #ifndef _MULTICAST
00002 #define _MULTICAST
00003
00004 #include "pup.h"
00005 class mCastEntry;
00006
00007 class multicastSetupMsg;
00008 class multicastGrpMsg;
00009 class cookieMsg;
00010 class CkMcastBaseMsg;
00011 class reductionInfo;
00012
00013 typedef mCastEntry * mCastEntryPtr;
00014 PUPbytes(mCastEntryPtr)
00015
00016 #define MAXMCASTCHILDREN 2
00017
00018 #include "CkMulticast.decl.h"
00019
00020 typedef void (*redClientFn)(CkSectionInfo sid, void *param,int dataSize,void *data);
00021
00023 extern void CkGetSectionInfo(CkSectionInfo &id, void *msg);
00024
00025
00026
00032 class CkMulticastMgr: public CkDelegateMgr
00033 {
00034 private:
00036 class IndexPos {
00037 public:
00038 CkArrayIndex idx;
00039 int pe;
00040 public:
00041 IndexPos() {}
00042 IndexPos(int i): idx(), pe(i) {}
00043 IndexPos(CkArrayIndex i, int p): idx(i), pe(p) {};
00044 void pup(PUP::er &p){ p|idx; p|pe; }
00045 };
00046 typedef CkVec<IndexPos> arrayIndexPosList;
00047 int factor;
00048 unsigned int split_size;
00049 unsigned int split_threshold;
00050
00051 public:
00052
00053 CkMulticastMgr(CkMigrateMessage *m) {}
00054 CkMulticastMgr(int _factor = 2, unsigned int _split_size = 8192, unsigned int _split_threshold = 8192):
00055 factor(_factor),
00056 split_size(_split_size),
00057 split_threshold(_split_threshold) {}
00058 int useDefCtor(void){ return 1; }
00059 void pup(PUP::er &p){
00060 CkDelegateMgr::pup(p);
00061 p|factor;
00062 p|split_size;
00063 p|split_threshold;
00064 }
00065
00066
00068 void setSection(CkSectionInfo &id, CkArrayID aid, CkArrayIndex *, int n);
00070 void setSection(CkSectionInfo &id);
00072 void setSection(CProxySection_ArrayElement &proxy);
00074 void setup(multicastSetupMsg *);
00076 void recvCookie(CkSectionInfo sid, CkSectionInfo child);
00078 void childrenReady(mCastEntry *entry);
00079
00081 void teardown(CkSectionInfo s);
00083 void retire(CkSectionInfo s, CkSectionInfo root);
00085 void freeup(CkSectionInfo s);
00086
00088 void retrieveCookie(CkSectionInfo s, CkSectionInfo srcInfo);
00090 void recvCookieInfo(CkSectionInfo s, int red);
00091
00093 void recvMsg(multicastGrpMsg *m);
00095 void sendToLocal(multicastGrpMsg *m);
00097 void recvPacket(CkSectionInfo &_cookie, int offset, int n, char *data, int seqno, int count, int totalsize, int fromBuffer);
00098
00100 void recvRedMsg(CkReductionMsg *msg);
00102 void updateRedNo(mCastEntryPtr, int red);
00104 void setReductionClient(CProxySection_ArrayElement &, redClientFn fn,void *param=NULL);
00106 void setReductionClient(CProxySection_ArrayElement &, CkCallback *cb);
00108 void contribute(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &sid, int userData=-1, int fragSize=-1);
00110 void contribute(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &sid, CkCallback &cb, int userData=-1, int fragSize=-1);
00112
00113
00115 void resetSection(CProxySection_ArrayElement &proxy);
00117 virtual void initDelegateMgr(CProxy *proxy);
00119 void ArraySectionSend(CkDelegateData *pd,int ep,void *m, int nsid, CkSectionID *s, int opts);
00121 void SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, int opts);
00123 void rebuild(CkSectionInfo &);
00124
00125 private:
00127 void prepareCookie(mCastEntry *entry, CkSectionID &sid, const CkArrayIndex *al, int count, CkArrayID aid);
00129 void initCookie(CkSectionInfo sid);
00131 void sendToSection(CkDelegateData *pd,int ep,void *m, CkSectionID *sid, int opts);
00133 void resetCookie(CkSectionInfo sid);
00135 void releaseBufferedReduceMsgs(mCastEntryPtr entry);
00137 void releaseFutureReduceMsgs(mCastEntryPtr entry);
00139 inline CkReductionMsg *buildContributeMsg(int dataSize,void *data,CkReduction::reducerType type, CkSectionInfo &id, CkCallback &cb, int userFlag=-1);
00141 void reduceFragment (int index, CkSectionInfo& id, mCastEntry* entry, reductionInfo& redInfo, int currentTreeUp);
00143 CkReductionMsg* combineFrags (CkSectionInfo& id, mCastEntry* entry, reductionInfo& redInfo);
00144 };
00145
00146 #endif