6 #define pvd CpvStaticDeclare
7 #define pvi CpvInitialize
9 static struct testdata
{
32 typedef struct message_
{
33 char core
[CmiMsgHeaderSizeBytes
];
42 static void fillMessage(Message
*msg
)
45 size
= sizes
[msg
->idx
].size
+ sizeof(double);
46 items
= size
/sizeof(double);
48 msg
->data
[i
] = i
+0x1234;
51 static void checkMessage(Message
*msg
)
54 size
= sizes
[msg
->idx
].size
+ sizeof(double);
55 items
= size
/sizeof(double);
56 for(i
=0;i
<items
;i
++) {
57 if(msg
->data
[i
] != (i
+0x1234))
58 CmiAbort("[pingpong] Data corrupted. Run megacon !!\n");
63 char core
[CmiMsgHeaderSizeBytes
];
72 pvd(double, starttime
);
74 pvd(double **, times
);/* stores times for all nbrs and sizes */
75 pvd(int *, nodeList
); /* stores nums of pes rank 0 on all nodes*/
84 pvd(int, numSizes
); /* how many test sizes exist */
87 pvd(int, timeHandler
);
88 pvd(int, nodeHandler
);
90 pvd(int, sizeHandler
);
91 pvd(int, iterHandler
);
92 pvd(int, bounceHandler
);
93 pvd(int, setupHandler
);
94 pvd(int, startHandler
);
96 static void recvTime(TimeMessage
*msg
)
103 for(i
=0;i
<CmiNumNodes();i
++) {
106 for(j
=0;j
<pva(numSizes
);j
++) {
107 time
= *(msg
->data
+i
*pva(numSizes
)+j
);
108 pva(gavg
)[j
] += time
;
109 if(time
> pva(gmax
)[j
]) {
111 pva(gmaxSrc
)[j
] = msg
->srcNode
;
112 pva(gmaxDest
)[j
] = i
;
114 if(time
< pva(gmin
)[j
]) {
116 pva(gminSrc
)[j
] = msg
->srcNode
;
117 pva(gminDest
)[j
] = i
;
121 if(pva(numRecv
)==CmiNumNodes()){
122 for(j
=0;j
<pva(numSizes
);j
++)
123 pva(gavg
)[j
] /= (CmiNumNodes()*(CmiNumNodes()-1));
124 for(j
=0;j
<pva(numSizes
);j
++) {
125 CmiPrintf("%d\t\t%le\n",
126 sizes
[j
].size
, pva(gavg
)[j
]);
127 //CmiPrintf("[pingpong] size=%d\tmaxTime=%le seconds\t[%d->%d]\n",
128 // sizes[j].size, pva(gmax)[j],pva(gmaxSrc)[j],pva(gmaxDest)[j]);
129 //CmiPrintf("[pingpong] size=%d\tminTime=%le seconds\t[%d->%d]\n",
130 // sizes[j].size, pva(gmin)[j],pva(gminSrc)[j],pva(gminDest)[j]);
132 CmiSetHandler(&m
, pva(ack_handler
));
133 CmiSyncSend(0, sizeof(EmptyMsg
), &m
);
138 static void startNextNode(EmptyMsg
*msg
)
142 if((CmiMyNode()+1) != CmiNumNodes()) {
143 CmiSetHandler(&m
, pva(nbrHandler
));
144 CmiSyncSend(pva(nodeList
)[CmiMyNode()+1], sizeof(EmptyMsg
), &m
);
148 static void startNextNbr(EmptyMsg
*msg
)
154 //CmiAssert(CmiMyPe()==0);
158 if(pva(nextNbr
) == CmiMyNode()) {
159 CmiSetHandler(&m
, pva(nbrHandler
));
160 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
163 if(pva(nextNbr
) == CmiNumNodes()) {
165 CmiSetHandler(&m
, pva(nodeHandler
));
166 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
167 size
= sizeof(TimeMessage
)+pva(numSizes
)*CmiNumNodes()*sizeof(double);
168 tm
= (TimeMessage
*) CmiAlloc(size
);
169 for(i
=0;i
<CmiNumNodes();i
++)
170 memcpy(tm
->data
+i
*pva(numSizes
),pva(times
)[i
],
171 sizeof(double)*pva(numSizes
));
172 tm
->srcNode
= CmiMyNode();
173 CmiSetHandler(tm
, pva(timeHandler
));
174 CmiSyncSendAndFree(0, size
, tm
);
176 CmiSetHandler(&m
, pva(sizeHandler
));
177 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
181 static void startNextSize(EmptyMsg
*msg
)
187 //CmiAssert(CmiMyPe()==0);
190 if(pva(nextSize
) == pva(numSizes
)) {
192 CmiSetHandler(&m
, pva(nbrHandler
));
193 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
195 int size
= sizeof(Message
)+sizes
[pva(nextSize
)].size
;
197 buffer_msgs
= (char*)malloc((sizes
[pva(nextSize
)].numiter
) * sizeof(Message
*));
198 for(i
=0; i
<sizes
[pva(nextSize
)].numiter
; i
++)
201 mm
->srcpe
= CmiMyPe();
202 mm
->idx
= pva(nextSize
);
203 CmiSetHandler(mm
, pva(bounceHandler
));
204 //*((Message**)(buffer_msgs+i*sizeof(char*))) = mm;
205 ((Message
**)buffer_msgs
)[i
] = mm
;
207 mm
= (Message
*) CmiAlloc(size
);
208 mm
->srcpe
= CmiMyPe();
209 mm
->idx
= pva(nextSize
);
210 CmiSetHandler(mm
, pva(setupHandler
));
212 CmiSyncSendAndFree(pva(nextNbr
), size
, mm
);
217 static void startNextIter(Message
*msg
)
222 if(pva(nextIter
) >= sizes
[pva(nextSize
)].numiter
) {
223 pva(endtime
) = CmiWallTimer();
225 pva(times
)[pva(nextNbr
)][pva(nextSize
)] =
226 (pva(endtime
) - pva(starttime
))/(2.0*sizes
[pva(nextSize
)].numiter
);
228 CmiSetHandler(&m
, pva(sizeHandler
));
229 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
232 //mm = *((Message**)(buffer_msgs + pva(nextIter)*sizeof(char*)));
233 mm
= ((Message
**)buffer_msgs
)[pva(nextIter
)];
234 mm
->iter
= pva(nextIter
);
235 //CmiSetHandler(mm, pva(bounceHandler));
236 CmiSyncSendAndFree(pva(nextNbr
), sizeof(Message
)+sizes
[mm
->idx
].size
, mm
);
241 static void bounceMessage(Message
*msg
)
244 int iter
= msg
->iter
;
245 mm
= *((Message
**)(buffer_msgs
+ iter
*sizeof(char*)));
246 CmiSetHandler(mm
, pva(iterHandler
));
247 //CmiAssert(msg->srcpe==0);
248 CmiSyncSendAndFree(msg
->srcpe
, sizeof(Message
)+sizes
[msg
->idx
].size
, mm
);
251 static void setupMessage(Message
*msg
)
256 int nextSize
= msg
->idx
;
257 size
= sizeof(Message
)+sizes
[nextSize
].size
;
258 buffer_msgs
= (char*)malloc((sizes
[nextSize
].numiter
) * sizeof(Message
*));
260 for(i
=0; i
<sizes
[nextSize
].numiter
; i
++)
262 mm
= (Message
*)CmiAlloc(size
);
263 mm
->srcpe
= CmiMyPe();
264 CmiSetHandler(mm
, pva(iterHandler
));
265 //mm->idx = pva(nextSize);
266 //*((Message**)buffer_msgs+i*sizeof(char*)) = mm;
267 ((Message
**)buffer_msgs
)[i
] = mm
;
269 mm
= (Message
*) CmiAlloc(size
);
270 mm
->srcpe
= CmiMyPe();
272 CmiSetHandler(mm
, pva(startHandler
));
274 //CmiAssert(msg->srcpe == 0);
275 CmiSyncSendAndFree(msg
->srcpe
, size
, mm
);
278 static void startMessage(Message
*msg
)
285 CmiSetHandler(&m
, pva(iterHandler
));
287 pva(starttime
) = CmiWallTimer();
288 CmiSyncSend(CmiMyPe(), sizeof(EmptyMsg
), &m
);
292 size
= sizeof(Message
)+sizes
[pva(nextSize
)].size
;
293 mm
= (Message
*) CmiAlloc(size
);
294 mm
->srcpe
= CmiMyPe();
295 mm
->idx
= pva(nextSize
);
296 CmiSetHandler(mm
, pva(iterHandler
));
298 pva(starttime
) = CmiWallTimer();
299 CmiSyncSendAndFree(mm
->srcpe
, size
, mm
);
305 void pingpong_init(void)
309 if(CmiNumNodes()==1) {
310 CmiPrintf("[pingpong] This benchmark requires > 1 nodes.\n");
311 CmiSetHandler(&m
, pva(ack_handler
));
312 CmiSyncSend(0, sizeof(EmptyMsg
), &m
);
315 CmiSetHandler(&m
, pva(nbrHandler
));
316 CmiSyncSend(0, sizeof(EmptyMsg
), &m
);
319 void pingpong_moduleinit(void)
330 pvi(double, starttime
);
331 pva(starttime
) = 0.0;
332 pvi(double, endtime
);
335 for(i
=0; sizes
[i
].size
!= (-1); i
++);
337 pvi(double **, times
);
338 pva(times
) = (double **) malloc(CmiNumNodes()*sizeof(double *));
339 for(i
=0;i
<CmiNumNodes();i
++)
340 pva(times
)[i
] = (double *) malloc(pva(numSizes
)*sizeof(double));
341 for(i
=0;i
<CmiNumNodes();i
++)
342 for(j
=0;j
<pva(numSizes
);j
++)
343 pva(times
)[i
][j
] = 0.0;
344 pvi(int *, nodeList
);
345 pva(nodeList
) = (int *) malloc(CmiNumNodes()*sizeof(int));
346 for(i
=0;i
<CmiNumNodes();i
++)
347 pva(nodeList
)[i
] = CmiNodeFirst(i
);
349 pva(gavg
) = (double *) malloc(sizeof(double)*pva(numSizes
));
351 pva(gmax
) = (double *) malloc(sizeof(double)*pva(numSizes
));
353 pva(gmin
) = (double *) malloc(sizeof(double)*pva(numSizes
));
355 pva(gmaxSrc
) = (int *) malloc(sizeof(int)*pva(numSizes
));
356 pvi(int *, gmaxDest
);
357 pva(gmaxDest
) = (int *) malloc(sizeof(int)*pva(numSizes
));
359 pva(gminSrc
) = (int *) malloc(sizeof(int)*pva(numSizes
));
360 pvi(int *, gminDest
);
361 pva(gminDest
) = (int *) malloc(sizeof(int)*pva(numSizes
));
362 for(i
=0;i
<pva(numSizes
);i
++) {
365 pva(gmin
)[i
] = 1000000000.0;
367 pva(gmaxDest
)[i
] = 0;
369 pva(gminDest
)[i
] = 0;
371 pvi(int, timeHandler
);
372 pva(timeHandler
) = CmiRegisterHandler((CmiHandler
)recvTime
);
373 pvi(int, nodeHandler
);
374 pva(nodeHandler
) = CmiRegisterHandler((CmiHandler
)startNextNode
);
375 pvi(int, nbrHandler
);
376 pva(nbrHandler
) = CmiRegisterHandler((CmiHandler
)startNextNbr
);
377 pvi(int, sizeHandler
);
378 pva(sizeHandler
) = CmiRegisterHandler((CmiHandler
)startNextSize
);
379 pvi(int, iterHandler
);
380 pva(iterHandler
) = CmiRegisterHandler((CmiHandler
)startNextIter
);
381 pvi(int, bounceHandler
);
382 pva(bounceHandler
) = CmiRegisterHandler((CmiHandler
)bounceMessage
);
383 pvi(int, setupHandler
);
384 pva(setupHandler
) = CmiRegisterHandler((CmiHandler
)setupMessage
);
385 pvi(int, startHandler
);
386 pva(startHandler
) = CmiRegisterHandler((CmiHandler
)startMessage
);