PetscErrorCode PetscLogEventBeginDefault(PetscLogEvent event, int t, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) { StageLog stageLog; EventPerfLog eventLog; int stage; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); ierr = StageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); ierr = StageLogGetEventPerfLog(stageLog, stage, &eventLog);CHKERRQ(ierr); /* Check for double counting */ eventLog->eventInfo[event].depth++; if (eventLog->eventInfo[event].depth > 1) PetscFunctionReturn(0); /* Log performance info */ eventLog->eventInfo[event].count++; PetscTimeSubtract(eventLog->eventInfo[event].time); #if defined(PETSC_HAVE_CHUD) eventLog->eventInfo[event].flops -= chudGetPMCEventCount(chudCPU1Dev,PMC_1); #elif defined(PETSC_HAVE_PAPI) { long_long values[2]; ierr = PAPI_read(PAPIEventSet,values);CHKERRQ(ierr); eventLog->eventInfo[event].flops -= values[0]; /* printf("fma %g flops %g\n",(double)values[1],(double)values[0]); */ } #else eventLog->eventInfo[event].flops -= _TotalFlops; #endif eventLog->eventInfo[event].numMessages -= irecv_ct + isend_ct + recv_ct + send_ct; eventLog->eventInfo[event].messageLength -= irecv_len + isend_len + recv_len + send_len; eventLog->eventInfo[event].numReductions -= allreduce_ct; PetscFunctionReturn(0); }
/*@C PetscStageLogPop - This function pops a stage from the stack. Not Collective Input Parameter: . stageLog - The PetscStageLog Usage: If the option -log_sumary is used to run the program containing the following code, then 2 sets of summary data will be printed during PetscFinalize(). .vb PetscInitialize(int *argc,char ***args,0,0); [stage 0 of code] PetscStageLogPush(stageLog,1); [stage 1 of code] PetscStageLogPop(stageLog); PetscBarrier(...); [more stage 0 of code] PetscFinalize(); .ve Notes: Use PetscStageLogRegister() to register a stage. Level: developer .keywords: log, pop, stage .seealso: PetscStageLogPush(), PetscStageLogGetCurrent(), PetscStageLogRegister(), PetscLogGetStageLog() @*/ PetscErrorCode PetscStageLogPop(PetscStageLog stageLog) { int curStage; PetscBool empty; PetscErrorCode ierr; PetscFunctionBegin; /* Record flops/time of current stage */ ierr = PetscIntStackPop(stageLog->stack, &curStage);CHKERRQ(ierr); if (stageLog->stageInfo[curStage].perfInfo.active) { PetscTimeAdd(stageLog->stageInfo[curStage].perfInfo.time); stageLog->stageInfo[curStage].perfInfo.flops += petsc_TotalFlops; stageLog->stageInfo[curStage].perfInfo.numMessages += petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; stageLog->stageInfo[curStage].perfInfo.messageLength += petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; stageLog->stageInfo[curStage].perfInfo.numReductions += petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; } ierr = PetscIntStackEmpty(stageLog->stack, &empty);CHKERRQ(ierr); if (!empty) { /* Subtract current quantities so that we obtain the difference when we pop */ ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr); if (stageLog->stageInfo[curStage].perfInfo.active) { PetscTimeSubtract(stageLog->stageInfo[curStage].perfInfo.time); stageLog->stageInfo[curStage].perfInfo.flops -= petsc_TotalFlops; stageLog->stageInfo[curStage].perfInfo.numMessages -= petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; stageLog->stageInfo[curStage].perfInfo.messageLength -= petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; stageLog->stageInfo[curStage].perfInfo.numReductions -= petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; } stageLog->curStage = curStage; } else { stageLog->curStage = -1; } PetscFunctionReturn(0); }
PetscErrorCode PetscLogEventBeginDefault(PetscLogEvent event,int t,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4) { PetscStageLog stageLog; PetscEventPerfLog eventLog = NULL; int stage; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); ierr = PetscStageLogGetCurrent(stageLog,&stage);CHKERRQ(ierr); ierr = PetscStageLogGetEventPerfLog(stageLog,stage,&eventLog);CHKERRQ(ierr); /* Check for double counting */ eventLog->eventInfo[event].depth++; if (eventLog->eventInfo[event].depth > 1) PetscFunctionReturn(0); /* Log performance info */ eventLog->eventInfo[event].count++; eventLog->eventInfo[event].timeTmp = 0.0; PetscTimeSubtract(&eventLog->eventInfo[event].timeTmp); eventLog->eventInfo[event].flopsTmp = 0.0; eventLog->eventInfo[event].flopsTmp -= petsc_TotalFlops; eventLog->eventInfo[event].numMessages -= petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; eventLog->eventInfo[event].messageLength -= petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; eventLog->eventInfo[event].numReductions -= petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; PetscFunctionReturn(0); }
/*@C PetscStageLogPush - This function pushes a stage on the stack. Not Collective Input Parameters: + stageLog - The PetscStageLog - stage - The stage to log Database Options: . -log_summary - Activates logging Usage: If the option -log_sumary is used to run the program containing the following code, then 2 sets of summary data will be printed during PetscFinalize(). .vb PetscInitialize(int *argc,char ***args,0,0); [stage 0 of code] PetscStageLogPush(stageLog,1); [stage 1 of code] PetscStageLogPop(stageLog); PetscBarrier(...); [more stage 0 of code] PetscFinalize(); .ve Notes: Use PetscLogStageRegister() to register a stage. All previous stages are accumulating time and flops, but events will only be logged in this stage. Level: developer .keywords: log, push, stage .seealso: PetscStageLogPop(), PetscStageLogGetCurrent(), PetscStageLogRegister(), PetscLogGetStageLog() @*/ PetscErrorCode PetscStageLogPush(PetscStageLog stageLog, int stage) { int curStage = 0; PetscBool empty; PetscErrorCode ierr; PetscFunctionBegin; if ((stage < 0) || (stage >= stageLog->numStages)) { SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d should be in [0,%d)", stage, stageLog->numStages); } /* Record flops/time of previous stage */ ierr = PetscIntStackEmpty(stageLog->stack, &empty);CHKERRQ(ierr); if (!empty) { ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr); if (stageLog->stageInfo[curStage].perfInfo.active) { PetscTimeAdd(stageLog->stageInfo[curStage].perfInfo.time); stageLog->stageInfo[curStage].perfInfo.flops += petsc_TotalFlops; stageLog->stageInfo[curStage].perfInfo.numMessages += petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; stageLog->stageInfo[curStage].perfInfo.messageLength += petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; stageLog->stageInfo[curStage].perfInfo.numReductions += petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; } } /* Activate the stage */ ierr = PetscIntStackPush(stageLog->stack, stage);CHKERRQ(ierr); stageLog->stageInfo[stage].used = PETSC_TRUE; stageLog->stageInfo[stage].perfInfo.count++; stageLog->curStage = stage; /* Subtract current quantities so that we obtain the difference when we pop */ if (stageLog->stageInfo[stage].perfInfo.active) { PetscTimeSubtract(stageLog->stageInfo[stage].perfInfo.time); stageLog->stageInfo[stage].perfInfo.flops -= petsc_TotalFlops; stageLog->stageInfo[stage].perfInfo.numMessages -= petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; stageLog->stageInfo[stage].perfInfo.messageLength -= petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; stageLog->stageInfo[stage].perfInfo.numReductions -= petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; } PetscFunctionReturn(0); }
PetscErrorCode PetscLogEventBeginDefault(PetscLogEvent event, int t, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) { PetscStageLog stageLog; PetscEventPerfLog eventLog = NULL; int stage; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscLogGetStageLog(&stageLog); CHKERRQ(ierr); ierr = PetscStageLogGetCurrent(stageLog, &stage); CHKERRQ(ierr); ierr = PetscStageLogGetEventPerfLog(stageLog, stage, &eventLog); CHKERRQ(ierr); /* Check for double counting */ eventLog->eventInfo[event].depth++; if (eventLog->eventInfo[event].depth > 1) PetscFunctionReturn(0); /* Log performance info */ eventLog->eventInfo[event].count++; eventLog->eventInfo[event].timeTmp = 0.0; PetscTimeSubtract(&eventLog->eventInfo[event].timeTmp); eventLog->eventInfo[event].flopsTmp = 0.0; #if defined(PETSC_HAVE_PAPI) { long_long values[2]; ierr = PAPI_read(PAPIEventSet,values); CHKERRQ(ierr); eventLog->eventInfo[event].flopsTmp -= values[0]; /* printf("fma %g flops %g\n",(double)values[1],(double)values[0]); */ } #else eventLog->eventInfo[event].flopsTmp -= petsc_TotalFlops; #endif eventLog->eventInfo[event].numMessages -= petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct; eventLog->eventInfo[event].messageLength -= petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len; eventLog->eventInfo[event].numReductions -= petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; PetscFunctionReturn(0); }