// void cb_client(CkSectionInfo sid, void *param, int dataSize, void *data) void cb_client(CkReductionMsg *msg) { int dataSize = msg->getSize(); void *data = msg->getData(); CmiPrintf("RESULT [%d]: %d\n", cnt.reductionNo, *(int *)data); // check correctness int result; int redno = msg->getRedNo(); if (redno%3 == 0) { result = 0; for (int i=0; i<sectionSize; i++) result+=i; } else if (redno%3 == 2) { result = 1; for (int i=1; i<sectionSize+1; i++) result*=i; } else { result = sectionSize+1; } if (*(int *)data != result) { CmiPrintf("Expected: %d acual:%d\n", result, *(int *)data); CmiAbort("reduction result is wrong!"); } cnt.reductionsRemaining--; if (cnt.reductionsRemaining<=0) { CProxy_main mproxy(mid); mproxy.maindone(); cnt.reductionNo++; } else { #if 0 CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch(); if (cnt->reductionNo % 32 == 0) mg->rebuild(mcp.ckGetSectionInfo()); #endif if (cnt.reductionNo%3 == 0) { HiMsg *hiMsg = new (2, 0) HiMsg; //hiMsg->data[0] = 18+cnt.reductionNo; hiMsg->data[0] = 22; hiMsg->data[1] = 28; mcp.SayHi(hiMsg); } cnt.reductionNo++; } delete msg; }
void cb_client(CkReductionMsg *msg) { endTime = CkWallTimer (); int dataSize = msg->getSize(); void *data = msg->getData(); CmiPrintf("%e\n", endTime-startTime); // check correctness int result; int redno = msg->getRedNo(); result = 0; for (int i=0; i<sectionSize; i++) result+=i; if (*(int *)data != result) { CmiPrintf("Expected: %d acual:%d\n", result, *(int *)data); CmiAbort("reduction result is wrong!"); } cnt.reductionsRemaining--; if (cnt.reductionsRemaining<=0) { CProxy_main mproxy(mid); mproxy.maindone(); cnt.reductionNo++; } else { HiMsg *hiMsg = new (2, 0) HiMsg; hiMsg->data[0] = 22; hiMsg->data[1] = 28; startTime = CkWallTimer (); mcp.SayHi(hiMsg); cnt.reductionNo++; } delete msg; }
// only on index 0 void start() { CkAssert(thisIndex == 0); CmiPrintf("start %d elements\n", nElements); CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch(); // create section proxy // CkVec<CkArrayIndex1D> al; // for (int i=0; i<sectionSize; i++) // al.push_back(CkArrayIndex1D(i)); // mcp = CProxySection_Hello::ckNew(thisArrayID, al.getVec(), al.size()); #if 0 mcast = new CProxySection_Hello(thisArrayID, al, sectionSize, mCastGrpId); #endif mcp = CProxySection_Hello::ckNew(thisArrayID, 0, sectionSize-1, 1); mcp.ckSectionDelegate(mg); #if 0 mcp.ckDelegate(mg); mg->setSection(mcp); #endif #if 0 mg->setSection(sid, thisArrayID, al, sectionSize); sid.create(thisArrayID); for (int i=0; i<sectionSize; i++) sid.addMember(CkArrayIndex1D(i)); mg->setSection(sid); #endif cnt.reductionsRemaining=REDUCE_TIME; cnt.reductionNo=0; // mg->setReductionClient(mcp, client, cnt); CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy); mg->setReductionClient(mcp, cb); HiMsg *hiMsg = new (2, 0) HiMsg; hiMsg->data[0] = 22; hiMsg->data[1] = 28; mcp.SayHi(hiMsg); }
void start() { CkMulticastMgr *mg = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch(); sectionSize = SectionSize; if (sectionSize > NumElements) sectionSize = NumElements; CkArrayIndex *al = new CkArrayIndex[sectionSize]; for (int i=0; i<sectionSize; i++) { al[i] = CkArrayIndex1D(i); } mcp = CProxySection_Hello::ckNew(thisArrayID, al, sectionSize); mcp.ckSectionDelegate(mg); delete [] al; cnt.reductionsRemaining=NumReductions; cnt.reductionNo=0; CkCallback *cb = new CkCallback(CkIndex_Hello::cb_client(NULL), CkArrayIndex1D(0), thisProxy); mg->setReductionClient(mcp, cb); HiMsg *hiMsg = new (2, 0) HiMsg; hiMsg->data[0] = 22; hiMsg->data[1] = 28; startTime = CkWallTimer (); mcp.SayHi(hiMsg); }