#include <Communicate.h>
Definition at line 18 of file Communicate.h.
Communicate::Communicate |
( |
void |
| ) |
|
Definition at line 32 of file Communicate.C.
References CsmAckHandler(), CsmHandler(), and split().
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);
static void CsmHandler(void *msg)
std::vector< std::string > split(const std::string &text, std::string delimiter)
static void CsmAckHandler(void *msg)
Communicate::~Communicate |
( |
void |
| ) |
|
void * Communicate::getMessage |
( |
int |
PE, |
|
|
int |
tag |
|
) |
| |
Definition at line 83 of file Communicate.C.
References NAMD_bug().
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);
void NAMD_bug(const char *err_msg)
MIStream * Communicate::newInputStream |
( |
int |
pe, |
|
|
int |
tag |
|
) |
| |
MOStream * Communicate::newOutputStream |
( |
int |
pe, |
|
|
int |
tag, |
|
|
unsigned int |
bufsize |
|
) |
| |
void Communicate::sendMessage |
( |
int |
PE, |
|
|
void * |
msg, |
|
|
int |
size |
|
) |
| |
Definition at line 113 of file Communicate.C.
References ALL, ALLBUTME, and NAMD_bug().
Referenced by MOStream::end().
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 NAMD_bug(const char *err_msg)
The documentation for this class was generated from the following files: