17 #ifdef CmiMyPartitionSize    19   void setDefaultPartitionParams() {
    21     CmiSetPartitionScheme(3);  
    34   void packSend(
int dst, 
int dstPart, 
const char *data, 
int size, 
int handler, 
int code) {
    37     dmsg->
setMessage(data,CkMyPe(),CmiMyPartition(),size,handler,code);
    39     CmiInterSyncSendAndFree(dst,dstPart,msgsize,(
char*)dmsg);
    41     CmiSyncSendAndFree(dst,msgsize,(
char*)dmsg);
    46     CmiSetHandler(msg->
core, CkpvAccess(recv_replica_dcd_init_idx));
    48     CmiInterSyncSendAndFree(0,dstPart,msgsize,(
char*)msg);
    50     CmiSyncSendAndFree(0,msgsize,(
char*)msg);
    53     CkpvAccess(_qd)->create();  
    57     CmiSetHandler(msg->
core, CkpvAccess(recv_replica_dcd_data_idx));
    59     CmiInterSyncSendAndFree(0,dstPart,msgsize,(
char*)msg);
    61     CmiSyncSendAndFree(0,msgsize,(
char*)msg);
    64     CkpvAccess(_qd)->create();  
    68     CmiSetHandler(msg->
core, CkpvAccess(recv_replica_dcd_ack_idx));
    71     CmiInterSyncSendAndFree(0,dstPart,msgsize,(
char*)msg);
    73     CmiSyncSendAndFree(0,msgsize,(
char*)msg);
    90     CkpvAccess(_qd)->process();
    95     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) 
NAMD_bug(
"BOCgroup::dataExchanger is zero in recvData!");
    96     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_data(msg);
   100     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) 
NAMD_bug(
"BOCgroup::dataExchanger is zero in recvAck!");
   101     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_ack();
   106     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) 
NAMD_bug(
"BOCgroup::dataExchanger is zero in recvBcast!");
   107     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_bcast();
   112     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) {
   117     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_red();
   123     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) 
NAMD_bug(
"BOCgroup::dataExchanger is zero in recvEvalCommand!");
   124     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_eval_command(msg);
   129     if ( CkpvAccess(BOCclass_group).dataExchanger.isZero() ) 
NAMD_bug(
"BOCgroup::dataExchanger is zero in recvEvalResult!");
   130     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv_eval_result(msg);
   133   void replica_send(
const char *sndbuf, 
int sendcount, 
int destPart, 
int destPE) {
   134     if ( CpvAccess(inEval) ) {
   135       packSend(destPE,destPart,sndbuf,sendcount,CkpvAccess(recv_data_idx),1);
   139     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].send(sendPointer,sendcount,destPart,destPE); 
   140     CpvAccess(breakScheduler) = 0;
   141     while(!CpvAccess(breakScheduler)) CsdSchedulePoll();
   145     Pointer recvPointer((
char *) precvMsg);
   146     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].recv(recvPointer,srcPart,srcPE);
   147     CpvAccess(breakScheduler) = 0;
   148     while(!CpvAccess(breakScheduler)) CsdSchedulePoll();
   153     Pointer recvPointer((
char *) precvMsg);
   154     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].sendRecv(sendPointer,sendcount,destPart,destPE,recvPointer,srcPart,srcPE);
   155     CpvAccess(breakScheduler) = 0;
   156     while(!CpvAccess(breakScheduler)) CsdSchedulePoll();
   161     Pointer recvPointer((
char *) precvMsg);
   162     int sendcount = strlen(cmdbuf) + 1;
   163     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].eval(sendPointer,sendcount,targPart,targPE,recvPointer);
   164     CpvAccess(breakScheduler) = 0;
   165     while(!CpvAccess(breakScheduler)) CsdSchedulePoll();
   170     CPROXY_DE(CkpvAccess(BOCclass_group).dataExchanger)[CkMyPe()].barrier();
   171     CpvAccess(breakScheduler) = 0;
   172     while(!CpvAccess(breakScheduler)) CsdSchedulePoll();
   176     if ( root != 0 ) 
NAMD_bug(
"replica_bcast root must be zero");
   177     int rank = CmiMyPartition();
   178     int size = CmiNumPartitions();
   180     for ( i=1; i<size; i*=2 );
   181     for ( i/=2; i>0; i/=2 ) {
   182       if ( rank & (i - 1) ) 
continue;
   188         if ( recvMsg == NULL ) 
NAMD_bug(
"recvMsg == NULL in replica_bcast");
   189         if ( recvMsg->
size != count ) 
NAMD_bug(
"size != count in replica_bcast");
   190         memcpy(buf, recvMsg->
data, count);
   203     int rank = CmiMyPartition();
   204     int size = CmiNumPartitions();
   205     for ( 
int i=1; i<size; i*=2 ) {
   209         replica_send((
char*)dat, count * 
sizeof(
double), dst, CkMyPe());
   216           if ( recvMsg == NULL ) 
NAMD_bug(
"recvMsg == NULL in replica_bcast");
   217           if ( recvMsg->
size != count * 
sizeof(
double) ) 
NAMD_bug(
"size != count in replica_min_double");
   218           double *rdat = 
new double[count];
   219           memcpy(rdat, recvMsg->
data, count * 
sizeof(
double));
   221           for ( 
int j=0; j<count; ++j ) {
   222             if ( rdat[j] < dat[j] ) dat[j] = rdat[j];
   227       if ( rank & (2 * i - 1) ) 
break;
   233 #if CMK_IMMEDIATE_MSG && CMK_SMP && ! ( CMK_MULTICORE || CMK_SMP_NO_COMMTHD )   234 extern "C" void CmiPushImmediateMsg(
void *msg);
   236 class SleepCommthdMsg {
   238   char core[CmiMsgHeaderSizeBytes];
   241 void recvSleepCommthdMsg(SleepCommthdMsg *msg) {
   242   if ( CkMyRank() != CkMyNodeSize() ) 
NAMD_bug(
"recvSleepCommthdMsg called on PE instead of communication thread");
   253   CkpvInitialize(
int, recv_data_idx);
   254   CkpvInitialize(
int, recv_ack_idx);
   255   CkpvInitialize(
int, recv_bcast_idx);
   256   CkpvInitialize(
int, recv_red_idx);
   257   CkpvInitialize(
int, recv_eval_command_idx);
   258   CkpvInitialize(
int, recv_eval_result_idx);
   259   CkpvInitialize(
int, recv_replica_dcd_init_idx);
   260   CkpvInitialize(
int, recv_replica_dcd_data_idx);
   261   CkpvInitialize(
int, recv_replica_dcd_ack_idx);
   263   CkpvAccess(recv_data_idx) = CmiRegisterHandler((CmiHandler)
recvData);                   
   264   CkpvAccess(recv_ack_idx) = CmiRegisterHandler((CmiHandler)
recvAck);                     
   265   CkpvAccess(recv_red_idx) = CmiRegisterHandler((CmiHandler)
recvRed);                     
   266   CkpvAccess(recv_bcast_idx) = CmiRegisterHandler((CmiHandler)
recvBcast);                 
   267   CkpvAccess(recv_eval_command_idx) = CmiRegisterHandler((CmiHandler)
recvEvalCommand);    
   268   CkpvAccess(recv_eval_result_idx) = CmiRegisterHandler((CmiHandler)
recvEvalResult);      
   269   CkpvAccess(recv_replica_dcd_init_idx) = CmiRegisterHandler((CmiHandler)
recvReplicaDcdInit);
   270   CkpvAccess(recv_replica_dcd_data_idx) = CmiRegisterHandler((CmiHandler)
recvReplicaDcdData);
   271   CkpvAccess(recv_replica_dcd_ack_idx) = CmiRegisterHandler((CmiHandler)
recvReplicaDcdAck);
   273 #if CMK_IMMEDIATE_MSG && CMK_SMP && ! ( CMK_MULTICORE || CMK_SMP_NO_COMMTHD )   274   int sleep_commthd_idx = CmiRegisterHandler((CmiHandler)recvSleepCommthdMsg);
   275   if ( CkMyPe() == 0 && CkNumNodes() == 1 ) {
   276     CkPrintf(
"Charm++ communication thread will sleep due to single-process run.\n");
   277     SleepCommthdMsg *msg = (SleepCommthdMsg *)malloc(
sizeof(SleepCommthdMsg));
   278     CmiSetHandler(msg, sleep_commthd_idx);
   279     CmiBecomeImmediate(msg);
   280     CmiPushImmediateMsg(msg);
   290   CpvInitialize(
int, breakScheduler);
   291   CpvAccess(breakScheduler) = 1;
   292   CpvInitialize(
int, inEval);
   293   CpvAccess(inEval) = 0;
   294   if(CmiMyPartition() == 0) 
   316 #include "DataExchanger.def.h" 
void setMessage(const char *_data, int _src, int _srcPart, int _size, int _handler, int _code)
 
void recvRed(DataMessage *dmsg)
 
void recvReplicaDcdData(ReplicaDcdDataMsg *msg)
 
void sendReplicaDcdInit(int dstPart, ReplicaDcdInitMsg *msg, int msgsize)
 
void packSend(int dst, int dstPart, const char *data, int size, int handler, int code)
 
static int recvRedCalledEarly
 
char core[CmiMsgHeaderSizeBytes]
 
void recvEvalResult(DataMessage *dmsg)
 
void replica_send(const char *sndbuf, int sendcount, int destPart, int destPE)
 
void recvBcast(DataMessage *dmsg)
 
void recvEvalCommand(DataMessage *dmsg)
 
void replica_eval(const char *cmdbuf, int targPart, int targPE, DataMessage **precvMsg)
 
void recvData(DataMessage *dmsg)
 
int recv_eval_command_idx
 
void recvReplicaDcdAck(ReplicaDcdAckMsg *msg)
 
void replica_recv(DataMessage **precvMsg, int srcPart, int srcPE)
 
void replica_bcast(char *buf, int count, int root)
 
void recvReplicaDcdInit(ReplicaDcdInitMsg *msg)
 
void initializeReplicaConverseHandlers()
 
void sendReplicaDcdData(int dstPart, ReplicaDcdDataMsg *msg, int msgsize)
 
void NAMD_bug(const char *err_msg)
 
void recvReplicaDcdInit(ReplicaDcdInitMsg *msg)
 
CpvDeclare(int, breakScheduler)
 
void recvReplicaDcdData(ReplicaDcdDataMsg *msg)
 
char core[CmiMsgHeaderSizeBytes]
 
static CollectionMaster * Object()
 
void replica_min_double(double *dat, int count)
 
void sendReplicaDcdAck(int dstPart, ReplicaDcdAckMsg *msg)
 
char core[CmiMsgHeaderSizeBytes]
 
void replica_sendRecv(const char *sndbuf, int sendcount, int destPart, int destPE, DataMessage **precvMsg, int srcPart, int srcPE)
 
void recvAck(DataMessage *dmsg)