Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

Communicate Class Reference

#include <Communicate.h>

List of all members.

Public Member Functions

 Communicate (void)
 ~Communicate ()
MIStreamnewInputStream (int pe, int tag)
MOStreamnewOutputStream (int pe, int tag, unsigned int bufsize)
void * getMessage (int PE, int tag)
void sendMessage (int PE, void *msg, int size)


Constructor & Destructor Documentation

Communicate::Communicate void   ) 
 

Definition at line 32 of file Communicate.C.

References CsmAckHandler(), and CsmHandler().

00033 {
00034   CkpvInitialize(CmmTable, CsmMessages);
00035   CsmHandlerIndex = CmiRegisterHandler((CmiHandler) CsmHandler);
00036   CsmAckHandlerIndex = CmiRegisterHandler((CmiHandler) CsmAckHandler);
00037   CkpvAccess(CsmMessages) = CmmNew();
00038   if ( CmiMyNode() * 2 + 2 < CmiNumNodes() ) nchildren = 2;
00039   else if ( CmiMyNode() * 2 + 1 < CmiNumNodes() ) nchildren = 1;
00040   else nchildren = 0;
00041   CkpvInitialize(int, CsmAcks);
00042   CkpvAccess(CsmAcks) = nchildren;
00043 }

Communicate::~Communicate  ) 
 

Definition at line 46 of file Communicate.C.

00047 {
00048   // do nothing
00049 }


Member Function Documentation

void * Communicate::getMessage int  PE,
int  tag
 

Definition at line 63 of file Communicate.C.

References NAMD_bug().

00064 {
00065   if ( CmiMyRank() ) NAMD_bug("Communicate::getMessage called on non-rank-zero Pe\n");
00066 
00067   int itag[2], rtag[2];
00068   void *msg;
00069 
00070   itag[0] = (PE==(-1)) ? (CmmWildCard) : PE;
00071   itag[1] = (tag==(-1)) ? (CmmWildCard) : tag;
00072   while((msg=CmmGet(CkpvAccess(CsmMessages),2,itag,rtag))==0) {
00073     CmiDeliverMsgs(0);
00074   }
00075 
00076   char *ackmsg = (char *) CmiAlloc(CmiMsgHeaderSizeBytes);
00077   CmiSetHandler(ackmsg, CsmAckHandlerIndex);
00078   CmiSyncSend(CmiNodeFirst((CmiMyNode()-1)/2), CmiMsgHeaderSizeBytes, ackmsg);
00079 
00080   while ( CkpvAccess(CsmAcks) < nchildren ) {
00081     CmiDeliverMsgs(0);
00082   }
00083   CkpvAccess(CsmAcks) = 0;
00084 
00085   int size = SIZEFIELD(msg);
00086   for ( int i = 2; i >= 1; --i ) {
00087     int node = CmiMyNode() * 2 + i;
00088     if ( node < CmiNumNodes() ) {
00089       CmiSyncSend(CmiNodeFirst(node),size,(char*)msg);
00090     }
00091   }
00092 
00093   return msg;
00094 }

MIStream * Communicate::newInputStream int  pe,
int  tag
 

Definition at line 51 of file Communicate.C.

00052 {
00053   MIStream *st = new MIStream(this, PE, tag);
00054   return st;
00055 }

MOStream * Communicate::newOutputStream int  pe,
int  tag,
unsigned int  bufsize
 

Definition at line 57 of file Communicate.C.

00058 {
00059   MOStream *st = new MOStream(this, PE, tag, bufSize);
00060   return st;
00061 }

void Communicate::sendMessage int  PE,
void *  msg,
int  size
 

Definition at line 96 of file Communicate.C.

References ALL, ALLBUTME, and NAMD_bug().

Referenced by MOStream::end().

00097 {
00098   if ( CmiMyPe() ) NAMD_bug("Communicate::sendMessage not from Pe 0");
00099 
00100   while ( CkpvAccess(CsmAcks) < nchildren ) {
00101     CmiDeliverMsgs(0);
00102   }
00103   CkpvAccess(CsmAcks) = 0;
00104 
00105   CmiSetHandler(msg, CsmHandlerIndex);
00106   switch(PE) {
00107     case ALL:
00108       NAMD_bug("Unexpected Communicate::sendMessage(ALL,...)");
00109       //CmiSyncBroadcastAll(size, (char *)msg);
00110       break;
00111     case ALLBUTME:
00112       //CmiSyncBroadcast(size, (char *)msg);
00113       if ( CmiNumNodes() > 2 ) {
00114         CmiSyncSend(CmiNodeFirst(2),size,(char*)msg);
00115       }
00116       if ( CmiNumNodes() > 1 ) {
00117         CmiSyncSend(CmiNodeFirst(1),size,(char*)msg);
00118       }
00119       break;
00120     default:
00121       NAMD_bug("Unexpected Communicate::sendMessage(PEL,...)");
00122       //CmiSyncSend(PE, size, (char *)msg);
00123       break;
00124   }
00125 }


The documentation for this class was generated from the following files:
Generated on Fri May 25 04:07:21 2012 for NAMD by  doxygen 1.3.9.1