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)