14 #include "CollectionMaster.decl.h"
24 if (CkpvAccess(CollectionMaster_instance) == 0) {
25 CkpvAccess(CollectionMaster_instance) =
this;
27 DebugM(1,
"CollectionMaster::CollectionMaster() - another instance of CollectionMaster exists!\n");
31 #ifdef MEM_OPT_VERSION
35 parOut =
new ParOutput();
38 posTimings = 10; velTimings = forceTimings = 5;
48 #ifndef MEM_OPT_VERSION
61 #ifndef MEM_OPT_VERSION
71 #ifndef MEM_OPT_VERSION
72 DebugM(3,
"Collected positions at " << c->
seq << std::endl);
78 double exectime = CmiWallTimer();
82 exectime = CmiWallTimer()-exectime;
84 CkPrintf(
"The last position output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
93 #ifndef MEM_OPT_VERSION
106 #ifndef MEM_OPT_VERSION
116 #ifndef MEM_OPT_VERSION
117 DebugM(3,
"Collected velocities at " << c->
seq << std::endl);
121 double exectime = CmiWallTimer();
125 exectime = CmiWallTimer()-exectime;
127 CkPrintf(
"The last velocity output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
136 #ifndef MEM_OPT_VERSION
149 #ifndef MEM_OPT_VERSION
159 #ifndef MEM_OPT_VERSION
160 DebugM(3,
"Collected forces at " << c->
seq << std::endl);
164 double exectime = CmiWallTimer();
168 exectime = CmiWallTimer()-exectime;
169 if ( forceTimings ) {
170 CkPrintf(
"The last force output (seq=%d) takes %.3f seconds, %.3f MB of memory in use\n", seq, exectime, mem);
178 if ( ! dataStreamFile ) {
183 CkPrintf(
"Info: OPENING AUXILIARY DATA STREAM FILE %s\n", fname);
185 dataStreamFile = fopen(fname,
"w");
186 if ( ! dataStreamFile )
187 NAMD_die(
"Can't open auxiliary data stream file!");
189 fprintf(dataStreamFile,
"%s",msg->
data.
begin());
190 fflush(dataStreamFile);
204 #ifdef MEM_OPT_VERSION
205 positions.submitData(seq);
211 #ifdef MEM_OPT_VERSION
218 #ifdef MEM_OPT_VERSION
226 #ifdef MEM_OPT_VERSION
228 if(totalT > posIOTime) posIOTime = totalT;
230 #ifndef OUTPUT_SINGLE_FILE
231 #error OUTPUT_SINGLE_FILE not defined!
234 #if OUTPUT_SINGLE_FILE
235 if(++posDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
237 if(++posDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
247 positions.removeFirstReady();
249 posOutTime = CmiWallTimer()-posOutTime;
251 CkPrintf(
"The last position output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, posOutTime, posIOTime, mem);
262 #ifdef MEM_OPT_VERSION
264 if(totalT > velIOTime) velIOTime = totalT;
266 #if OUTPUT_SINGLE_FILE
267 if(++velDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
269 if(++velDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
279 velocities.removeFirstReady();
281 velOutTime = CmiWallTimer()-velOutTime;
283 CkPrintf(
"The last velocity output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, velOutTime, velIOTime, mem);
294 #ifdef MEM_OPT_VERSION
296 if(totalT > forceIOTime) forceIOTime = totalT;
298 #if OUTPUT_SINGLE_FILE
299 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputwrts)
return;
301 if(++forceDoneCnt <
Node::Object()->simParameters->numoutputprocs)
return;
311 forces.removeFirstReady();
313 forceOutTime = CmiWallTimer()-forceOutTime;
314 if ( forceTimings ) {
315 CkPrintf(
"The last force output (seq=%d) takes %.3f seconds(file I/O: %.3f secs), %.3f MB of memory in use\n", seq, forceOutTime, forceIOTime, mem);
327 #ifdef MEM_OPT_VERSION
328 if(++wrapCoorDoneCnt ==
Node::Object()->simParameters->numoutputprocs){
332 posIOTime = CmiWallTimer()-posOutTime;
337 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
340 #if OUTPUT_SINGLE_FILE
342 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
343 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
346 for(i=0; i<remains; i++){
347 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
348 outrank += (grpsize+1);
350 for(; i<ioMgr->numOutputWrts; i++){
351 io[ioMgr->outputProcArray[outrank]].disposePositions(c->
seq, posIOTime);
356 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
357 io[ioMgr->outputProcArray[i]].disposePositions(c->
seq, posIOTime);
365 #ifdef MEM_OPT_VERSION
366 void CollectionMaster::checkPosReady(){
367 CollectVectorInstance *c;
368 if((c = positions.getReady())){
375 posOutTime = CmiWallTimer();
377 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
380 for(
int i=0; i<ioMgr->numOutputProcs; i++){
381 io[ioMgr->outputProcArray[i]].
wrapCoor(c->seq, c->lattice);
389 posIOTime = CmiWallTimer() - posOutTime;
391 #if OUTPUT_SINGLE_FILE
392 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
393 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
396 for(i=0; i<remains; i++){
397 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
398 outrank += (grpsize+1);
400 for(; i<ioMgr->numOutputWrts; i++){
401 io[ioMgr->outputProcArray[outrank]].disposePositions(c->seq, posIOTime);
406 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
407 io[ioMgr->outputProcArray[i]].disposePositions(c->seq, posIOTime);
415 void CollectionMaster::checkVelReady(){
416 CollectVectorInstance *c;
417 if((c = velocities.getReady())){
425 velOutTime = CmiWallTimer();
428 velIOTime = CmiWallTimer() - velOutTime;
431 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
434 #if OUTPUT_SINGLE_FILE
435 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
436 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
439 for(i=0; i<remains; i++){
440 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
441 outrank += (grpsize+1);
443 for(; i<ioMgr->numOutputWrts; i++){
444 io[ioMgr->outputProcArray[outrank]].disposeVelocities(c->seq, velIOTime);
449 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
450 io[ioMgr->outputProcArray[i]].disposeVelocities(c->seq, velIOTime);
457 void CollectionMaster::checkForceReady(){
458 CollectVectorInstance *c;
459 if((c = forces.getReady())){
467 forceOutTime = CmiWallTimer();
470 forceIOTime = CmiWallTimer() - forceOutTime;
473 CProxy_ParallelIOMgr io(CkpvAccess(BOCclass_group).ioMgr);
476 #if OUTPUT_SINGLE_FILE
477 int grpsize = ioMgr->numOutputProcs / ioMgr->numOutputWrts;
478 int remains = ioMgr->numOutputProcs % ioMgr->numOutputWrts;
481 for(i=0; i<remains; i++){
482 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
483 outrank += (grpsize+1);
485 for(; i<ioMgr->numOutputWrts; i++){
486 io[ioMgr->outputProcArray[outrank]].disposeForces(c->seq, forceIOTime);
491 for(
int i=0; i<ioMgr->numOutputProcs; i++) {
492 io[ioMgr->outputProcArray[i]].disposeForces(c->seq, forceIOTime);
500 void CollectionMidMaster::disposePositions(
int seq)
502 CollectMidVectorInstance *c = positions.getReady(seq);
504 parOut->coordinateSlave(seq,c->fromAtomID,c->toAtomID,
505 c->data.begin(),c->fdata.begin());
509 void CollectionMidMaster::disposeVelocities(
int seq)
511 CollectMidVectorInstance *c = velocities.getReady(seq);
513 parOut->velocitySlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
517 void CollectionMidMaster::disposeForces(
int seq)
519 CollectMidVectorInstance *c =
forces.getReady(seq);
521 parOut->forceSlave(seq,c->fromAtomID,c->toAtomID,c->data.begin());
526 #include "CollectionMaster.def.h"
CollectVectorInstance * removeReady(void)
void disposeForces(CollectVectorInstance *c)
void receiveVelocities(CollectVectorMsg *msg)
SimParameters * simParameters
void receivePositions(CollectVectorMsg *msg)
static __thread float4 * forces
void enqueueVelocities(int seq)
void receiveOutputPosReady(int seq)
void submitData(CollectVectorMsg *msg, int max_index)
void enqueue(int seq, Lattice &lattice)
void coordinate(int, int, Vector *, FloatVector *, Lattice &)
char auxFilename[NAMD_FILENAME_BUFFER_SIZE]
void startNextRoundOutputPos(double totalT)
#define PACK_MSG(MSGTYPE, MSGDATA)
void enqueuePositions(int seq, Lattice &lattice)
void wrapCoor(int seq, Lattice lat)
void receiveDataStream(DataStreamMsg *msg)
void receiveOutputVelReady(int seq)
void disposePositions(CollectVectorInstance *c)
void velocity(int, int, Vector *)
ResizeArray< FloatVector > fdata
void startNextRoundOutputVel(double totalT)
void NAMD_die(const char *err_msg)
void receiveForces(CollectVectorMsg *msg)
void disposeVelocities(CollectVectorInstance *c)
void NAMD_backup_file(const char *filename, const char *extension)
ResizeArray< Vector > data
#define PACK_RESIZE(DATA)
void startNextRoundOutputForce(double totalT)
void enqueueForces(int seq)
void force(int, int, Vector *)
void receiveOutputForceReady(int seq)