18 if ( CmiMyRank() )
NAMD_bug(
"Communicate CsmHandler on non-rank-zero pe");
20 int *m = (
int *) ((
char *)msg+CmiMsgHeaderSizeBytes);
22 CmmPut(CkpvAccess(CsmMessages), 2, m, msg);
27 if ( CmiMyRank() )
NAMD_bug(
"Communicate CsmAckHandler on non-rank-zero pe");
29 CkpvAccess(CsmAcks) += 1;
34 CkpvInitialize(CmmTable, CsmMessages);
35 CsmHandlerIndex = CmiRegisterHandler((CmiHandler)
CsmHandler);
36 CsmAckHandlerIndex = CmiRegisterHandler((CmiHandler)
CsmAckHandler);
37 CkpvAccess(CsmMessages) = CmmNew();
40 int self = CkMyNode();
42 int range_end = CkNumNodes();
43 while (
self != range_begin ) {
44 parent_node = range_begin;
46 int split = range_begin + ( range_end - range_begin ) / 2;
47 if (
self < split ) { range_end =
split; }
48 else { range_begin =
split; }
50 int send_near =
self + 1;
51 int send_far = send_near + ( range_end - send_near ) / 2;
53 parent = CkNodeFirst(parent_node);
55 if ( send_far < range_end ) children[nchildren++] = CkNodeFirst(send_far);
56 if ( send_near < send_far ) children[nchildren++] = CkNodeFirst(send_near);
58 CkpvInitialize(
int, CsmAcks);
59 CkpvAccess(CsmAcks) = nchildren;
61 ackmsg = (
char *) CmiAlloc(CmiMsgHeaderSizeBytes);
62 CmiSetHandler(ackmsg, CsmAckHandlerIndex);
85 if ( CmiMyRank() )
NAMD_bug(
"Communicate::getMessage called on non-rank-zero Pe\n");
90 itag[0] = (PE==(-1)) ? (CmmWildCard) : PE;
91 itag[1] = (tag==(-1)) ? (CmmWildCard) : tag;
92 while((msg=CmmGet(CkpvAccess(CsmMessages),2,itag,rtag))==0) {
97 CmiSyncSend(parent, CmiMsgHeaderSizeBytes, ackmsg);
99 while ( CkpvAccess(CsmAcks) < nchildren ) {
103 CkpvAccess(CsmAcks) = 0;
105 int size = SIZEFIELD(msg);
106 for (
int i = 0; i < nchildren; ++i ) {
107 CmiSyncSend(children[i],size,(
char*)msg);
115 if ( CmiMyPe() )
NAMD_bug(
"Communicate::sendMessage not from Pe 0");
117 while ( CkpvAccess(CsmAcks) < nchildren ) {
121 CkpvAccess(CsmAcks) = 0;
123 CmiSetHandler(msg, CsmHandlerIndex);
126 NAMD_bug(
"Unexpected Communicate::sendMessage(ALL,...)");
131 for (
int i = 0; i < nchildren; ++i ) {
132 CmiSyncSend(children[i],size,(
char*)msg);
136 NAMD_bug(
"Unexpected Communicate::sendMessage(PEL,...)");
void * getMessage(int PE, int tag)
MOStream * newOutputStream(int pe, int tag, unsigned int bufsize)
void NAMD_bug(const char *err_msg)
static void CsmHandler(void *msg)
std::vector< std::string > split(const std::string &text, std::string delimiter)
static void CsmAckHandler(void *msg)
CkpvStaticDeclare(int, exitSchedHndlr)
void sendMessage(int PE, void *msg, int size)
MIStream * newInputStream(int pe, int tag)