1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith /* 3*5c6c1daeSBarry Smith PETSc code to log object creation and destruction and PETSc events. 4*5c6c1daeSBarry Smith 5*5c6c1daeSBarry Smith This provides the public API used by the rest of PETSc and by users. 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith These routines use a private API that is not used elsewhere in PETSc and is not 8*5c6c1daeSBarry Smith accessible to users. The private API is defined in logimpl.h and the utils directory. 9*5c6c1daeSBarry Smith 10*5c6c1daeSBarry Smith */ 11*5c6c1daeSBarry Smith #include <petscsys.h> /*I "petscsys.h" I*/ 12*5c6c1daeSBarry Smith #include <petsctime.h> 13*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPE) 14*5c6c1daeSBarry Smith #include <mpe.h> 15*5c6c1daeSBarry Smith #endif 16*5c6c1daeSBarry Smith #include <stdarg.h> 17*5c6c1daeSBarry Smith #include <sys/types.h> 18*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 19*5c6c1daeSBarry Smith #include <stdlib.h> 20*5c6c1daeSBarry Smith #endif 21*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_MALLOC_H) 22*5c6c1daeSBarry Smith #include <malloc.h> 23*5c6c1daeSBarry Smith #endif 24*5c6c1daeSBarry Smith #include <petsc-private/logimpl.h> 25*5c6c1daeSBarry Smith #include <petscthreadcomm.h> 26*5c6c1daeSBarry Smith 27*5c6c1daeSBarry Smith PetscLogEvent PETSC_LARGEST_EVENT = PETSC_EVENT; 28*5c6c1daeSBarry Smith 29*5c6c1daeSBarry Smith #if defined(PETSC_CLANGUAGE_CXX) && !defined(PETSC_USE_EXTERN_CXX) 30*5c6c1daeSBarry Smith std::map<std::string,PETSc::LogEvent> PETSc::Log::event_registry; 31*5c6c1daeSBarry Smith std::map<std::string,PETSc::LogStage> PETSc::Log::stage_registry; 32*5c6c1daeSBarry Smith #endif 33*5c6c1daeSBarry Smith 34*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 35*5c6c1daeSBarry Smith #include <petscmachineinfo.h> 36*5c6c1daeSBarry Smith #include <petscconfiginfo.h> 37*5c6c1daeSBarry Smith 38*5c6c1daeSBarry Smith /* used in the MPI_XXX() count macros in petsclog.h */ 39*5c6c1daeSBarry Smith 40*5c6c1daeSBarry Smith /* Action and object logging variables */ 41*5c6c1daeSBarry Smith Action *petsc_actions = PETSC_NULL; 42*5c6c1daeSBarry Smith Object *petsc_objects = PETSC_NULL; 43*5c6c1daeSBarry Smith PetscBool petsc_logActions = PETSC_FALSE; 44*5c6c1daeSBarry Smith PetscBool petsc_logObjects = PETSC_FALSE; 45*5c6c1daeSBarry Smith int petsc_numActions = 0, petsc_maxActions = 100; 46*5c6c1daeSBarry Smith int petsc_numObjects = 0, petsc_maxObjects = 100; 47*5c6c1daeSBarry Smith int petsc_numObjectsDestroyed = 0; 48*5c6c1daeSBarry Smith 49*5c6c1daeSBarry Smith /* Global counters */ 50*5c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime = 0.0; 51*5c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops = 0.0; /* The number of flops */ 52*5c6c1daeSBarry Smith PetscLogDouble petsc_tmp_flops = 0.0; /* The incremental number of flops */ 53*5c6c1daeSBarry Smith PetscLogDouble petsc_send_ct = 0.0; /* The number of sends */ 54*5c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct = 0.0; /* The number of receives */ 55*5c6c1daeSBarry Smith PetscLogDouble petsc_send_len = 0.0; /* The total length of all sent messages */ 56*5c6c1daeSBarry Smith PetscLogDouble petsc_recv_len = 0.0; /* The total length of all received messages */ 57*5c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct = 0.0; /* The number of immediate sends */ 58*5c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct = 0.0; /* The number of immediate receives */ 59*5c6c1daeSBarry Smith PetscLogDouble petsc_isend_len = 0.0; /* The total length of all immediate send messages */ 60*5c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len = 0.0; /* The total length of all immediate receive messages */ 61*5c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct = 0.0; /* The number of waits */ 62*5c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct = 0.0; /* The number of anywaits */ 63*5c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct = 0.0; /* The number of waitalls */ 64*5c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */ 65*5c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct = 0.0; /* The number of reductions */ 66*5c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct = 0.0; /* The number of gathers and gathervs */ 67*5c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct = 0.0; /* The number of scatters and scattervs */ 68*5c6c1daeSBarry Smith 69*5c6c1daeSBarry Smith /* Logging functions */ 70*5c6c1daeSBarry Smith PetscErrorCode (*PetscLogPHC)(PetscObject) = PETSC_NULL; 71*5c6c1daeSBarry Smith PetscErrorCode (*PetscLogPHD)(PetscObject) = PETSC_NULL; 72*5c6c1daeSBarry Smith PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = PETSC_NULL; 73*5c6c1daeSBarry Smith PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = PETSC_NULL; 74*5c6c1daeSBarry Smith 75*5c6c1daeSBarry Smith /* Tracing event logging variables */ 76*5c6c1daeSBarry Smith FILE *petsc_tracefile = PETSC_NULL; 77*5c6c1daeSBarry Smith int petsc_tracelevel = 0; 78*5c6c1daeSBarry Smith const char *petsc_traceblanks = " "; 79*5c6c1daeSBarry Smith char petsc_tracespace[128] = " "; 80*5c6c1daeSBarry Smith PetscLogDouble petsc_tracetime = 0.0; 81*5c6c1daeSBarry Smith static PetscBool PetscLogBegin_PrivateCalled = PETSC_FALSE; 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith /*---------------------------------------------- General Functions --------------------------------------------------*/ 84*5c6c1daeSBarry Smith #undef __FUNCT__ 85*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogDestroy" 86*5c6c1daeSBarry Smith /*@C 87*5c6c1daeSBarry Smith PetscLogDestroy - Destroys the object and event logging data and resets the global counters. 88*5c6c1daeSBarry Smith 89*5c6c1daeSBarry Smith Not Collective 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith Notes: 92*5c6c1daeSBarry Smith This routine should not usually be used by programmers. Instead employ 93*5c6c1daeSBarry Smith PetscLogStagePush() and PetscLogStagePop(). 94*5c6c1daeSBarry Smith 95*5c6c1daeSBarry Smith Level: developer 96*5c6c1daeSBarry Smith 97*5c6c1daeSBarry Smith .keywords: log, destroy 98*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogStagePush(), PlogStagePop() 99*5c6c1daeSBarry Smith @*/ 100*5c6c1daeSBarry Smith PetscErrorCode PetscLogDestroy(void) 101*5c6c1daeSBarry Smith { 102*5c6c1daeSBarry Smith PetscStageLog stageLog; 103*5c6c1daeSBarry Smith PetscErrorCode ierr; 104*5c6c1daeSBarry Smith 105*5c6c1daeSBarry Smith PetscFunctionBegin; 106*5c6c1daeSBarry Smith ierr = PetscFree(petsc_actions);CHKERRQ(ierr); 107*5c6c1daeSBarry Smith ierr = PetscFree(petsc_objects);CHKERRQ(ierr); 108*5c6c1daeSBarry Smith ierr = PetscLogSet(PETSC_NULL, PETSC_NULL);CHKERRQ(ierr); 109*5c6c1daeSBarry Smith 110*5c6c1daeSBarry Smith /* Resetting phase */ 111*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 112*5c6c1daeSBarry Smith ierr = PetscStageLogDestroy(stageLog);CHKERRQ(ierr); 113*5c6c1daeSBarry Smith petsc_TotalFlops = 0.0; 114*5c6c1daeSBarry Smith petsc_numActions = 0; 115*5c6c1daeSBarry Smith petsc_numObjects = 0; 116*5c6c1daeSBarry Smith petsc_numObjectsDestroyed = 0; 117*5c6c1daeSBarry Smith petsc_maxActions = 100; 118*5c6c1daeSBarry Smith petsc_maxObjects = 100; 119*5c6c1daeSBarry Smith petsc_actions = PETSC_NULL; 120*5c6c1daeSBarry Smith petsc_objects = PETSC_NULL; 121*5c6c1daeSBarry Smith petsc_logActions = PETSC_FALSE; 122*5c6c1daeSBarry Smith petsc_logObjects = PETSC_FALSE; 123*5c6c1daeSBarry Smith petsc_BaseTime = 0.0; 124*5c6c1daeSBarry Smith petsc_TotalFlops = 0.0; 125*5c6c1daeSBarry Smith petsc_tmp_flops = 0.0; 126*5c6c1daeSBarry Smith petsc_send_ct = 0.0; 127*5c6c1daeSBarry Smith petsc_recv_ct = 0.0; 128*5c6c1daeSBarry Smith petsc_send_len = 0.0; 129*5c6c1daeSBarry Smith petsc_recv_len = 0.0; 130*5c6c1daeSBarry Smith petsc_isend_ct = 0.0; 131*5c6c1daeSBarry Smith petsc_irecv_ct = 0.0; 132*5c6c1daeSBarry Smith petsc_isend_len = 0.0; 133*5c6c1daeSBarry Smith petsc_irecv_len = 0.0; 134*5c6c1daeSBarry Smith petsc_wait_ct = 0.0; 135*5c6c1daeSBarry Smith petsc_wait_any_ct = 0.0; 136*5c6c1daeSBarry Smith petsc_wait_all_ct = 0.0; 137*5c6c1daeSBarry Smith petsc_sum_of_waits_ct = 0.0; 138*5c6c1daeSBarry Smith petsc_allreduce_ct = 0.0; 139*5c6c1daeSBarry Smith petsc_gather_ct = 0.0; 140*5c6c1daeSBarry Smith petsc_scatter_ct = 0.0; 141*5c6c1daeSBarry Smith PETSC_LARGEST_EVENT = PETSC_EVENT; 142*5c6c1daeSBarry Smith PetscLogPHC = PETSC_NULL; 143*5c6c1daeSBarry Smith PetscLogPHD = PETSC_NULL; 144*5c6c1daeSBarry Smith petsc_tracefile = PETSC_NULL; 145*5c6c1daeSBarry Smith petsc_tracelevel = 0; 146*5c6c1daeSBarry Smith petsc_traceblanks = " "; 147*5c6c1daeSBarry Smith petsc_tracespace[0] = ' '; petsc_tracespace[1] = 0; 148*5c6c1daeSBarry Smith petsc_tracetime = 0.0; 149*5c6c1daeSBarry Smith PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 150*5c6c1daeSBarry Smith PETSC_OBJECT_CLASSID = 0; 151*5c6c1daeSBarry Smith petsc_stageLog = 0; 152*5c6c1daeSBarry Smith PetscLogBegin_PrivateCalled = PETSC_FALSE; 153*5c6c1daeSBarry Smith PetscFunctionReturn(0); 154*5c6c1daeSBarry Smith } 155*5c6c1daeSBarry Smith 156*5c6c1daeSBarry Smith #undef __FUNCT__ 157*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogSet" 158*5c6c1daeSBarry Smith /*@C 159*5c6c1daeSBarry Smith PetscLogSet - Sets the logging functions called at the beginning and ending of every event. 160*5c6c1daeSBarry Smith 161*5c6c1daeSBarry Smith Not Collective 162*5c6c1daeSBarry Smith 163*5c6c1daeSBarry Smith Input Parameters: 164*5c6c1daeSBarry Smith + b - The function called at beginning of event 165*5c6c1daeSBarry Smith - e - The function called at end of event 166*5c6c1daeSBarry Smith 167*5c6c1daeSBarry Smith Level: developer 168*5c6c1daeSBarry Smith 169*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogBegin(), PetscLogAllBegin(), PetscLogTraceBegin() 170*5c6c1daeSBarry Smith @*/ 171*5c6c1daeSBarry Smith PetscErrorCode PetscLogSet(PetscErrorCode (*b)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), 172*5c6c1daeSBarry Smith PetscErrorCode (*e)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject)) 173*5c6c1daeSBarry Smith { 174*5c6c1daeSBarry Smith PetscFunctionBegin; 175*5c6c1daeSBarry Smith PetscLogPLB = b; 176*5c6c1daeSBarry Smith PetscLogPLE = e; 177*5c6c1daeSBarry Smith PetscFunctionReturn(0); 178*5c6c1daeSBarry Smith } 179*5c6c1daeSBarry Smith 180*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_CHUD) 181*5c6c1daeSBarry Smith #include <CHUD/CHUD.h> 182*5c6c1daeSBarry Smith #endif 183*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_PAPI) 184*5c6c1daeSBarry Smith #include <papi.h> 185*5c6c1daeSBarry Smith int PAPIEventSet = PAPI_NULL; 186*5c6c1daeSBarry Smith #endif 187*5c6c1daeSBarry Smith 188*5c6c1daeSBarry Smith /*------------------------------------------- Initialization Functions ----------------------------------------------*/ 189*5c6c1daeSBarry Smith #undef __FUNCT__ 190*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogBegin_Private" 191*5c6c1daeSBarry Smith PetscErrorCode PetscLogBegin_Private(void) 192*5c6c1daeSBarry Smith { 193*5c6c1daeSBarry Smith int stage; 194*5c6c1daeSBarry Smith PetscBool opt; 195*5c6c1daeSBarry Smith PetscErrorCode ierr; 196*5c6c1daeSBarry Smith 197*5c6c1daeSBarry Smith PetscFunctionBegin; 198*5c6c1daeSBarry Smith if (PetscLogBegin_PrivateCalled) PetscFunctionReturn(0); 199*5c6c1daeSBarry Smith PetscLogBegin_PrivateCalled = PETSC_TRUE; 200*5c6c1daeSBarry Smith 201*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL, "-log_exclude_actions", &opt);CHKERRQ(ierr); 202*5c6c1daeSBarry Smith if (opt) { 203*5c6c1daeSBarry Smith petsc_logActions = PETSC_FALSE; 204*5c6c1daeSBarry Smith } 205*5c6c1daeSBarry Smith ierr = PetscOptionsHasName(PETSC_NULL, "-log_exclude_objects", &opt);CHKERRQ(ierr); 206*5c6c1daeSBarry Smith if (opt) { 207*5c6c1daeSBarry Smith petsc_logObjects = PETSC_FALSE; 208*5c6c1daeSBarry Smith } 209*5c6c1daeSBarry Smith if (petsc_logActions) { 210*5c6c1daeSBarry Smith ierr = PetscMalloc(petsc_maxActions * sizeof(Action), &petsc_actions);CHKERRQ(ierr); 211*5c6c1daeSBarry Smith } 212*5c6c1daeSBarry Smith if (petsc_logObjects) { 213*5c6c1daeSBarry Smith ierr = PetscMalloc(petsc_maxObjects * sizeof(Object), &petsc_objects);CHKERRQ(ierr); 214*5c6c1daeSBarry Smith } 215*5c6c1daeSBarry Smith PetscLogPHC = PetscLogObjCreateDefault; 216*5c6c1daeSBarry Smith PetscLogPHD = PetscLogObjDestroyDefault; 217*5c6c1daeSBarry Smith /* Setup default logging structures */ 218*5c6c1daeSBarry Smith ierr = PetscStageLogCreate(&petsc_stageLog);CHKERRQ(ierr); 219*5c6c1daeSBarry Smith ierr = PetscStageLogRegister(petsc_stageLog, "Main Stage", &stage);CHKERRQ(ierr); 220*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_CHUD) 221*5c6c1daeSBarry Smith ierr = chudInitialize();CHKERRQ(ierr); 222*5c6c1daeSBarry Smith ierr = chudAcquireSamplingFacility(CHUD_BLOCKING);CHKERRQ(ierr); 223*5c6c1daeSBarry Smith ierr = chudSetSamplingDevice(chudCPU1Dev);CHKERRQ(ierr); 224*5c6c1daeSBarry Smith ierr = chudSetStartDelay(0,chudNanoSeconds);CHKERRQ(ierr); 225*5c6c1daeSBarry Smith ierr = chudClearPMCMode(chudCPU1Dev,chudUnused);CHKERRQ(ierr); 226*5c6c1daeSBarry Smith ierr = chudClearPMCs();CHKERRQ(ierr); 227*5c6c1daeSBarry Smith /* ierr = chudSetPMCMuxPosition(chudCPU1Dev,0,0);CHKERRQ(ierr); */ 228*5c6c1daeSBarry Smith printf("%s\n",chudGetEventName(chudCPU1Dev,PMC_1,193)); 229*5c6c1daeSBarry Smith printf("%s\n",chudGetEventDescription(chudCPU1Dev,PMC_1,193)); 230*5c6c1daeSBarry Smith printf("%s\n",chudGetEventNotes(chudCPU1Dev,PMC_1,193)); 231*5c6c1daeSBarry Smith ierr = chudSetPMCEvent(chudCPU1Dev,PMC_1,193);CHKERRQ(ierr); 232*5c6c1daeSBarry Smith ierr = chudSetPMCMode(chudCPU1Dev,PMC_1,chudCounter);CHKERRQ(ierr); 233*5c6c1daeSBarry Smith ierr = chudSetPrivilegeFilter(chudCPU1Dev,PMC_1,chudCountUserEvents);CHKERRQ(ierr); 234*5c6c1daeSBarry Smith ierr = chudSetPMCEventMask(chudCPU1Dev,PMC_1,0xFE);CHKERRQ(ierr); 235*5c6c1daeSBarry Smith if (!chudIsEventValid(chudCPU1Dev,PMC_1,193)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Event is not valid %d",193); 236*5c6c1daeSBarry Smith ierr = chudStartPMCs();CHKERRQ(ierr); 237*5c6c1daeSBarry Smith #endif 238*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_PAPI) 239*5c6c1daeSBarry Smith ierr = PAPI_library_init(PAPI_VER_CURRENT); 240*5c6c1daeSBarry Smith if (ierr != PAPI_VER_CURRENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot initialize PAPI"); 241*5c6c1daeSBarry Smith ierr = PAPI_query_event(PAPI_FP_INS);CHKERRQ(ierr); 242*5c6c1daeSBarry Smith ierr = PAPI_create_eventset(&PAPIEventSet);CHKERRQ(ierr); 243*5c6c1daeSBarry Smith ierr = PAPI_add_event(PAPIEventSet,PAPI_FP_INS);CHKERRQ(ierr); 244*5c6c1daeSBarry Smith ierr = PAPI_start(PAPIEventSet);CHKERRQ(ierr); 245*5c6c1daeSBarry Smith #endif 246*5c6c1daeSBarry Smith 247*5c6c1daeSBarry Smith /* All processors sync here for more consistent logging */ 248*5c6c1daeSBarry Smith ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr); 249*5c6c1daeSBarry Smith PetscTime(petsc_BaseTime); 250*5c6c1daeSBarry Smith ierr = PetscLogStagePush(stage);CHKERRQ(ierr); 251*5c6c1daeSBarry Smith PetscFunctionReturn(0); 252*5c6c1daeSBarry Smith } 253*5c6c1daeSBarry Smith 254*5c6c1daeSBarry Smith #undef __FUNCT__ 255*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogBegin" 256*5c6c1daeSBarry Smith /*@C 257*5c6c1daeSBarry Smith PetscLogBegin - Turns on logging of objects and events. This logs flop 258*5c6c1daeSBarry Smith rates and object creation and should not slow programs down too much. 259*5c6c1daeSBarry Smith This routine may be called more than once. 260*5c6c1daeSBarry Smith 261*5c6c1daeSBarry Smith Logically Collective over PETSC_COMM_WORLD 262*5c6c1daeSBarry Smith 263*5c6c1daeSBarry Smith Options Database Keys: 264*5c6c1daeSBarry Smith + -log_summary - Prints summary of flop and timing information to the 265*5c6c1daeSBarry Smith screen (for code compiled with PETSC_USE_LOG) 266*5c6c1daeSBarry Smith - -log - Prints detailed log information (for code compiled with PETSC_USE_LOG) 267*5c6c1daeSBarry Smith 268*5c6c1daeSBarry Smith Usage: 269*5c6c1daeSBarry Smith .vb 270*5c6c1daeSBarry Smith PetscInitialize(...); 271*5c6c1daeSBarry Smith PetscLogBegin(); 272*5c6c1daeSBarry Smith ... code ... 273*5c6c1daeSBarry Smith PetscLogView(viewer); or PetscLogDump(); 274*5c6c1daeSBarry Smith PetscFinalize(); 275*5c6c1daeSBarry Smith .ve 276*5c6c1daeSBarry Smith 277*5c6c1daeSBarry Smith Notes: 278*5c6c1daeSBarry Smith PetscLogView(viewer) or PetscLogDump() actually cause the printing of 279*5c6c1daeSBarry Smith the logging information. 280*5c6c1daeSBarry Smith 281*5c6c1daeSBarry Smith Level: advanced 282*5c6c1daeSBarry Smith 283*5c6c1daeSBarry Smith .keywords: log, begin 284*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogTraceBegin() 285*5c6c1daeSBarry Smith @*/ 286*5c6c1daeSBarry Smith PetscErrorCode PetscLogBegin(void) 287*5c6c1daeSBarry Smith { 288*5c6c1daeSBarry Smith PetscErrorCode ierr; 289*5c6c1daeSBarry Smith 290*5c6c1daeSBarry Smith PetscFunctionBegin; 291*5c6c1daeSBarry Smith ierr = PetscLogSet(PetscLogEventBeginDefault, PetscLogEventEndDefault);CHKERRQ(ierr); 292*5c6c1daeSBarry Smith ierr = PetscLogBegin_Private();CHKERRQ(ierr); 293*5c6c1daeSBarry Smith PetscFunctionReturn(0); 294*5c6c1daeSBarry Smith } 295*5c6c1daeSBarry Smith 296*5c6c1daeSBarry Smith #undef __FUNCT__ 297*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogAllBegin" 298*5c6c1daeSBarry Smith /*@C 299*5c6c1daeSBarry Smith PetscLogAllBegin - Turns on extensive logging of objects and events. Logs 300*5c6c1daeSBarry Smith all events. This creates large log files and slows the program down. 301*5c6c1daeSBarry Smith 302*5c6c1daeSBarry Smith Logically Collective on PETSC_COMM_WORLD 303*5c6c1daeSBarry Smith 304*5c6c1daeSBarry Smith Options Database Keys: 305*5c6c1daeSBarry Smith . -log_all - Prints extensive log information (for code compiled with PETSC_USE_LOG) 306*5c6c1daeSBarry Smith 307*5c6c1daeSBarry Smith Usage: 308*5c6c1daeSBarry Smith .vb 309*5c6c1daeSBarry Smith PetscInitialize(...); 310*5c6c1daeSBarry Smith PetscLogAllBegin(); 311*5c6c1daeSBarry Smith ... code ... 312*5c6c1daeSBarry Smith PetscLogDump(filename); 313*5c6c1daeSBarry Smith PetscFinalize(); 314*5c6c1daeSBarry Smith .ve 315*5c6c1daeSBarry Smith 316*5c6c1daeSBarry Smith Notes: 317*5c6c1daeSBarry Smith A related routine is PetscLogBegin (with the options key -log), which is 318*5c6c1daeSBarry Smith intended for production runs since it logs only flop rates and object 319*5c6c1daeSBarry Smith creation (and shouldn't significantly slow the programs). 320*5c6c1daeSBarry Smith 321*5c6c1daeSBarry Smith Level: advanced 322*5c6c1daeSBarry Smith 323*5c6c1daeSBarry Smith .keywords: log, all, begin 324*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogBegin(), PetscLogTraceBegin() 325*5c6c1daeSBarry Smith @*/ 326*5c6c1daeSBarry Smith PetscErrorCode PetscLogAllBegin(void) 327*5c6c1daeSBarry Smith { 328*5c6c1daeSBarry Smith PetscErrorCode ierr; 329*5c6c1daeSBarry Smith 330*5c6c1daeSBarry Smith PetscFunctionBegin; 331*5c6c1daeSBarry Smith ierr = PetscLogSet(PetscLogEventBeginComplete, PetscLogEventEndComplete);CHKERRQ(ierr); 332*5c6c1daeSBarry Smith ierr = PetscLogBegin_Private();CHKERRQ(ierr); 333*5c6c1daeSBarry Smith PetscFunctionReturn(0); 334*5c6c1daeSBarry Smith } 335*5c6c1daeSBarry Smith 336*5c6c1daeSBarry Smith #undef __FUNCT__ 337*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogTraceBegin" 338*5c6c1daeSBarry Smith /*@ 339*5c6c1daeSBarry Smith PetscLogTraceBegin - Activates trace logging. Every time a PETSc event 340*5c6c1daeSBarry Smith begins or ends, the event name is printed. 341*5c6c1daeSBarry Smith 342*5c6c1daeSBarry Smith Logically Collective on PETSC_COMM_WORLD 343*5c6c1daeSBarry Smith 344*5c6c1daeSBarry Smith Input Parameter: 345*5c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout) 346*5c6c1daeSBarry Smith 347*5c6c1daeSBarry Smith Options Database Key: 348*5c6c1daeSBarry Smith . -log_trace [filename] - Activates PetscLogTraceBegin() 349*5c6c1daeSBarry Smith 350*5c6c1daeSBarry Smith Notes: 351*5c6c1daeSBarry Smith PetscLogTraceBegin() prints the processor number, the execution time (sec), 352*5c6c1daeSBarry Smith then "Event begin:" or "Event end:" followed by the event name. 353*5c6c1daeSBarry Smith 354*5c6c1daeSBarry Smith PetscLogTraceBegin() allows tracing of all PETSc calls, which is useful 355*5c6c1daeSBarry Smith to determine where a program is hanging without running in the 356*5c6c1daeSBarry Smith debugger. Can be used in conjunction with the -info option. 357*5c6c1daeSBarry Smith 358*5c6c1daeSBarry Smith Level: intermediate 359*5c6c1daeSBarry Smith 360*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogBegin() 361*5c6c1daeSBarry Smith @*/ 362*5c6c1daeSBarry Smith PetscErrorCode PetscLogTraceBegin(FILE *file) 363*5c6c1daeSBarry Smith { 364*5c6c1daeSBarry Smith PetscErrorCode ierr; 365*5c6c1daeSBarry Smith 366*5c6c1daeSBarry Smith PetscFunctionBegin; 367*5c6c1daeSBarry Smith petsc_tracefile = file; 368*5c6c1daeSBarry Smith ierr = PetscLogSet(PetscLogEventBeginTrace, PetscLogEventEndTrace);CHKERRQ(ierr); 369*5c6c1daeSBarry Smith ierr = PetscLogBegin_Private();CHKERRQ(ierr); 370*5c6c1daeSBarry Smith PetscFunctionReturn(0); 371*5c6c1daeSBarry Smith } 372*5c6c1daeSBarry Smith 373*5c6c1daeSBarry Smith #undef __FUNCT__ 374*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogActions" 375*5c6c1daeSBarry Smith /*@ 376*5c6c1daeSBarry Smith PetscLogActions - Determines whether actions are logged for the graphical viewer. 377*5c6c1daeSBarry Smith 378*5c6c1daeSBarry Smith Not Collective 379*5c6c1daeSBarry Smith 380*5c6c1daeSBarry Smith Input Parameter: 381*5c6c1daeSBarry Smith . flag - PETSC_TRUE if actions are to be logged 382*5c6c1daeSBarry Smith 383*5c6c1daeSBarry Smith Level: intermediate 384*5c6c1daeSBarry Smith 385*5c6c1daeSBarry Smith Note: Logging of actions continues to consume more memory as the program 386*5c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 387*5c6c1daeSBarry Smith 388*5c6c1daeSBarry Smith Options Database Keys: 389*5c6c1daeSBarry Smith . -log_exclude_actions - Turns off actions logging 390*5c6c1daeSBarry Smith 391*5c6c1daeSBarry Smith .keywords: log, stage, register 392*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop() 393*5c6c1daeSBarry Smith @*/ 394*5c6c1daeSBarry Smith PetscErrorCode PetscLogActions(PetscBool flag) 395*5c6c1daeSBarry Smith { 396*5c6c1daeSBarry Smith PetscFunctionBegin; 397*5c6c1daeSBarry Smith petsc_logActions = flag; 398*5c6c1daeSBarry Smith PetscFunctionReturn(0); 399*5c6c1daeSBarry Smith } 400*5c6c1daeSBarry Smith 401*5c6c1daeSBarry Smith #undef __FUNCT__ 402*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjects" 403*5c6c1daeSBarry Smith /*@ 404*5c6c1daeSBarry Smith PetscLogObjects - Determines whether objects are logged for the graphical viewer. 405*5c6c1daeSBarry Smith 406*5c6c1daeSBarry Smith Not Collective 407*5c6c1daeSBarry Smith 408*5c6c1daeSBarry Smith Input Parameter: 409*5c6c1daeSBarry Smith . flag - PETSC_TRUE if objects are to be logged 410*5c6c1daeSBarry Smith 411*5c6c1daeSBarry Smith Level: intermediate 412*5c6c1daeSBarry Smith 413*5c6c1daeSBarry Smith Note: Logging of objects continues to consume more memory as the program 414*5c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 415*5c6c1daeSBarry Smith 416*5c6c1daeSBarry Smith Options Database Keys: 417*5c6c1daeSBarry Smith . -log_exclude_objects - Turns off objects logging 418*5c6c1daeSBarry Smith 419*5c6c1daeSBarry Smith .keywords: log, stage, register 420*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop() 421*5c6c1daeSBarry Smith @*/ 422*5c6c1daeSBarry Smith PetscErrorCode PetscLogObjects(PetscBool flag) 423*5c6c1daeSBarry Smith { 424*5c6c1daeSBarry Smith PetscFunctionBegin; 425*5c6c1daeSBarry Smith petsc_logObjects = flag; 426*5c6c1daeSBarry Smith PetscFunctionReturn(0); 427*5c6c1daeSBarry Smith } 428*5c6c1daeSBarry Smith 429*5c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/ 430*5c6c1daeSBarry Smith #undef __FUNCT__ 431*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageRegister" 432*5c6c1daeSBarry Smith /*@C 433*5c6c1daeSBarry Smith PetscLogStageRegister - Attaches a charactor string name to a logging stage. 434*5c6c1daeSBarry Smith 435*5c6c1daeSBarry Smith Not Collective 436*5c6c1daeSBarry Smith 437*5c6c1daeSBarry Smith Input Parameter: 438*5c6c1daeSBarry Smith . sname - The name to associate with that stage 439*5c6c1daeSBarry Smith 440*5c6c1daeSBarry Smith Output Parameter: 441*5c6c1daeSBarry Smith . stage - The stage number 442*5c6c1daeSBarry Smith 443*5c6c1daeSBarry Smith Level: intermediate 444*5c6c1daeSBarry Smith 445*5c6c1daeSBarry Smith .keywords: log, stage, register 446*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop() 447*5c6c1daeSBarry Smith @*/ 448*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageRegister(const char sname[],PetscLogStage *stage) 449*5c6c1daeSBarry Smith { 450*5c6c1daeSBarry Smith PetscStageLog stageLog; 451*5c6c1daeSBarry Smith PetscLogEvent event; 452*5c6c1daeSBarry Smith PetscErrorCode ierr; 453*5c6c1daeSBarry Smith 454*5c6c1daeSBarry Smith PetscFunctionBegin; 455*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 456*5c6c1daeSBarry Smith ierr = PetscStageLogRegister(stageLog, sname, stage);CHKERRQ(ierr); 457*5c6c1daeSBarry Smith /* Copy events already changed in the main stage, this sucks */ 458*5c6c1daeSBarry Smith ierr = EventPerfLogEnsureSize(stageLog->stageInfo[*stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr); 459*5c6c1daeSBarry Smith for (event = 0; event < stageLog->eventLog->numEvents; event++) { 460*5c6c1daeSBarry Smith ierr = EventPerfInfoCopy(&stageLog->stageInfo[0].eventLog->eventInfo[event],&stageLog->stageInfo[*stage].eventLog->eventInfo[event]);CHKERRQ(ierr); 461*5c6c1daeSBarry Smith } 462*5c6c1daeSBarry Smith ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[*stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 463*5c6c1daeSBarry Smith PetscFunctionReturn(0); 464*5c6c1daeSBarry Smith } 465*5c6c1daeSBarry Smith 466*5c6c1daeSBarry Smith #undef __FUNCT__ 467*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStagePush" 468*5c6c1daeSBarry Smith /*@C 469*5c6c1daeSBarry Smith PetscLogStagePush - This function pushes a stage on the stack. 470*5c6c1daeSBarry Smith 471*5c6c1daeSBarry Smith Not Collective 472*5c6c1daeSBarry Smith 473*5c6c1daeSBarry Smith Input Parameter: 474*5c6c1daeSBarry Smith . stage - The stage on which to log 475*5c6c1daeSBarry Smith 476*5c6c1daeSBarry Smith Usage: 477*5c6c1daeSBarry Smith If the option -log_sumary is used to run the program containing the 478*5c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 479*5c6c1daeSBarry Smith PetscFinalize(). 480*5c6c1daeSBarry Smith .vb 481*5c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 482*5c6c1daeSBarry Smith [stage 0 of code] 483*5c6c1daeSBarry Smith PetscLogStagePush(1); 484*5c6c1daeSBarry Smith [stage 1 of code] 485*5c6c1daeSBarry Smith PetscLogStagePop(); 486*5c6c1daeSBarry Smith PetscBarrier(...); 487*5c6c1daeSBarry Smith [more stage 0 of code] 488*5c6c1daeSBarry Smith PetscFinalize(); 489*5c6c1daeSBarry Smith .ve 490*5c6c1daeSBarry Smith 491*5c6c1daeSBarry Smith Notes: 492*5c6c1daeSBarry Smith Use PetscLogStageRegister() to register a stage. 493*5c6c1daeSBarry Smith 494*5c6c1daeSBarry Smith Level: intermediate 495*5c6c1daeSBarry Smith 496*5c6c1daeSBarry Smith .keywords: log, push, stage 497*5c6c1daeSBarry Smith .seealso: PetscLogStagePop(), PetscLogStageRegister(), PetscBarrier() 498*5c6c1daeSBarry Smith @*/ 499*5c6c1daeSBarry Smith PetscErrorCode PetscLogStagePush(PetscLogStage stage) 500*5c6c1daeSBarry Smith { 501*5c6c1daeSBarry Smith PetscStageLog stageLog; 502*5c6c1daeSBarry Smith PetscErrorCode ierr; 503*5c6c1daeSBarry Smith 504*5c6c1daeSBarry Smith PetscFunctionBegin; 505*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 506*5c6c1daeSBarry Smith ierr = PetscStageLogPush(stageLog, stage);CHKERRQ(ierr); 507*5c6c1daeSBarry Smith PetscFunctionReturn(0); 508*5c6c1daeSBarry Smith } 509*5c6c1daeSBarry Smith 510*5c6c1daeSBarry Smith #undef __FUNCT__ 511*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStagePop" 512*5c6c1daeSBarry Smith /*@C 513*5c6c1daeSBarry Smith PetscLogStagePop - This function pops a stage from the stack. 514*5c6c1daeSBarry Smith 515*5c6c1daeSBarry Smith Not Collective 516*5c6c1daeSBarry Smith 517*5c6c1daeSBarry Smith Usage: 518*5c6c1daeSBarry Smith If the option -log_sumary is used to run the program containing the 519*5c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 520*5c6c1daeSBarry Smith PetscFinalize(). 521*5c6c1daeSBarry Smith .vb 522*5c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 523*5c6c1daeSBarry Smith [stage 0 of code] 524*5c6c1daeSBarry Smith PetscLogStagePush(1); 525*5c6c1daeSBarry Smith [stage 1 of code] 526*5c6c1daeSBarry Smith PetscLogStagePop(); 527*5c6c1daeSBarry Smith PetscBarrier(...); 528*5c6c1daeSBarry Smith [more stage 0 of code] 529*5c6c1daeSBarry Smith PetscFinalize(); 530*5c6c1daeSBarry Smith .ve 531*5c6c1daeSBarry Smith 532*5c6c1daeSBarry Smith Notes: 533*5c6c1daeSBarry Smith Use PetscLogStageRegister() to register a stage. 534*5c6c1daeSBarry Smith 535*5c6c1daeSBarry Smith Level: intermediate 536*5c6c1daeSBarry Smith 537*5c6c1daeSBarry Smith .keywords: log, pop, stage 538*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStageRegister(), PetscBarrier() 539*5c6c1daeSBarry Smith @*/ 540*5c6c1daeSBarry Smith PetscErrorCode PetscLogStagePop(void) 541*5c6c1daeSBarry Smith { 542*5c6c1daeSBarry Smith PetscStageLog stageLog; 543*5c6c1daeSBarry Smith PetscErrorCode ierr; 544*5c6c1daeSBarry Smith 545*5c6c1daeSBarry Smith PetscFunctionBegin; 546*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 547*5c6c1daeSBarry Smith ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 548*5c6c1daeSBarry Smith PetscFunctionReturn(0); 549*5c6c1daeSBarry Smith } 550*5c6c1daeSBarry Smith 551*5c6c1daeSBarry Smith #undef __FUNCT__ 552*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageSetActive" 553*5c6c1daeSBarry Smith /*@ 554*5c6c1daeSBarry Smith PetscLogStageSetActive - Determines stage activity for PetscLogEventBegin() and PetscLogEventEnd(). 555*5c6c1daeSBarry Smith 556*5c6c1daeSBarry Smith Not Collective 557*5c6c1daeSBarry Smith 558*5c6c1daeSBarry Smith Input Parameters: 559*5c6c1daeSBarry Smith + stage - The stage 560*5c6c1daeSBarry Smith - isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE) 561*5c6c1daeSBarry Smith 562*5c6c1daeSBarry Smith Level: intermediate 563*5c6c1daeSBarry Smith 564*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 565*5c6c1daeSBarry Smith @*/ 566*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive) 567*5c6c1daeSBarry Smith { 568*5c6c1daeSBarry Smith PetscStageLog stageLog; 569*5c6c1daeSBarry Smith PetscErrorCode ierr; 570*5c6c1daeSBarry Smith 571*5c6c1daeSBarry Smith PetscFunctionBegin; 572*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 573*5c6c1daeSBarry Smith ierr = PetscStageLogSetActive(stageLog, stage, isActive);CHKERRQ(ierr); 574*5c6c1daeSBarry Smith PetscFunctionReturn(0); 575*5c6c1daeSBarry Smith } 576*5c6c1daeSBarry Smith 577*5c6c1daeSBarry Smith #undef __FUNCT__ 578*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetActive" 579*5c6c1daeSBarry Smith /*@ 580*5c6c1daeSBarry Smith PetscLogStageGetActive - Returns stage activity for PetscLogEventBegin() and PetscLogEventEnd(). 581*5c6c1daeSBarry Smith 582*5c6c1daeSBarry Smith Not Collective 583*5c6c1daeSBarry Smith 584*5c6c1daeSBarry Smith Input Parameter: 585*5c6c1daeSBarry Smith . stage - The stage 586*5c6c1daeSBarry Smith 587*5c6c1daeSBarry Smith Output Parameter: 588*5c6c1daeSBarry Smith . isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE) 589*5c6c1daeSBarry Smith 590*5c6c1daeSBarry Smith Level: intermediate 591*5c6c1daeSBarry Smith 592*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 593*5c6c1daeSBarry Smith @*/ 594*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive) 595*5c6c1daeSBarry Smith { 596*5c6c1daeSBarry Smith PetscStageLog stageLog; 597*5c6c1daeSBarry Smith PetscErrorCode ierr; 598*5c6c1daeSBarry Smith 599*5c6c1daeSBarry Smith PetscFunctionBegin; 600*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 601*5c6c1daeSBarry Smith ierr = PetscStageLogGetActive(stageLog, stage, isActive);CHKERRQ(ierr); 602*5c6c1daeSBarry Smith PetscFunctionReturn(0); 603*5c6c1daeSBarry Smith } 604*5c6c1daeSBarry Smith 605*5c6c1daeSBarry Smith #undef __FUNCT__ 606*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageSetVisible" 607*5c6c1daeSBarry Smith /*@ 608*5c6c1daeSBarry Smith PetscLogStageSetVisible - Determines stage visibility in PetscLogView() 609*5c6c1daeSBarry Smith 610*5c6c1daeSBarry Smith Not Collective 611*5c6c1daeSBarry Smith 612*5c6c1daeSBarry Smith Input Parameters: 613*5c6c1daeSBarry Smith + stage - The stage 614*5c6c1daeSBarry Smith - isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE) 615*5c6c1daeSBarry Smith 616*5c6c1daeSBarry Smith Level: intermediate 617*5c6c1daeSBarry Smith 618*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView() 619*5c6c1daeSBarry Smith @*/ 620*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible) 621*5c6c1daeSBarry Smith { 622*5c6c1daeSBarry Smith PetscStageLog stageLog; 623*5c6c1daeSBarry Smith PetscErrorCode ierr; 624*5c6c1daeSBarry Smith 625*5c6c1daeSBarry Smith PetscFunctionBegin; 626*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 627*5c6c1daeSBarry Smith ierr = PetscStageLogSetVisible(stageLog, stage, isVisible);CHKERRQ(ierr); 628*5c6c1daeSBarry Smith PetscFunctionReturn(0); 629*5c6c1daeSBarry Smith } 630*5c6c1daeSBarry Smith 631*5c6c1daeSBarry Smith #undef __FUNCT__ 632*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetVisible" 633*5c6c1daeSBarry Smith /*@ 634*5c6c1daeSBarry Smith PetscLogStageGetVisible - Returns stage visibility in PetscLogView() 635*5c6c1daeSBarry Smith 636*5c6c1daeSBarry Smith Not Collective 637*5c6c1daeSBarry Smith 638*5c6c1daeSBarry Smith Input Parameter: 639*5c6c1daeSBarry Smith . stage - The stage 640*5c6c1daeSBarry Smith 641*5c6c1daeSBarry Smith Output Parameter: 642*5c6c1daeSBarry Smith . isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE) 643*5c6c1daeSBarry Smith 644*5c6c1daeSBarry Smith Level: intermediate 645*5c6c1daeSBarry Smith 646*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView() 647*5c6c1daeSBarry Smith @*/ 648*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible) 649*5c6c1daeSBarry Smith { 650*5c6c1daeSBarry Smith PetscStageLog stageLog; 651*5c6c1daeSBarry Smith PetscErrorCode ierr; 652*5c6c1daeSBarry Smith 653*5c6c1daeSBarry Smith PetscFunctionBegin; 654*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 655*5c6c1daeSBarry Smith ierr = PetscStageLogGetVisible(stageLog, stage, isVisible);CHKERRQ(ierr); 656*5c6c1daeSBarry Smith PetscFunctionReturn(0); 657*5c6c1daeSBarry Smith } 658*5c6c1daeSBarry Smith 659*5c6c1daeSBarry Smith #undef __FUNCT__ 660*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetId" 661*5c6c1daeSBarry Smith /*@C 662*5c6c1daeSBarry Smith PetscLogStageGetId - Returns the stage id when given the stage name. 663*5c6c1daeSBarry Smith 664*5c6c1daeSBarry Smith Not Collective 665*5c6c1daeSBarry Smith 666*5c6c1daeSBarry Smith Input Parameter: 667*5c6c1daeSBarry Smith . name - The stage name 668*5c6c1daeSBarry Smith 669*5c6c1daeSBarry Smith Output Parameter: 670*5c6c1daeSBarry Smith . stage - The stage 671*5c6c1daeSBarry Smith 672*5c6c1daeSBarry Smith Level: intermediate 673*5c6c1daeSBarry Smith 674*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 675*5c6c1daeSBarry Smith @*/ 676*5c6c1daeSBarry Smith PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage) 677*5c6c1daeSBarry Smith { 678*5c6c1daeSBarry Smith PetscStageLog stageLog; 679*5c6c1daeSBarry Smith PetscErrorCode ierr; 680*5c6c1daeSBarry Smith 681*5c6c1daeSBarry Smith PetscFunctionBegin; 682*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 683*5c6c1daeSBarry Smith ierr = PetscStageLogGetStage(stageLog, name, stage);CHKERRQ(ierr); 684*5c6c1daeSBarry Smith PetscFunctionReturn(0); 685*5c6c1daeSBarry Smith } 686*5c6c1daeSBarry Smith 687*5c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/ 688*5c6c1daeSBarry Smith #undef __FUNCT__ 689*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventRegister" 690*5c6c1daeSBarry Smith /*@C 691*5c6c1daeSBarry Smith PetscLogEventRegister - Registers an event name for logging operations in an application code. 692*5c6c1daeSBarry Smith 693*5c6c1daeSBarry Smith Not Collective 694*5c6c1daeSBarry Smith 695*5c6c1daeSBarry Smith Input Parameter: 696*5c6c1daeSBarry Smith + name - The name associated with the event 697*5c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with 698*5c6c1daeSBarry Smith PetscClassIdRegister() or use a predefined one such as KSP_CLASSID, SNES_CLASSID, the predefined ones 699*5c6c1daeSBarry Smith are only available in C code 700*5c6c1daeSBarry Smith 701*5c6c1daeSBarry Smith Output Parameter: 702*5c6c1daeSBarry Smith . event - The event id for use with PetscLogEventBegin() and PetscLogEventEnd(). 703*5c6c1daeSBarry Smith 704*5c6c1daeSBarry Smith Example of Usage: 705*5c6c1daeSBarry Smith .vb 706*5c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 707*5c6c1daeSBarry Smith PetscClassId classid; 708*5c6c1daeSBarry Smith PetscLogDouble user_event_flops; 709*5c6c1daeSBarry Smith PetscClassIdRegister("class name",&classid); 710*5c6c1daeSBarry Smith PetscLogEventRegister("User event name",classid,&USER_EVENT); 711*5c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 712*5c6c1daeSBarry Smith [code segment to monitor] 713*5c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 714*5c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 715*5c6c1daeSBarry Smith .ve 716*5c6c1daeSBarry Smith 717*5c6c1daeSBarry Smith Notes: 718*5c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 719*5c6c1daeSBarry Smith compiled with -DPETSC_USE_LOG (which is the default) and -log, 720*5c6c1daeSBarry Smith -log_summary, or -log_all are specified. PetscLogEventRegister() is 721*5c6c1daeSBarry Smith intended for logging user events to supplement this PETSc 722*5c6c1daeSBarry Smith information. 723*5c6c1daeSBarry Smith 724*5c6c1daeSBarry Smith PETSc can gather data for use with the utilities Upshot/Nupshot 725*5c6c1daeSBarry Smith (part of the MPICH distribution). If PETSc has been compiled 726*5c6c1daeSBarry Smith with flag -DPETSC_HAVE_MPE (MPE is an additional utility within 727*5c6c1daeSBarry Smith MPICH), the user can employ another command line option, -log_mpe, 728*5c6c1daeSBarry Smith to create a logfile, "mpe.log", which can be visualized 729*5c6c1daeSBarry Smith Upshot/Nupshot. 730*5c6c1daeSBarry Smith 731*5c6c1daeSBarry Smith The classid is associated with each event so that classes of events 732*5c6c1daeSBarry Smith can be disabled simultaneously, such as all matrix events. The user 733*5c6c1daeSBarry Smith can either use an existing classid, such as MAT_CLASSID, or create 734*5c6c1daeSBarry Smith their own as shown in the example. 735*5c6c1daeSBarry Smith 736*5c6c1daeSBarry Smith Level: intermediate 737*5c6c1daeSBarry Smith 738*5c6c1daeSBarry Smith .keywords: log, event, register 739*5c6c1daeSBarry Smith .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogFlops(), 740*5c6c1daeSBarry Smith PetscLogEventMPEActivate(), PetscLogEventMPEDeactivate(), 741*5c6c1daeSBarry Smith PetscLogEventActivate(), PetscLogEventDeactivate(), PetscClassIdRegister() 742*5c6c1daeSBarry Smith @*/ 743*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventRegister(const char name[],PetscClassId classid,PetscLogEvent *event) 744*5c6c1daeSBarry Smith { 745*5c6c1daeSBarry Smith PetscStageLog stageLog; 746*5c6c1daeSBarry Smith int stage; 747*5c6c1daeSBarry Smith PetscErrorCode ierr; 748*5c6c1daeSBarry Smith 749*5c6c1daeSBarry Smith PetscFunctionBegin; 750*5c6c1daeSBarry Smith *event = PETSC_DECIDE; 751*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 752*5c6c1daeSBarry Smith ierr = EventRegLogRegister(stageLog->eventLog, name, classid, event);CHKERRQ(ierr); 753*5c6c1daeSBarry Smith for (stage = 0; stage < stageLog->numStages; stage++) { 754*5c6c1daeSBarry Smith ierr = EventPerfLogEnsureSize(stageLog->stageInfo[stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr); 755*5c6c1daeSBarry Smith ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 756*5c6c1daeSBarry Smith } 757*5c6c1daeSBarry Smith PetscFunctionReturn(0); 758*5c6c1daeSBarry Smith } 759*5c6c1daeSBarry Smith 760*5c6c1daeSBarry Smith #undef __FUNCT__ 761*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventActivate" 762*5c6c1daeSBarry Smith /*@ 763*5c6c1daeSBarry Smith PetscLogEventActivate - Indicates that a particular event should be logged. 764*5c6c1daeSBarry Smith 765*5c6c1daeSBarry Smith Not Collective 766*5c6c1daeSBarry Smith 767*5c6c1daeSBarry Smith Input Parameter: 768*5c6c1daeSBarry Smith . event - The event id 769*5c6c1daeSBarry Smith 770*5c6c1daeSBarry Smith Usage: 771*5c6c1daeSBarry Smith .vb 772*5c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 773*5c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 774*5c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 775*5c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 776*5c6c1daeSBarry Smith .ve 777*5c6c1daeSBarry Smith 778*5c6c1daeSBarry Smith Note: 779*5c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in include/petsclog.h) 780*5c6c1daeSBarry Smith or an event number obtained with PetscLogEventRegister(). 781*5c6c1daeSBarry Smith 782*5c6c1daeSBarry Smith Level: advanced 783*5c6c1daeSBarry Smith 784*5c6c1daeSBarry Smith .keywords: log, event, activate 785*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventDeactivate() 786*5c6c1daeSBarry Smith @*/ 787*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventActivate(PetscLogEvent event) 788*5c6c1daeSBarry Smith { 789*5c6c1daeSBarry Smith PetscStageLog stageLog; 790*5c6c1daeSBarry Smith int stage; 791*5c6c1daeSBarry Smith PetscErrorCode ierr; 792*5c6c1daeSBarry Smith 793*5c6c1daeSBarry Smith PetscFunctionBegin; 794*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 795*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 796*5c6c1daeSBarry Smith ierr = EventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 797*5c6c1daeSBarry Smith PetscFunctionReturn(0); 798*5c6c1daeSBarry Smith } 799*5c6c1daeSBarry Smith 800*5c6c1daeSBarry Smith #undef __FUNCT__ 801*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventDeactivate" 802*5c6c1daeSBarry Smith /*@ 803*5c6c1daeSBarry Smith PetscLogEventDeactivate - Indicates that a particular event should not be logged. 804*5c6c1daeSBarry Smith 805*5c6c1daeSBarry Smith Not Collective 806*5c6c1daeSBarry Smith 807*5c6c1daeSBarry Smith Input Parameter: 808*5c6c1daeSBarry Smith . event - The event id 809*5c6c1daeSBarry Smith 810*5c6c1daeSBarry Smith Usage: 811*5c6c1daeSBarry Smith .vb 812*5c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 813*5c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 814*5c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 815*5c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 816*5c6c1daeSBarry Smith .ve 817*5c6c1daeSBarry Smith 818*5c6c1daeSBarry Smith Note: 819*5c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in 820*5c6c1daeSBarry Smith include/petsclog.h) or an event number obtained with PetscLogEventRegister()). 821*5c6c1daeSBarry Smith 822*5c6c1daeSBarry Smith Level: advanced 823*5c6c1daeSBarry Smith 824*5c6c1daeSBarry Smith .keywords: log, event, deactivate 825*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate() 826*5c6c1daeSBarry Smith @*/ 827*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event) 828*5c6c1daeSBarry Smith { 829*5c6c1daeSBarry Smith PetscStageLog stageLog; 830*5c6c1daeSBarry Smith int stage; 831*5c6c1daeSBarry Smith PetscErrorCode ierr; 832*5c6c1daeSBarry Smith 833*5c6c1daeSBarry Smith PetscFunctionBegin; 834*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 835*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 836*5c6c1daeSBarry Smith ierr = EventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 837*5c6c1daeSBarry Smith PetscFunctionReturn(0); 838*5c6c1daeSBarry Smith } 839*5c6c1daeSBarry Smith 840*5c6c1daeSBarry Smith #undef __FUNCT__ 841*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventSetActiveAll" 842*5c6c1daeSBarry Smith /*@ 843*5c6c1daeSBarry Smith PetscLogEventSetActiveAll - Sets the event activity in every stage. 844*5c6c1daeSBarry Smith 845*5c6c1daeSBarry Smith Not Collective 846*5c6c1daeSBarry Smith 847*5c6c1daeSBarry Smith Input Parameters: 848*5c6c1daeSBarry Smith + event - The event id 849*5c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged 850*5c6c1daeSBarry Smith 851*5c6c1daeSBarry Smith Level: advanced 852*5c6c1daeSBarry Smith 853*5c6c1daeSBarry Smith .keywords: log, event, activate 854*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate(),PlogEventDeactivate() 855*5c6c1daeSBarry Smith @*/ 856*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive) 857*5c6c1daeSBarry Smith { 858*5c6c1daeSBarry Smith PetscStageLog stageLog; 859*5c6c1daeSBarry Smith int stage; 860*5c6c1daeSBarry Smith PetscErrorCode ierr; 861*5c6c1daeSBarry Smith 862*5c6c1daeSBarry Smith PetscFunctionBegin; 863*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 864*5c6c1daeSBarry Smith for (stage = 0; stage < stageLog->numStages; stage++) { 865*5c6c1daeSBarry Smith if (isActive) { 866*5c6c1daeSBarry Smith ierr = EventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 867*5c6c1daeSBarry Smith } else { 868*5c6c1daeSBarry Smith ierr = EventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 869*5c6c1daeSBarry Smith } 870*5c6c1daeSBarry Smith } 871*5c6c1daeSBarry Smith PetscFunctionReturn(0); 872*5c6c1daeSBarry Smith } 873*5c6c1daeSBarry Smith 874*5c6c1daeSBarry Smith #undef __FUNCT__ 875*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventActivateClass" 876*5c6c1daeSBarry Smith /*@ 877*5c6c1daeSBarry Smith PetscLogEventActivateClass - Activates event logging for a PETSc object class. 878*5c6c1daeSBarry Smith 879*5c6c1daeSBarry Smith Not Collective 880*5c6c1daeSBarry Smith 881*5c6c1daeSBarry Smith Input Parameter: 882*5c6c1daeSBarry Smith . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc. 883*5c6c1daeSBarry Smith 884*5c6c1daeSBarry Smith Level: developer 885*5c6c1daeSBarry Smith 886*5c6c1daeSBarry Smith .keywords: log, event, activate, class 887*5c6c1daeSBarry Smith .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventDeactivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate() 888*5c6c1daeSBarry Smith @*/ 889*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventActivateClass(PetscClassId classid) 890*5c6c1daeSBarry Smith { 891*5c6c1daeSBarry Smith PetscStageLog stageLog; 892*5c6c1daeSBarry Smith int stage; 893*5c6c1daeSBarry Smith PetscErrorCode ierr; 894*5c6c1daeSBarry Smith 895*5c6c1daeSBarry Smith PetscFunctionBegin; 896*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 897*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 898*5c6c1daeSBarry Smith ierr = EventPerfLogActivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr); 899*5c6c1daeSBarry Smith PetscFunctionReturn(0); 900*5c6c1daeSBarry Smith } 901*5c6c1daeSBarry Smith 902*5c6c1daeSBarry Smith #undef __FUNCT__ 903*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventDeactivateClass" 904*5c6c1daeSBarry Smith /*@ 905*5c6c1daeSBarry Smith PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class. 906*5c6c1daeSBarry Smith 907*5c6c1daeSBarry Smith Not Collective 908*5c6c1daeSBarry Smith 909*5c6c1daeSBarry Smith Input Parameter: 910*5c6c1daeSBarry Smith . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc. 911*5c6c1daeSBarry Smith 912*5c6c1daeSBarry Smith Level: developer 913*5c6c1daeSBarry Smith 914*5c6c1daeSBarry Smith .keywords: log, event, deactivate, class 915*5c6c1daeSBarry Smith .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventActivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate() 916*5c6c1daeSBarry Smith @*/ 917*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid) 918*5c6c1daeSBarry Smith { 919*5c6c1daeSBarry Smith PetscStageLog stageLog; 920*5c6c1daeSBarry Smith int stage; 921*5c6c1daeSBarry Smith PetscErrorCode ierr; 922*5c6c1daeSBarry Smith 923*5c6c1daeSBarry Smith PetscFunctionBegin; 924*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 925*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 926*5c6c1daeSBarry Smith ierr = EventPerfLogDeactivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr); 927*5c6c1daeSBarry Smith PetscFunctionReturn(0); 928*5c6c1daeSBarry Smith } 929*5c6c1daeSBarry Smith 930*5c6c1daeSBarry Smith /*MC 931*5c6c1daeSBarry Smith PetscLogEventBegin - Logs the beginning of a user event. 932*5c6c1daeSBarry Smith 933*5c6c1daeSBarry Smith Synopsis: 934*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 935*5c6c1daeSBarry Smith PetscObject o4) 936*5c6c1daeSBarry Smith 937*5c6c1daeSBarry Smith Not Collective 938*5c6c1daeSBarry Smith 939*5c6c1daeSBarry Smith Input Parameters: 940*5c6c1daeSBarry Smith + e - integer associated with the event obtained from PetscLogEventRegister() 941*5c6c1daeSBarry Smith - o1,o2,o3,o4 - objects associated with the event, or 0 942*5c6c1daeSBarry Smith 943*5c6c1daeSBarry Smith 944*5c6c1daeSBarry Smith Fortran Synopsis: 945*5c6c1daeSBarry Smith void PetscLogEventBegin(int e,PetscErrorCode ierr) 946*5c6c1daeSBarry Smith 947*5c6c1daeSBarry Smith Usage: 948*5c6c1daeSBarry Smith .vb 949*5c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 950*5c6c1daeSBarry Smith PetscLogDouble user_event_flops; 951*5c6c1daeSBarry Smith PetscLogEventRegister("User event",0,&USER_EVENT); 952*5c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 953*5c6c1daeSBarry Smith [code segment to monitor] 954*5c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 955*5c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 956*5c6c1daeSBarry Smith .ve 957*5c6c1daeSBarry Smith 958*5c6c1daeSBarry Smith Notes: 959*5c6c1daeSBarry Smith You need to register each integer event with the command 960*5c6c1daeSBarry Smith PetscLogEventRegister(). The source code must be compiled with 961*5c6c1daeSBarry Smith -DPETSC_USE_LOG, which is the default. 962*5c6c1daeSBarry Smith 963*5c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 964*5c6c1daeSBarry Smith compiled with -DPETSC_USE_LOG, and -log, -log_summary, or -log_all are 965*5c6c1daeSBarry Smith specified. PetscLogEventBegin() is intended for logging user events 966*5c6c1daeSBarry Smith to supplement this PETSc information. 967*5c6c1daeSBarry Smith 968*5c6c1daeSBarry Smith Level: intermediate 969*5c6c1daeSBarry Smith 970*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops() 971*5c6c1daeSBarry Smith 972*5c6c1daeSBarry Smith .keywords: log, event, begin 973*5c6c1daeSBarry Smith M*/ 974*5c6c1daeSBarry Smith 975*5c6c1daeSBarry Smith /*MC 976*5c6c1daeSBarry Smith PetscLogEventEnd - Log the end of a user event. 977*5c6c1daeSBarry Smith 978*5c6c1daeSBarry Smith Synopsis: 979*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 980*5c6c1daeSBarry Smith PetscObject o4) 981*5c6c1daeSBarry Smith 982*5c6c1daeSBarry Smith Not Collective 983*5c6c1daeSBarry Smith 984*5c6c1daeSBarry Smith Input Parameters: 985*5c6c1daeSBarry Smith + e - integer associated with the event obtained with PetscLogEventRegister() 986*5c6c1daeSBarry Smith - o1,o2,o3,o4 - objects associated with the event, or 0 987*5c6c1daeSBarry Smith 988*5c6c1daeSBarry Smith 989*5c6c1daeSBarry Smith Fortran Synopsis: 990*5c6c1daeSBarry Smith void PetscLogEventEnd(int e,PetscErrorCode ierr) 991*5c6c1daeSBarry Smith 992*5c6c1daeSBarry Smith Usage: 993*5c6c1daeSBarry Smith .vb 994*5c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 995*5c6c1daeSBarry Smith PetscLogDouble user_event_flops; 996*5c6c1daeSBarry Smith PetscLogEventRegister("User event",0,&USER_EVENT,); 997*5c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 998*5c6c1daeSBarry Smith [code segment to monitor] 999*5c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 1000*5c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 1001*5c6c1daeSBarry Smith .ve 1002*5c6c1daeSBarry Smith 1003*5c6c1daeSBarry Smith Notes: 1004*5c6c1daeSBarry Smith You should also register each additional integer event with the command 1005*5c6c1daeSBarry Smith PetscLogEventRegister(). Source code must be compiled with 1006*5c6c1daeSBarry Smith -DPETSC_USE_LOG, which is the default. 1007*5c6c1daeSBarry Smith 1008*5c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 1009*5c6c1daeSBarry Smith compiled with -DPETSC_USE_LOG, and -log, -log_summary, or -log_all are 1010*5c6c1daeSBarry Smith specified. PetscLogEventEnd() is intended for logging user events 1011*5c6c1daeSBarry Smith to supplement this PETSc information. 1012*5c6c1daeSBarry Smith 1013*5c6c1daeSBarry Smith Level: intermediate 1014*5c6c1daeSBarry Smith 1015*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogFlops() 1016*5c6c1daeSBarry Smith 1017*5c6c1daeSBarry Smith .keywords: log, event, end 1018*5c6c1daeSBarry Smith M*/ 1019*5c6c1daeSBarry Smith 1020*5c6c1daeSBarry Smith /*MC 1021*5c6c1daeSBarry Smith PetscLogEventBarrierBegin - Logs the time in a barrier before an event. 1022*5c6c1daeSBarry Smith 1023*5c6c1daeSBarry Smith Synopsis: 1024*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 1025*5c6c1daeSBarry Smith PetscObject o4,MPI_Comm comm) 1026*5c6c1daeSBarry Smith 1027*5c6c1daeSBarry Smith Not Collective 1028*5c6c1daeSBarry Smith 1029*5c6c1daeSBarry Smith Input Parameters: 1030*5c6c1daeSBarry Smith . e - integer associated with the event obtained from PetscLogEventRegister() 1031*5c6c1daeSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 1032*5c6c1daeSBarry Smith . comm - communicator the barrier takes place over 1033*5c6c1daeSBarry Smith 1034*5c6c1daeSBarry Smith 1035*5c6c1daeSBarry Smith Usage: 1036*5c6c1daeSBarry Smith .vb 1037*5c6c1daeSBarry Smith PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 1038*5c6c1daeSBarry Smith MPI_Allreduce() 1039*5c6c1daeSBarry Smith PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 1040*5c6c1daeSBarry Smith .ve 1041*5c6c1daeSBarry Smith 1042*5c6c1daeSBarry Smith Notes: 1043*5c6c1daeSBarry Smith This is for logging the amount of time spent in a barrier for an event 1044*5c6c1daeSBarry Smith that requires synchronization. 1045*5c6c1daeSBarry Smith 1046*5c6c1daeSBarry Smith Additional Notes: 1047*5c6c1daeSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 1048*5c6c1daeSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 1049*5c6c1daeSBarry Smith 1050*5c6c1daeSBarry Smith Level: advanced 1051*5c6c1daeSBarry Smith 1052*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(), 1053*5c6c1daeSBarry Smith PetscLogEventBarrierEnd() 1054*5c6c1daeSBarry Smith 1055*5c6c1daeSBarry Smith .keywords: log, event, begin, barrier 1056*5c6c1daeSBarry Smith M*/ 1057*5c6c1daeSBarry Smith 1058*5c6c1daeSBarry Smith /*MC 1059*5c6c1daeSBarry Smith PetscLogEventBarrierEnd - Logs the time in a barrier before an event. 1060*5c6c1daeSBarry Smith 1061*5c6c1daeSBarry Smith Synopsis: 1062*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 1063*5c6c1daeSBarry Smith PetscObject o4,MPI_Comm comm) 1064*5c6c1daeSBarry Smith 1065*5c6c1daeSBarry Smith Logically Collective on MPI_Comm 1066*5c6c1daeSBarry Smith 1067*5c6c1daeSBarry Smith Input Parameters: 1068*5c6c1daeSBarry Smith . e - integer associated with the event obtained from PetscLogEventRegister() 1069*5c6c1daeSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 1070*5c6c1daeSBarry Smith . comm - communicator the barrier takes place over 1071*5c6c1daeSBarry Smith 1072*5c6c1daeSBarry Smith 1073*5c6c1daeSBarry Smith Usage: 1074*5c6c1daeSBarry Smith .vb 1075*5c6c1daeSBarry Smith PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 1076*5c6c1daeSBarry Smith MPI_Allreduce() 1077*5c6c1daeSBarry Smith PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 1078*5c6c1daeSBarry Smith .ve 1079*5c6c1daeSBarry Smith 1080*5c6c1daeSBarry Smith Notes: 1081*5c6c1daeSBarry Smith This is for logging the amount of time spent in a barrier for an event 1082*5c6c1daeSBarry Smith that requires synchronization. 1083*5c6c1daeSBarry Smith 1084*5c6c1daeSBarry Smith Additional Notes: 1085*5c6c1daeSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 1086*5c6c1daeSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 1087*5c6c1daeSBarry Smith 1088*5c6c1daeSBarry Smith Level: advanced 1089*5c6c1daeSBarry Smith 1090*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(), 1091*5c6c1daeSBarry Smith PetscLogEventBarrierBegin() 1092*5c6c1daeSBarry Smith 1093*5c6c1daeSBarry Smith .keywords: log, event, begin, barrier 1094*5c6c1daeSBarry Smith M*/ 1095*5c6c1daeSBarry Smith 1096*5c6c1daeSBarry Smith #undef __FUNCT__ 1097*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventGetId" 1098*5c6c1daeSBarry Smith /*@C 1099*5c6c1daeSBarry Smith PetscLogEventGetId - Returns the event id when given the event name. 1100*5c6c1daeSBarry Smith 1101*5c6c1daeSBarry Smith Not Collective 1102*5c6c1daeSBarry Smith 1103*5c6c1daeSBarry Smith Input Parameter: 1104*5c6c1daeSBarry Smith . name - The event name 1105*5c6c1daeSBarry Smith 1106*5c6c1daeSBarry Smith Output Parameter: 1107*5c6c1daeSBarry Smith . event - The event 1108*5c6c1daeSBarry Smith 1109*5c6c1daeSBarry Smith Level: intermediate 1110*5c6c1daeSBarry Smith 1111*5c6c1daeSBarry Smith .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStageGetId() 1112*5c6c1daeSBarry Smith @*/ 1113*5c6c1daeSBarry Smith PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event) 1114*5c6c1daeSBarry Smith { 1115*5c6c1daeSBarry Smith PetscStageLog stageLog; 1116*5c6c1daeSBarry Smith PetscErrorCode ierr; 1117*5c6c1daeSBarry Smith 1118*5c6c1daeSBarry Smith PetscFunctionBegin; 1119*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1120*5c6c1daeSBarry Smith ierr = EventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr); 1121*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1122*5c6c1daeSBarry Smith } 1123*5c6c1daeSBarry Smith 1124*5c6c1daeSBarry Smith 1125*5c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/ 1126*5c6c1daeSBarry Smith #undef __FUNCT__ 1127*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogDump" 1128*5c6c1daeSBarry Smith /*@C 1129*5c6c1daeSBarry Smith PetscLogDump - Dumps logs of objects to a file. This file is intended to 1130*5c6c1daeSBarry Smith be read by bin/petscview. This program no longer exists. 1131*5c6c1daeSBarry Smith 1132*5c6c1daeSBarry Smith Collective on PETSC_COMM_WORLD 1133*5c6c1daeSBarry Smith 1134*5c6c1daeSBarry Smith Input Parameter: 1135*5c6c1daeSBarry Smith . name - an optional file name 1136*5c6c1daeSBarry Smith 1137*5c6c1daeSBarry Smith Options Database Keys: 1138*5c6c1daeSBarry Smith + -log - Prints basic log information (for code compiled with PETSC_USE_LOG) 1139*5c6c1daeSBarry Smith - -log_all - Prints extensive log information (for code compiled with PETSC_USE_LOG) 1140*5c6c1daeSBarry Smith 1141*5c6c1daeSBarry Smith Usage: 1142*5c6c1daeSBarry Smith .vb 1143*5c6c1daeSBarry Smith PetscInitialize(...); 1144*5c6c1daeSBarry Smith PetscLogBegin(); or PetscLogAllBegin(); 1145*5c6c1daeSBarry Smith ... code ... 1146*5c6c1daeSBarry Smith PetscLogDump(filename); 1147*5c6c1daeSBarry Smith PetscFinalize(); 1148*5c6c1daeSBarry Smith .ve 1149*5c6c1daeSBarry Smith 1150*5c6c1daeSBarry Smith Notes: 1151*5c6c1daeSBarry Smith The default file name is 1152*5c6c1daeSBarry Smith $ Log.<rank> 1153*5c6c1daeSBarry Smith where <rank> is the processor number. If no name is specified, 1154*5c6c1daeSBarry Smith this file will be used. 1155*5c6c1daeSBarry Smith 1156*5c6c1daeSBarry Smith Level: advanced 1157*5c6c1daeSBarry Smith 1158*5c6c1daeSBarry Smith .keywords: log, dump 1159*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogAllBegin(), PetscLogView() 1160*5c6c1daeSBarry Smith @*/ 1161*5c6c1daeSBarry Smith PetscErrorCode PetscLogDump(const char sname[]) 1162*5c6c1daeSBarry Smith { 1163*5c6c1daeSBarry Smith PetscStageLog stageLog; 1164*5c6c1daeSBarry Smith PetscEventPerfInfo *eventInfo; 1165*5c6c1daeSBarry Smith FILE *fd; 1166*5c6c1daeSBarry Smith char file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN]; 1167*5c6c1daeSBarry Smith PetscLogDouble flops, _TotalTime; 1168*5c6c1daeSBarry Smith PetscMPIInt rank; 1169*5c6c1daeSBarry Smith int action, object, curStage; 1170*5c6c1daeSBarry Smith PetscLogEvent event; 1171*5c6c1daeSBarry Smith PetscErrorCode ierr; 1172*5c6c1daeSBarry Smith 1173*5c6c1daeSBarry Smith PetscFunctionBegin; 1174*5c6c1daeSBarry Smith /* Calculate the total elapsed time */ 1175*5c6c1daeSBarry Smith PetscTime(_TotalTime); 1176*5c6c1daeSBarry Smith _TotalTime -= petsc_BaseTime; 1177*5c6c1daeSBarry Smith /* Open log file */ 1178*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr); 1179*5c6c1daeSBarry Smith if (sname) { 1180*5c6c1daeSBarry Smith sprintf(file, "%s.%d", sname, rank); 1181*5c6c1daeSBarry Smith } else { 1182*5c6c1daeSBarry Smith sprintf(file, "Log.%d", rank); 1183*5c6c1daeSBarry Smith } 1184*5c6c1daeSBarry Smith ierr = PetscFixFilename(file, fname);CHKERRQ(ierr); 1185*5c6c1daeSBarry Smith ierr = PetscFOpen(PETSC_COMM_WORLD, fname, "w", &fd);CHKERRQ(ierr); 1186*5c6c1daeSBarry Smith if ((!rank) && (!fd)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname); 1187*5c6c1daeSBarry Smith /* Output totals */ 1188*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Total Flops %14e %16.8e\n", petsc_TotalFlops, _TotalTime); 1189*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Clock Resolution %g\n", 0.0); 1190*5c6c1daeSBarry Smith /* Output actions */ 1191*5c6c1daeSBarry Smith if (petsc_logActions) { 1192*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Actions accomplished %d\n", petsc_numActions); 1193*5c6c1daeSBarry Smith for (action = 0; action < petsc_numActions; action++) { 1194*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%g %d %d %d %d %d %d %g %g %g\n", 1195*5c6c1daeSBarry Smith petsc_actions[action].time, petsc_actions[action].action, (int)petsc_actions[action].event, (int)petsc_actions[action].classid, petsc_actions[action].id1, 1196*5c6c1daeSBarry Smith petsc_actions[action].id2, petsc_actions[action].id3, petsc_actions[action].flops, petsc_actions[action].mem, petsc_actions[action].maxmem); 1197*5c6c1daeSBarry Smith } 1198*5c6c1daeSBarry Smith } 1199*5c6c1daeSBarry Smith /* Output objects */ 1200*5c6c1daeSBarry Smith if (petsc_logObjects) { 1201*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Objects created %d destroyed %d\n", petsc_numObjects, petsc_numObjectsDestroyed); 1202*5c6c1daeSBarry Smith for (object = 0; object < petsc_numObjects; object++) { 1203*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Parent ID: %d Memory: %d\n", petsc_objects[object].parent, (int) petsc_objects[object].mem); 1204*5c6c1daeSBarry Smith if (!petsc_objects[object].name[0]) { 1205*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd,"No Name\n"); 1206*5c6c1daeSBarry Smith } else { 1207*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Name: %s\n", petsc_objects[object].name); 1208*5c6c1daeSBarry Smith } 1209*5c6c1daeSBarry Smith if (petsc_objects[object].info[0] != 0) { 1210*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "No Info\n"); 1211*5c6c1daeSBarry Smith } else { 1212*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Info: %s\n", petsc_objects[object].info); 1213*5c6c1daeSBarry Smith } 1214*5c6c1daeSBarry Smith } 1215*5c6c1daeSBarry Smith } 1216*5c6c1daeSBarry Smith /* Output events */ 1217*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Event log:\n"); 1218*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1219*5c6c1daeSBarry Smith ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr); 1220*5c6c1daeSBarry Smith eventInfo = stageLog->stageInfo[curStage].eventLog->eventInfo; 1221*5c6c1daeSBarry Smith for (event = 0; event < stageLog->stageInfo[curStage].eventLog->numEvents; event++) { 1222*5c6c1daeSBarry Smith if (eventInfo[event].time != 0.0) { 1223*5c6c1daeSBarry Smith flops = eventInfo[event].flops/eventInfo[event].time; 1224*5c6c1daeSBarry Smith } else { 1225*5c6c1daeSBarry Smith flops = 0.0; 1226*5c6c1daeSBarry Smith } 1227*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%d %16d %16g %16g %16g\n", event, eventInfo[event].count, 1228*5c6c1daeSBarry Smith eventInfo[event].flops, eventInfo[event].time, flops); 1229*5c6c1daeSBarry Smith } 1230*5c6c1daeSBarry Smith ierr = PetscFClose(PETSC_COMM_WORLD, fd);CHKERRQ(ierr); 1231*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1232*5c6c1daeSBarry Smith } 1233*5c6c1daeSBarry Smith 1234*5c6c1daeSBarry Smith #undef __FUNCT__ 1235*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogView" 1236*5c6c1daeSBarry Smith /*@C 1237*5c6c1daeSBarry Smith PetscLogViewer - Prints a summary of the logging. 1238*5c6c1daeSBarry Smith 1239*5c6c1daeSBarry Smith Collective over MPI_Comm 1240*5c6c1daeSBarry Smith 1241*5c6c1daeSBarry Smith Input Parameter: 1242*5c6c1daeSBarry Smith . viewer - an ASCII viewer 1243*5c6c1daeSBarry Smith 1244*5c6c1daeSBarry Smith Options Database Keys: 1245*5c6c1daeSBarry Smith . -log_summary - Prints summary of log information (for code compiled with PETSC_USE_LOG) 1246*5c6c1daeSBarry Smith 1247*5c6c1daeSBarry Smith Usage: 1248*5c6c1daeSBarry Smith .vb 1249*5c6c1daeSBarry Smith PetscInitialize(...); 1250*5c6c1daeSBarry Smith PetscLogBegin(); 1251*5c6c1daeSBarry Smith ... code ... 1252*5c6c1daeSBarry Smith PetscLogView(PetscViewer); 1253*5c6c1daeSBarry Smith PetscFinalize(...); 1254*5c6c1daeSBarry Smith .ve 1255*5c6c1daeSBarry Smith 1256*5c6c1daeSBarry Smith Notes: 1257*5c6c1daeSBarry Smith By default the summary is printed to stdout. 1258*5c6c1daeSBarry Smith 1259*5c6c1daeSBarry Smith Level: beginner 1260*5c6c1daeSBarry Smith 1261*5c6c1daeSBarry Smith .keywords: log, dump, print 1262*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogDump() 1263*5c6c1daeSBarry Smith @*/ 1264*5c6c1daeSBarry Smith PetscErrorCode PetscLogView(PetscViewer viewer) 1265*5c6c1daeSBarry Smith { 1266*5c6c1daeSBarry Smith FILE *fd; 1267*5c6c1daeSBarry Smith PetscLogDouble zero = 0.0; 1268*5c6c1daeSBarry Smith PetscStageLog stageLog; 1269*5c6c1daeSBarry Smith PetscStageInfo *stageInfo = PETSC_NULL; 1270*5c6c1daeSBarry Smith PetscEventPerfInfo *eventInfo = PETSC_NULL; 1271*5c6c1daeSBarry Smith PetscClassPerfInfo *classInfo; 1272*5c6c1daeSBarry Smith char arch[128],hostname[128],username[128],pname[PETSC_MAX_PATH_LEN],date[128]; 1273*5c6c1daeSBarry Smith const char *name; 1274*5c6c1daeSBarry Smith PetscLogDouble locTotalTime, TotalTime, TotalFlops; 1275*5c6c1daeSBarry Smith PetscLogDouble numMessages, messageLength, avgMessLen, numReductions; 1276*5c6c1daeSBarry Smith PetscLogDouble stageTime, flops, flopr, mem, mess, messLen, red; 1277*5c6c1daeSBarry Smith PetscLogDouble fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed; 1278*5c6c1daeSBarry Smith PetscLogDouble fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed; 1279*5c6c1daeSBarry Smith PetscLogDouble min, max, tot, ratio, avg, x, y; 1280*5c6c1daeSBarry Smith PetscLogDouble minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratCt, totm, totml, totr; 1281*5c6c1daeSBarry Smith PetscMPIInt minCt, maxCt; 1282*5c6c1daeSBarry Smith PetscMPIInt size, rank; 1283*5c6c1daeSBarry Smith PetscBool *localStageUsed, *stageUsed; 1284*5c6c1daeSBarry Smith PetscBool *localStageVisible, *stageVisible; 1285*5c6c1daeSBarry Smith int numStages, localNumEvents, numEvents; 1286*5c6c1daeSBarry Smith int stage, lastStage, oclass; 1287*5c6c1daeSBarry Smith PetscLogEvent event; 1288*5c6c1daeSBarry Smith PetscErrorCode ierr; 1289*5c6c1daeSBarry Smith char version[256]; 1290*5c6c1daeSBarry Smith MPI_Comm comm; 1291*5c6c1daeSBarry Smith PetscInt nthreads; 1292*5c6c1daeSBarry Smith 1293*5c6c1daeSBarry Smith PetscFunctionBegin; 1294*5c6c1daeSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 1295*5c6c1daeSBarry Smith ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr); 1296*5c6c1daeSBarry Smith ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1297*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 1298*5c6c1daeSBarry Smith /* Pop off any stages the user forgot to remove */ 1299*5c6c1daeSBarry Smith lastStage = 0; 1300*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1301*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1302*5c6c1daeSBarry Smith while (stage >= 0) { 1303*5c6c1daeSBarry Smith lastStage = stage; 1304*5c6c1daeSBarry Smith ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 1305*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1306*5c6c1daeSBarry Smith } 1307*5c6c1daeSBarry Smith /* Get the total elapsed time */ 1308*5c6c1daeSBarry Smith PetscTime(locTotalTime); locTotalTime -= petsc_BaseTime; 1309*5c6c1daeSBarry Smith 1310*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1311*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "*** WIDEN YOUR WINDOW TO 120 CHARACTERS. Use 'enscript -r -fCourier9' to print this document ***\n");CHKERRQ(ierr); 1312*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1313*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n---------------------------------------------- PETSc Performance Summary: ----------------------------------------------\n\n");CHKERRQ(ierr); 1314*5c6c1daeSBarry Smith ierr = PetscGetArchType(arch,sizeof(arch));CHKERRQ(ierr); 1315*5c6c1daeSBarry Smith ierr = PetscGetHostName(hostname,sizeof(hostname));CHKERRQ(ierr); 1316*5c6c1daeSBarry Smith ierr = PetscGetUserName(username,sizeof(username));CHKERRQ(ierr); 1317*5c6c1daeSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 1318*5c6c1daeSBarry Smith ierr = PetscGetDate(date,sizeof(date));CHKERRQ(ierr); 1319*5c6c1daeSBarry Smith ierr = PetscGetVersion(version,sizeof(version));CHKERRQ(ierr); 1320*5c6c1daeSBarry Smith if (size == 1) { 1321*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processor, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr); 1322*5c6c1daeSBarry Smith } else { 1323*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processors, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr); 1324*5c6c1daeSBarry Smith } 1325*5c6c1daeSBarry Smith ierr = PetscThreadCommGetNThreads(PETSC_COMM_WORLD,&nthreads);CHKERRQ(ierr); 1326*5c6c1daeSBarry Smith if (nthreads > 1) { 1327*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"With %d threads per MPI_Comm\n", (int)nthreads);CHKERRQ(ierr); 1328*5c6c1daeSBarry Smith } 1329*5c6c1daeSBarry Smith 1330*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Using %s\n", version);CHKERRQ(ierr); 1331*5c6c1daeSBarry Smith 1332*5c6c1daeSBarry Smith /* Must preserve reduction count before we go on */ 1333*5c6c1daeSBarry Smith red = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; 1334*5c6c1daeSBarry Smith 1335*5c6c1daeSBarry Smith /* Calculate summary information */ 1336*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n Max Max/Min Avg Total \n");CHKERRQ(ierr); 1337*5c6c1daeSBarry Smith /* Time */ 1338*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1339*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1340*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1341*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1342*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1343*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Time (sec): %5.3e %10.5f %5.3e\n", max, ratio, avg);CHKERRQ(ierr); 1344*5c6c1daeSBarry Smith TotalTime = tot; 1345*5c6c1daeSBarry Smith /* Objects */ 1346*5c6c1daeSBarry Smith avg = (PetscLogDouble) petsc_numObjects; 1347*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&avg, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1348*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&avg, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1349*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&avg, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1350*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1351*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1352*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Objects: %5.3e %10.5f %5.3e\n", max, ratio, avg);CHKERRQ(ierr); 1353*5c6c1daeSBarry Smith /* Flops */ 1354*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&petsc_TotalFlops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1355*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&petsc_TotalFlops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1356*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&petsc_TotalFlops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1357*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1358*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1359*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Flops: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1360*5c6c1daeSBarry Smith TotalFlops = tot; 1361*5c6c1daeSBarry Smith /* Flops/sec -- Must talk to Barry here */ 1362*5c6c1daeSBarry Smith if (locTotalTime != 0.0) flops = petsc_TotalFlops/locTotalTime; else flops = 0.0; 1363*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1364*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1365*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1366*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1367*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1368*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Flops/sec: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1369*5c6c1daeSBarry Smith /* Memory */ 1370*5c6c1daeSBarry Smith ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr); 1371*5c6c1daeSBarry Smith if (mem > 0.0) { 1372*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mem, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1373*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mem, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1374*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mem, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1375*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1376*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1377*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Memory: %5.3e %10.5f %5.3e\n", max, ratio, tot);CHKERRQ(ierr); 1378*5c6c1daeSBarry Smith } 1379*5c6c1daeSBarry Smith /* Messages */ 1380*5c6c1daeSBarry Smith mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct); 1381*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1382*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1383*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1384*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 1385*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1386*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPI Messages: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1387*5c6c1daeSBarry Smith numMessages = tot; 1388*5c6c1daeSBarry Smith /* Message Lengths */ 1389*5c6c1daeSBarry Smith mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len); 1390*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1391*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1392*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1393*5c6c1daeSBarry Smith if (numMessages != 0) avg = (tot)/(numMessages); else avg = 0.0; 1394*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1395*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPI Message Lengths: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1396*5c6c1daeSBarry Smith messageLength = tot; 1397*5c6c1daeSBarry Smith /* Reductions */ 1398*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&red, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1399*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&red, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1400*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&red, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1401*5c6c1daeSBarry Smith if (min != 0.0) ratio = max/min; else ratio = 0.0; 1402*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPI Reductions: %5.3e %10.5f\n", max, ratio);CHKERRQ(ierr); 1403*5c6c1daeSBarry Smith numReductions = red; /* wrong because uses count from process zero */ 1404*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n");CHKERRQ(ierr); 1405*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " e.g., VecAXPY() for real vectors of length N --> 2N flops\n");CHKERRQ(ierr); 1406*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " and VecAXPY() for complex vectors of length N --> 8N flops\n");CHKERRQ(ierr); 1407*5c6c1daeSBarry Smith 1408*5c6c1daeSBarry Smith /* Get total number of stages -- 1409*5c6c1daeSBarry Smith Currently, a single processor can register more stages than another, but stages must all be registered in order. 1410*5c6c1daeSBarry Smith We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID. 1411*5c6c1daeSBarry Smith This seems best accomplished by assoicating a communicator with each stage. 1412*5c6c1daeSBarry Smith */ 1413*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1414*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageUsed);CHKERRQ(ierr); 1415*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr); 1416*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageVisible);CHKERRQ(ierr); 1417*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr); 1418*5c6c1daeSBarry Smith if (numStages > 0) { 1419*5c6c1daeSBarry Smith stageInfo = stageLog->stageInfo; 1420*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1421*5c6c1daeSBarry Smith if (stage < stageLog->numStages) { 1422*5c6c1daeSBarry Smith localStageUsed[stage] = stageInfo[stage].used; 1423*5c6c1daeSBarry Smith localStageVisible[stage] = stageInfo[stage].perfInfo.visible; 1424*5c6c1daeSBarry Smith } else { 1425*5c6c1daeSBarry Smith localStageUsed[stage] = PETSC_FALSE; 1426*5c6c1daeSBarry Smith localStageVisible[stage] = PETSC_TRUE; 1427*5c6c1daeSBarry Smith } 1428*5c6c1daeSBarry Smith } 1429*5c6c1daeSBarry Smith ierr = MPI_Allreduce(localStageUsed, stageUsed, numStages, MPI_INT, MPI_LOR, comm);CHKERRQ(ierr); 1430*5c6c1daeSBarry Smith ierr = MPI_Allreduce(localStageVisible, stageVisible, numStages, MPI_INT, MPI_LAND, comm);CHKERRQ(ierr); 1431*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1432*5c6c1daeSBarry Smith if (stageUsed[stage]) { 1433*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\nSummary of Stages: ----- Time ------ ----- Flops ----- --- Messages --- -- Message Lengths -- -- Reductions --\n");CHKERRQ(ierr); 1434*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Avg %%Total Avg %%Total counts %%Total Avg %%Total counts %%Total \n");CHKERRQ(ierr); 1435*5c6c1daeSBarry Smith break; 1436*5c6c1daeSBarry Smith } 1437*5c6c1daeSBarry Smith } 1438*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1439*5c6c1daeSBarry Smith if (!stageUsed[stage]) continue; 1440*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 1441*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1442*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1443*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1444*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1445*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1446*5c6c1daeSBarry Smith name = stageInfo[stage].name; 1447*5c6c1daeSBarry Smith } else { 1448*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1449*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1450*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1451*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1452*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1453*5c6c1daeSBarry Smith name = ""; 1454*5c6c1daeSBarry Smith } 1455*5c6c1daeSBarry Smith mess *= 0.5; messLen *= 0.5; red /= size; 1456*5c6c1daeSBarry Smith if (TotalTime != 0.0) fracTime = stageTime/TotalTime; else fracTime = 0.0; 1457*5c6c1daeSBarry Smith if (TotalFlops != 0.0) fracFlops = flops/TotalFlops; else fracFlops = 0.0; 1458*5c6c1daeSBarry Smith /* Talk to Barry if (stageTime != 0.0) flops = (size*flops)/stageTime; else flops = 0.0; */ 1459*5c6c1daeSBarry Smith if (numMessages != 0.0) fracMessages = mess/numMessages; else fracMessages = 0.0; 1460*5c6c1daeSBarry Smith if (numMessages != 0.0) avgMessLen = messLen/numMessages; else avgMessLen = 0.0; 1461*5c6c1daeSBarry Smith if (messageLength != 0.0) fracLength = messLen/messageLength; else fracLength = 0.0; 1462*5c6c1daeSBarry Smith if (numReductions != 0.0) fracReductions = red/numReductions; else fracReductions = 0.0; 1463*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%2d: %15s: %6.4e %5.1f%% %6.4e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% \n", 1464*5c6c1daeSBarry Smith stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops, 1465*5c6c1daeSBarry Smith mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr); 1466*5c6c1daeSBarry Smith } 1467*5c6c1daeSBarry Smith } 1468*5c6c1daeSBarry Smith 1469*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1470*5c6c1daeSBarry Smith "\n------------------------------------------------------------------------------------------------------------------------\n"); 1471*5c6c1daeSBarry Smith CHKERRQ(ierr); 1472*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n");CHKERRQ(ierr); 1473*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Phase summary info:\n");CHKERRQ(ierr); 1474*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Count: number of times phase was executed\n");CHKERRQ(ierr); 1475*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Time and Flops: Max - maximum over all processors\n");CHKERRQ(ierr); 1476*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Ratio - ratio of maximum to minimum over all processors\n");CHKERRQ(ierr); 1477*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Mess: number of messages sent\n");CHKERRQ(ierr); 1478*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Avg. len: average message length\n");CHKERRQ(ierr); 1479*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Reduct: number of global reductions\n");CHKERRQ(ierr); 1480*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Global: entire computation\n");CHKERRQ(ierr); 1481*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n");CHKERRQ(ierr); 1482*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %%T - percent time in this phase %%F - percent flops in this phase\n");CHKERRQ(ierr); 1483*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %%M - percent messages in this phase %%L - percent message lengths in this phase\n");CHKERRQ(ierr); 1484*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %%R - percent reductions in this phase\n");CHKERRQ(ierr); 1485*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " Total Mflop/s: 10e-6 * (sum of flops over all processors)/(max time over all processors)\n");CHKERRQ(ierr); 1486*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1487*5c6c1daeSBarry Smith "------------------------------------------------------------------------------------------------------------------------\n"); 1488*5c6c1daeSBarry Smith CHKERRQ(ierr); 1489*5c6c1daeSBarry Smith 1490*5c6c1daeSBarry Smith #if defined(PETSC_USE_DEBUG) 1491*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr); 1492*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " ##########################################################\n");CHKERRQ(ierr); 1493*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1494*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # WARNING!!! #\n");CHKERRQ(ierr); 1495*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1496*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # This code was compiled with a debugging option, #\n");CHKERRQ(ierr); 1497*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # To get timing results run ./configure #\n");CHKERRQ(ierr); 1498*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # using --with-debugging=no, the performance will #\n");CHKERRQ(ierr); 1499*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # be generally two or three times faster. #\n");CHKERRQ(ierr); 1500*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1501*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " ##########################################################\n\n\n");CHKERRQ(ierr); 1502*5c6c1daeSBarry Smith #endif 1503*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_FORTRAN_KERNELS) 1504*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr); 1505*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " ##########################################################\n");CHKERRQ(ierr); 1506*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1507*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # WARNING!!! #\n");CHKERRQ(ierr); 1508*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1509*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # The code for various complex numbers numerical #\n");CHKERRQ(ierr); 1510*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # kernels uses C++, which generally is not well #\n");CHKERRQ(ierr); 1511*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # optimized. For performance that is about 4-5 times #\n");CHKERRQ(ierr); 1512*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # faster, specify --with-fortran-kernels=1 #\n");CHKERRQ(ierr); 1513*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # when running ./configure.py. #\n");CHKERRQ(ierr); 1514*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1515*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " ##########################################################\n\n\n");CHKERRQ(ierr); 1516*5c6c1daeSBarry Smith #endif 1517*5c6c1daeSBarry Smith 1518*5c6c1daeSBarry Smith /* Report events */ 1519*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1520*5c6c1daeSBarry Smith "Event Count Time (sec) Flops --- Global --- --- Stage --- Total\n"); 1521*5c6c1daeSBarry Smith CHKERRQ(ierr); 1522*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1523*5c6c1daeSBarry Smith " Max Ratio Max Ratio Max Ratio Mess Avg len Reduct %%T %%F %%M %%L %%R %%T %%F %%M %%L %%R Mflop/s\n"); 1524*5c6c1daeSBarry Smith CHKERRQ(ierr); 1525*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd, 1526*5c6c1daeSBarry Smith "------------------------------------------------------------------------------------------------------------------------\n"); 1527*5c6c1daeSBarry Smith 1528*5c6c1daeSBarry Smith CHKERRQ(ierr); 1529*5c6c1daeSBarry Smith /* Problem: The stage name will not show up unless the stage executed on proc 1 */ 1530*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1531*5c6c1daeSBarry Smith if (!stageVisible[stage]) continue; 1532*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 1533*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr); 1534*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1535*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1536*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1537*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1538*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1539*5c6c1daeSBarry Smith } else { 1540*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 1541*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1542*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1543*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1544*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1545*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1546*5c6c1daeSBarry Smith } 1547*5c6c1daeSBarry Smith mess *= 0.5; messLen *= 0.5; red /= size; 1548*5c6c1daeSBarry Smith 1549*5c6c1daeSBarry Smith /* Get total number of events in this stage -- 1550*5c6c1daeSBarry Smith Currently, a single processor can register more events than another, but events must all be registered in order, 1551*5c6c1daeSBarry Smith just like stages. We can removed this requirement if necessary by having a global event numbering and indirection 1552*5c6c1daeSBarry Smith on the event ID. This seems best accomplished by assoicating a communicator with each stage. 1553*5c6c1daeSBarry Smith 1554*5c6c1daeSBarry Smith Problem: If the event did not happen on proc 1, its name will not be available. 1555*5c6c1daeSBarry Smith Problem: Event visibility is not implemented 1556*5c6c1daeSBarry Smith */ 1557*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 1558*5c6c1daeSBarry Smith eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo; 1559*5c6c1daeSBarry Smith localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents; 1560*5c6c1daeSBarry Smith } else { 1561*5c6c1daeSBarry Smith localNumEvents = 0; 1562*5c6c1daeSBarry Smith } 1563*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1564*5c6c1daeSBarry Smith for (event = 0; event < numEvents; event++) { 1565*5c6c1daeSBarry Smith if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) { 1566*5c6c1daeSBarry Smith if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) { 1567*5c6c1daeSBarry Smith flopr = eventInfo[event].flops; 1568*5c6c1daeSBarry Smith } else { 1569*5c6c1daeSBarry Smith flopr = 0.0; 1570*5c6c1daeSBarry Smith } 1571*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1572*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1573*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].flops, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1574*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].time, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1575*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].time, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1576*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].time, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1577*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].numMessages, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1578*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1579*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].numReductions, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1580*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].count, &minCt, 1, MPI_INT, MPI_MIN, comm);CHKERRQ(ierr); 1581*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].count, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1582*5c6c1daeSBarry Smith name = stageLog->eventLog->eventInfo[event].name; 1583*5c6c1daeSBarry Smith } else { 1584*5c6c1daeSBarry Smith flopr = 0.0; 1585*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1586*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1587*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1588*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1589*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1590*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1591*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1592*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1593*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1594*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&ierr, &minCt, 1, MPI_INT, MPI_MIN, comm);CHKERRQ(ierr); 1595*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&ierr, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1596*5c6c1daeSBarry Smith name = ""; 1597*5c6c1daeSBarry Smith } 1598*5c6c1daeSBarry Smith if (mint < 0.0) { 1599*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "WARNING!!! Minimum time %g over all processors for %s is negative! This happens\n on some machines whose times cannot handle too rapid calls.!\n artificially changing minimum to zero.\n",mint,name); 1600*5c6c1daeSBarry Smith mint = 0; 1601*5c6c1daeSBarry Smith } 1602*5c6c1daeSBarry Smith if (minf < 0.0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Minimum flops %g over all processors for %s is negative! Not possible!",minf,name); 1603*5c6c1daeSBarry Smith totm *= 0.5; totml *= 0.5; totr /= size; 1604*5c6c1daeSBarry Smith 1605*5c6c1daeSBarry Smith if (maxCt != 0) { 1606*5c6c1daeSBarry Smith if (minCt != 0) ratCt = ((PetscLogDouble) maxCt)/minCt; else ratCt = 0.0; 1607*5c6c1daeSBarry Smith if (mint != 0.0) ratt = maxt/mint; else ratt = 0.0; 1608*5c6c1daeSBarry Smith if (minf != 0.0) ratf = maxf/minf; else ratf = 0.0; 1609*5c6c1daeSBarry Smith if (TotalTime != 0.0) fracTime = tott/TotalTime; else fracTime = 0.0; 1610*5c6c1daeSBarry Smith if (TotalFlops != 0.0) fracFlops = totf/TotalFlops; else fracFlops = 0.0; 1611*5c6c1daeSBarry Smith if (stageTime != 0.0) fracStageTime = tott/stageTime; else fracStageTime = 0.0; 1612*5c6c1daeSBarry Smith if (flops != 0.0) fracStageFlops = totf/flops; else fracStageFlops = 0.0; 1613*5c6c1daeSBarry Smith if (numMessages != 0.0) fracMess = totm/numMessages; else fracMess = 0.0; 1614*5c6c1daeSBarry Smith if (messageLength != 0.0) fracMessLen = totml/messageLength; else fracMessLen = 0.0; 1615*5c6c1daeSBarry Smith if (numReductions != 0.0) fracRed = totr/numReductions; else fracRed = 0.0; 1616*5c6c1daeSBarry Smith if (mess != 0.0) fracStageMess = totm/mess; else fracStageMess = 0.0; 1617*5c6c1daeSBarry Smith if (messLen != 0.0) fracStageMessLen = totml/messLen; else fracStageMessLen = 0.0; 1618*5c6c1daeSBarry Smith if (red != 0.0) fracStageRed = totr/red; else fracStageRed = 0.0; 1619*5c6c1daeSBarry Smith if (totm != 0.0) totml /= totm; else totml = 0.0; 1620*5c6c1daeSBarry Smith if (maxt != 0.0) flopr = totf/maxt; else flopr = 0.0; 1621*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1622*5c6c1daeSBarry Smith "%-16s %7d%4.1f %5.4e%4.1f %3.2e%4.1f %2.1e %2.1e %2.1e%3.0f%3.0f%3.0f%3.0f%3.0f %3.0f%3.0f%3.0f%3.0f%3.0f %5.0f\n", 1623*5c6c1daeSBarry Smith name, maxCt, ratCt, maxt, ratt, maxf, ratf, totm, totml, totr, 1624*5c6c1daeSBarry Smith 100.0*fracTime, 100.0*fracFlops, 100.0*fracMess, 100.0*fracMessLen, 100.0*fracRed, 1625*5c6c1daeSBarry Smith 100.0*fracStageTime, 100.0*fracStageFlops, 100.0*fracStageMess, 100.0*fracStageMessLen, 100.0*fracStageRed, 1626*5c6c1daeSBarry Smith PetscAbsReal(flopr/1.0e6));CHKERRQ(ierr); 1627*5c6c1daeSBarry Smith } 1628*5c6c1daeSBarry Smith } 1629*5c6c1daeSBarry Smith } 1630*5c6c1daeSBarry Smith 1631*5c6c1daeSBarry Smith /* Memory usage and object creation */ 1632*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1633*5c6c1daeSBarry Smith "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1634*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr); 1635*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Memory usage is given in bytes:\n\n");CHKERRQ(ierr); 1636*5c6c1daeSBarry Smith 1637*5c6c1daeSBarry Smith /* Right now, only stages on the first processor are reported here, meaning only objects associated with 1638*5c6c1daeSBarry Smith the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then 1639*5c6c1daeSBarry Smith stats for stages local to processor sets. 1640*5c6c1daeSBarry Smith */ 1641*5c6c1daeSBarry Smith /* We should figure out the longest object name here (now 20 characters) */ 1642*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Object Type Creations Destructions Memory Descendants' Mem.\n");CHKERRQ(ierr); 1643*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Reports information only for process 0.\n");CHKERRQ(ierr); 1644*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1645*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 1646*5c6c1daeSBarry Smith classInfo = stageLog->stageInfo[stage].classLog->classInfo; 1647*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr); 1648*5c6c1daeSBarry Smith for (oclass = 0; oclass < stageLog->stageInfo[stage].classLog->numClasses; oclass++) { 1649*5c6c1daeSBarry Smith if ((classInfo[oclass].creations > 0) || (classInfo[oclass].destructions > 0)) { 1650*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%20s %5d %5d %11.0f %g\n", stageLog->classLog->classInfo[oclass].name, 1651*5c6c1daeSBarry Smith classInfo[oclass].creations, classInfo[oclass].destructions, classInfo[oclass].mem, 1652*5c6c1daeSBarry Smith classInfo[oclass].descMem);CHKERRQ(ierr); 1653*5c6c1daeSBarry Smith } 1654*5c6c1daeSBarry Smith } 1655*5c6c1daeSBarry Smith } else { 1656*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 1657*5c6c1daeSBarry Smith } 1658*5c6c1daeSBarry Smith } 1659*5c6c1daeSBarry Smith 1660*5c6c1daeSBarry Smith ierr = PetscFree(localStageUsed);CHKERRQ(ierr); 1661*5c6c1daeSBarry Smith ierr = PetscFree(stageUsed);CHKERRQ(ierr); 1662*5c6c1daeSBarry Smith ierr = PetscFree(localStageVisible);CHKERRQ(ierr); 1663*5c6c1daeSBarry Smith ierr = PetscFree(stageVisible);CHKERRQ(ierr); 1664*5c6c1daeSBarry Smith 1665*5c6c1daeSBarry Smith /* Information unrelated to this particular run */ 1666*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 1667*5c6c1daeSBarry Smith "========================================================================================================================\n");CHKERRQ(ierr); 1668*5c6c1daeSBarry Smith PetscTime(y); 1669*5c6c1daeSBarry Smith PetscTime(x); 1670*5c6c1daeSBarry Smith PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); 1671*5c6c1daeSBarry Smith PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); 1672*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"Average time to get PetscTime(): %g\n", (y-x)/10.0);CHKERRQ(ierr); 1673*5c6c1daeSBarry Smith /* MPI information */ 1674*5c6c1daeSBarry Smith if (size > 1) { 1675*5c6c1daeSBarry Smith MPI_Status status; 1676*5c6c1daeSBarry Smith PetscMPIInt tag; 1677*5c6c1daeSBarry Smith MPI_Comm newcomm; 1678*5c6c1daeSBarry Smith 1679*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1680*5c6c1daeSBarry Smith PetscTime(x); 1681*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1682*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1683*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1684*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1685*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1686*5c6c1daeSBarry Smith PetscTime(y); 1687*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Average time for MPI_Barrier(): %g\n", (y-x)/5.0);CHKERRQ(ierr); 1688*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr); 1689*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1690*5c6c1daeSBarry Smith if (rank) { 1691*5c6c1daeSBarry Smith ierr = MPI_Recv(0, 0, MPI_INT, rank-1, tag, newcomm, &status);CHKERRQ(ierr); 1692*5c6c1daeSBarry Smith ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr); 1693*5c6c1daeSBarry Smith } else { 1694*5c6c1daeSBarry Smith PetscTime(x); 1695*5c6c1daeSBarry Smith ierr = MPI_Send(0, 0, MPI_INT, 1, tag, newcomm);CHKERRQ(ierr); 1696*5c6c1daeSBarry Smith ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr); 1697*5c6c1daeSBarry Smith PetscTime(y); 1698*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"Average time for zero size MPI_Send(): %g\n", (y-x)/size);CHKERRQ(ierr); 1699*5c6c1daeSBarry Smith } 1700*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr); 1701*5c6c1daeSBarry Smith } 1702*5c6c1daeSBarry Smith ierr = PetscOptionsView(viewer);CHKERRQ(ierr); 1703*5c6c1daeSBarry Smith 1704*5c6c1daeSBarry Smith /* Machine and compile information */ 1705*5c6c1daeSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS) 1706*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled with FORTRAN kernels\n");CHKERRQ(ierr); 1707*5c6c1daeSBarry Smith #else 1708*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled without FORTRAN kernels\n");CHKERRQ(ierr); 1709*5c6c1daeSBarry Smith #endif 1710*5c6c1daeSBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 1711*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled with single precision PetscScalar and PetscReal\n");CHKERRQ(ierr); 1712*5c6c1daeSBarry Smith #elif defined(PETSC_USE_LONGDOUBLE) 1713*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled with long double precision PetscScalar and PetscReal\n");CHKERRQ(ierr); 1714*5c6c1daeSBarry Smith #endif 1715*5c6c1daeSBarry Smith 1716*5c6c1daeSBarry Smith #if defined(PETSC_USE_REAL_MAT_SINGLE) 1717*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled with single precision matrices\n");CHKERRQ(ierr); 1718*5c6c1daeSBarry Smith #else 1719*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Compiled with full precision matrices (default)\n");CHKERRQ(ierr); 1720*5c6c1daeSBarry Smith #endif 1721*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "sizeof(short) %d sizeof(int) %d sizeof(long) %d sizeof(void*) %d sizeof(PetscScalar) %d sizeof(PetscInt) %d\n", 1722*5c6c1daeSBarry Smith (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(void*),(int) sizeof(PetscScalar),(int) sizeof(PetscInt));CHKERRQ(ierr); 1723*5c6c1daeSBarry Smith 1724*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Configure run at: %s\n",petscconfigureruntime);CHKERRQ(ierr); 1725*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Configure options: %s",petscconfigureoptions);CHKERRQ(ierr); 1726*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s", petscmachineinfo);CHKERRQ(ierr); 1727*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s", petsccompilerinfo);CHKERRQ(ierr); 1728*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s", petsccompilerflagsinfo);CHKERRQ(ierr); 1729*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s", petsclinkerinfo);CHKERRQ(ierr); 1730*5c6c1daeSBarry Smith 1731*5c6c1daeSBarry Smith /* Cleanup */ 1732*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr); 1733*5c6c1daeSBarry Smith ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr); 1734*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1735*5c6c1daeSBarry Smith } 1736*5c6c1daeSBarry Smith 1737*5c6c1daeSBarry Smith #undef __FUNCT__ 1738*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogPrintDetailed" 1739*5c6c1daeSBarry Smith /*@C 1740*5c6c1daeSBarry Smith PetscLogPrintDetailed - Each process prints the times for its own events 1741*5c6c1daeSBarry Smith 1742*5c6c1daeSBarry Smith Collective over MPI_Comm 1743*5c6c1daeSBarry Smith 1744*5c6c1daeSBarry Smith Input Parameter: 1745*5c6c1daeSBarry Smith + comm - The MPI communicator (only one processor prints output) 1746*5c6c1daeSBarry Smith - file - [Optional] The output file name 1747*5c6c1daeSBarry Smith 1748*5c6c1daeSBarry Smith Options Database Keys: 1749*5c6c1daeSBarry Smith . -log_summary_detailed - Prints summary of log information (for code compiled with PETSC_USE_LOG) 1750*5c6c1daeSBarry Smith 1751*5c6c1daeSBarry Smith Usage: 1752*5c6c1daeSBarry Smith .vb 1753*5c6c1daeSBarry Smith PetscInitialize(...); 1754*5c6c1daeSBarry Smith PetscLogBegin(); 1755*5c6c1daeSBarry Smith ... code ... 1756*5c6c1daeSBarry Smith PetscLogPrintDetailed(MPI_Comm,filename); 1757*5c6c1daeSBarry Smith PetscFinalize(...); 1758*5c6c1daeSBarry Smith .ve 1759*5c6c1daeSBarry Smith 1760*5c6c1daeSBarry Smith Notes: 1761*5c6c1daeSBarry Smith By default the summary is printed to stdout. 1762*5c6c1daeSBarry Smith 1763*5c6c1daeSBarry Smith Level: beginner 1764*5c6c1daeSBarry Smith 1765*5c6c1daeSBarry Smith .keywords: log, dump, print 1766*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogDump(), PetscLogView() 1767*5c6c1daeSBarry Smith @*/ 1768*5c6c1daeSBarry Smith PetscErrorCode PetscLogPrintDetailed(MPI_Comm comm, const char filename[]) 1769*5c6c1daeSBarry Smith { 1770*5c6c1daeSBarry Smith FILE *fd = PETSC_STDOUT; 1771*5c6c1daeSBarry Smith PetscStageLog stageLog; 1772*5c6c1daeSBarry Smith PetscStageInfo *stageInfo = PETSC_NULL; 1773*5c6c1daeSBarry Smith PetscEventPerfInfo *eventInfo = PETSC_NULL; 1774*5c6c1daeSBarry Smith const char *name = PETSC_NULL; 1775*5c6c1daeSBarry Smith PetscLogDouble TotalTime; 1776*5c6c1daeSBarry Smith PetscLogDouble stageTime, flops, flopr, mess, messLen, red; 1777*5c6c1daeSBarry Smith PetscLogDouble maxf, totf, maxt, tott, totm, totml, totr = 0.0; 1778*5c6c1daeSBarry Smith PetscMPIInt maxCt; 1779*5c6c1daeSBarry Smith PetscBool *stageUsed; 1780*5c6c1daeSBarry Smith PetscBool *stageVisible; 1781*5c6c1daeSBarry Smith int numStages, numEvents; 1782*5c6c1daeSBarry Smith int stage; 1783*5c6c1daeSBarry Smith PetscLogEvent event; 1784*5c6c1daeSBarry Smith PetscErrorCode ierr; 1785*5c6c1daeSBarry Smith 1786*5c6c1daeSBarry Smith PetscFunctionBegin; 1787*5c6c1daeSBarry Smith /* Pop off any stages the user forgot to remove */ 1788*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1789*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1790*5c6c1daeSBarry Smith while (stage >= 0) { 1791*5c6c1daeSBarry Smith ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 1792*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1793*5c6c1daeSBarry Smith } 1794*5c6c1daeSBarry Smith /* Get the total elapsed time */ 1795*5c6c1daeSBarry Smith PetscTime(TotalTime); TotalTime -= petsc_BaseTime; 1796*5c6c1daeSBarry Smith /* Open the summary file */ 1797*5c6c1daeSBarry Smith if (filename) { 1798*5c6c1daeSBarry Smith ierr = PetscFOpen(comm, filename, "w", &fd);CHKERRQ(ierr); 1799*5c6c1daeSBarry Smith } 1800*5c6c1daeSBarry Smith 1801*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1802*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "*** WIDEN YOUR WINDOW TO 120 CHARACTERS. Use 'enscript -r -fCourier9' to print this document ***\n");CHKERRQ(ierr); 1803*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1804*5c6c1daeSBarry Smith 1805*5c6c1daeSBarry Smith 1806*5c6c1daeSBarry Smith numStages = stageLog->numStages; 1807*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr); 1808*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr); 1809*5c6c1daeSBarry Smith if (numStages > 0) { 1810*5c6c1daeSBarry Smith stageInfo = stageLog->stageInfo; 1811*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1812*5c6c1daeSBarry Smith if (stage < stageLog->numStages) { 1813*5c6c1daeSBarry Smith stageUsed[stage] = stageInfo[stage].used; 1814*5c6c1daeSBarry Smith stageVisible[stage] = stageInfo[stage].perfInfo.visible; 1815*5c6c1daeSBarry Smith } else { 1816*5c6c1daeSBarry Smith stageUsed[stage] = PETSC_FALSE; 1817*5c6c1daeSBarry Smith stageVisible[stage] = PETSC_TRUE; 1818*5c6c1daeSBarry Smith } 1819*5c6c1daeSBarry Smith } 1820*5c6c1daeSBarry Smith } 1821*5c6c1daeSBarry Smith 1822*5c6c1daeSBarry Smith /* Report events */ 1823*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd,"Event Count Time (sec) Flops/sec \n");CHKERRQ(ierr); 1824*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd," Mess Avg len Reduct \n");CHKERRQ(ierr); 1825*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"-----------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1826*5c6c1daeSBarry Smith /* Problem: The stage name will not show up unless the stage executed on proc 1 */ 1827*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 1828*5c6c1daeSBarry Smith if (!stageVisible[stage]) continue; 1829*5c6c1daeSBarry Smith if (stageUsed[stage]) { 1830*5c6c1daeSBarry Smith ierr = PetscSynchronizedFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr); 1831*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1832*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1833*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1834*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1835*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1836*5c6c1daeSBarry Smith } 1837*5c6c1daeSBarry Smith mess *= 0.5; messLen *= 0.5; 1838*5c6c1daeSBarry Smith 1839*5c6c1daeSBarry Smith /* Get total number of events in this stage -- 1840*5c6c1daeSBarry Smith */ 1841*5c6c1daeSBarry Smith if (stageUsed[stage]) { 1842*5c6c1daeSBarry Smith eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo; 1843*5c6c1daeSBarry Smith numEvents = stageLog->stageInfo[stage].eventLog->numEvents; 1844*5c6c1daeSBarry Smith } else { 1845*5c6c1daeSBarry Smith numEvents = 0; 1846*5c6c1daeSBarry Smith } 1847*5c6c1daeSBarry Smith for (event = 0; event < numEvents; event++) { 1848*5c6c1daeSBarry Smith if (stageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents)) { 1849*5c6c1daeSBarry Smith if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) { 1850*5c6c1daeSBarry Smith flopr = eventInfo[event].flops/eventInfo[event].time; 1851*5c6c1daeSBarry Smith } else { 1852*5c6c1daeSBarry Smith flopr = 0.0; 1853*5c6c1daeSBarry Smith } 1854*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr); 1855*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].flops, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1856*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].time, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr); 1857*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].time, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1858*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].numMessages, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1859*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr); 1860*5c6c1daeSBarry Smith totr = eventInfo[event].numReductions; 1861*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].count, &maxCt, 1, MPI_INT, MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr); 1862*5c6c1daeSBarry Smith name = stageLog->eventLog->eventInfo[event].name; 1863*5c6c1daeSBarry Smith totm *= 0.5; totml *= 0.5; 1864*5c6c1daeSBarry Smith } 1865*5c6c1daeSBarry Smith 1866*5c6c1daeSBarry Smith if (maxCt != 0) { 1867*5c6c1daeSBarry Smith if (totm != 0.0) totml /= totm; else totml = 0.0; 1868*5c6c1daeSBarry Smith ierr = PetscSynchronizedFPrintf(comm, fd,"%-16s %7d %5.4e %3.2e %2.1e %2.1e %2.1e\n",name, maxCt, maxt, maxf, totm, totml, totr);CHKERRQ(ierr); 1869*5c6c1daeSBarry Smith } 1870*5c6c1daeSBarry Smith } 1871*5c6c1daeSBarry Smith } 1872*5c6c1daeSBarry Smith ierr = PetscSynchronizedFlush(comm);CHKERRQ(ierr); 1873*5c6c1daeSBarry Smith 1874*5c6c1daeSBarry Smith ierr = PetscFree(stageUsed);CHKERRQ(ierr); 1875*5c6c1daeSBarry Smith ierr = PetscFree(stageVisible);CHKERRQ(ierr); 1876*5c6c1daeSBarry Smith 1877*5c6c1daeSBarry Smith ierr = PetscFClose(comm, fd);CHKERRQ(ierr); 1878*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1879*5c6c1daeSBarry Smith } 1880*5c6c1daeSBarry Smith 1881*5c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/ 1882*5c6c1daeSBarry Smith #undef __FUNCT__ 1883*5c6c1daeSBarry Smith #define __FUNCT__ "PetscGetFlops" 1884*5c6c1daeSBarry Smith /*@C 1885*5c6c1daeSBarry Smith PetscGetFlops - Returns the number of flops used on this processor 1886*5c6c1daeSBarry Smith since the program began. 1887*5c6c1daeSBarry Smith 1888*5c6c1daeSBarry Smith Not Collective 1889*5c6c1daeSBarry Smith 1890*5c6c1daeSBarry Smith Output Parameter: 1891*5c6c1daeSBarry Smith flops - number of floating point operations 1892*5c6c1daeSBarry Smith 1893*5c6c1daeSBarry Smith Notes: 1894*5c6c1daeSBarry Smith A global counter logs all PETSc flop counts. The user can use 1895*5c6c1daeSBarry Smith PetscLogFlops() to increment this counter to include flops for the 1896*5c6c1daeSBarry Smith application code. 1897*5c6c1daeSBarry Smith 1898*5c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 1899*5c6c1daeSBarry Smith compiled with -DPETSC_USE_LOG (which is the default), and -log, 1900*5c6c1daeSBarry Smith -log_summary, or -log_all are specified. PetscLogFlops() is 1901*5c6c1daeSBarry Smith intended for logging user flops to supplement this PETSc 1902*5c6c1daeSBarry Smith information. 1903*5c6c1daeSBarry Smith 1904*5c6c1daeSBarry Smith Level: intermediate 1905*5c6c1daeSBarry Smith 1906*5c6c1daeSBarry Smith .keywords: log, flops, floating point operations 1907*5c6c1daeSBarry Smith 1908*5c6c1daeSBarry Smith .seealso: PetscGetTime(), PetscLogFlops() 1909*5c6c1daeSBarry Smith @*/ 1910*5c6c1daeSBarry Smith PetscErrorCode PetscGetFlops(PetscLogDouble *flops) 1911*5c6c1daeSBarry Smith { 1912*5c6c1daeSBarry Smith PetscFunctionBegin; 1913*5c6c1daeSBarry Smith *flops = petsc_TotalFlops; 1914*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1915*5c6c1daeSBarry Smith } 1916*5c6c1daeSBarry Smith 1917*5c6c1daeSBarry Smith #undef __FUNCT__ 1918*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjectState" 1919*5c6c1daeSBarry Smith PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 1920*5c6c1daeSBarry Smith { 1921*5c6c1daeSBarry Smith PetscErrorCode ierr; 1922*5c6c1daeSBarry Smith size_t fullLength; 1923*5c6c1daeSBarry Smith va_list Argp; 1924*5c6c1daeSBarry Smith 1925*5c6c1daeSBarry Smith PetscFunctionBegin; 1926*5c6c1daeSBarry Smith if (!petsc_logObjects) PetscFunctionReturn(0); 1927*5c6c1daeSBarry Smith va_start(Argp, format); 1928*5c6c1daeSBarry Smith ierr = PetscVSNPrintf(petsc_objects[obj->id].info, 64,format,&fullLength, Argp);CHKERRQ(ierr); 1929*5c6c1daeSBarry Smith va_end(Argp); 1930*5c6c1daeSBarry Smith PetscFunctionReturn(0); 1931*5c6c1daeSBarry Smith } 1932*5c6c1daeSBarry Smith 1933*5c6c1daeSBarry Smith 1934*5c6c1daeSBarry Smith /*MC 1935*5c6c1daeSBarry Smith PetscLogFlops - Adds floating point operations to the global counter. 1936*5c6c1daeSBarry Smith 1937*5c6c1daeSBarry Smith Synopsis: 1938*5c6c1daeSBarry Smith PetscErrorCode PetscLogFlops(PetscLogDouble f) 1939*5c6c1daeSBarry Smith 1940*5c6c1daeSBarry Smith Not Collective 1941*5c6c1daeSBarry Smith 1942*5c6c1daeSBarry Smith Input Parameter: 1943*5c6c1daeSBarry Smith . f - flop counter 1944*5c6c1daeSBarry Smith 1945*5c6c1daeSBarry Smith 1946*5c6c1daeSBarry Smith Usage: 1947*5c6c1daeSBarry Smith .vb 1948*5c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 1949*5c6c1daeSBarry Smith PetscLogEventRegister("User event",0,&USER_EVENT); 1950*5c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 1951*5c6c1daeSBarry Smith [code segment to monitor] 1952*5c6c1daeSBarry Smith PetscLogFlops(user_flops) 1953*5c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 1954*5c6c1daeSBarry Smith .ve 1955*5c6c1daeSBarry Smith 1956*5c6c1daeSBarry Smith Notes: 1957*5c6c1daeSBarry Smith A global counter logs all PETSc flop counts. The user can use 1958*5c6c1daeSBarry Smith PetscLogFlops() to increment this counter to include flops for the 1959*5c6c1daeSBarry Smith application code. 1960*5c6c1daeSBarry Smith 1961*5c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 1962*5c6c1daeSBarry Smith compiled with -DPETSC_USE_LOG (which is the default), and -log, 1963*5c6c1daeSBarry Smith -log_summary, or -log_all are specified. PetscLogFlops() is 1964*5c6c1daeSBarry Smith intended for logging user flops to supplement this PETSc 1965*5c6c1daeSBarry Smith information. 1966*5c6c1daeSBarry Smith 1967*5c6c1daeSBarry Smith Level: intermediate 1968*5c6c1daeSBarry Smith 1969*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscGetFlops() 1970*5c6c1daeSBarry Smith 1971*5c6c1daeSBarry Smith .keywords: log, flops, floating point operations 1972*5c6c1daeSBarry Smith M*/ 1973*5c6c1daeSBarry Smith 1974*5c6c1daeSBarry Smith /*MC 1975*5c6c1daeSBarry Smith PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) 1976*5c6c1daeSBarry Smith to get accurate timings 1977*5c6c1daeSBarry Smith 1978*5c6c1daeSBarry Smith Synopsis: 1979*5c6c1daeSBarry Smith void PetscPreLoadBegin(PetscBool flag,char *name); 1980*5c6c1daeSBarry Smith 1981*5c6c1daeSBarry Smith Not Collective 1982*5c6c1daeSBarry Smith 1983*5c6c1daeSBarry Smith Input Parameter: 1984*5c6c1daeSBarry Smith + flag - PETSC_TRUE to run twice, PETSC_FALSE to run once, may be overridden 1985*5c6c1daeSBarry Smith with command line option -preload true or -preload false 1986*5c6c1daeSBarry Smith - name - name of first stage (lines of code timed separately with -log_summary) to 1987*5c6c1daeSBarry Smith be preloaded 1988*5c6c1daeSBarry Smith 1989*5c6c1daeSBarry Smith Usage: 1990*5c6c1daeSBarry Smith .vb 1991*5c6c1daeSBarry Smith PetscPreLoadBegin(PETSC_TRUE,"first stage); 1992*5c6c1daeSBarry Smith lines of code 1993*5c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 1994*5c6c1daeSBarry Smith lines of code 1995*5c6c1daeSBarry Smith PetscPreLoadEnd(); 1996*5c6c1daeSBarry Smith .ve 1997*5c6c1daeSBarry Smith 1998*5c6c1daeSBarry Smith Notes: Only works in C/C++, not Fortran 1999*5c6c1daeSBarry Smith 2000*5c6c1daeSBarry Smith Flags available within the macro. 2001*5c6c1daeSBarry Smith + PetscPreLoadingUsed - true if we are or have done preloading 2002*5c6c1daeSBarry Smith . PetscPreLoadingOn - true if it is CURRENTLY doing preload 2003*5c6c1daeSBarry Smith . PetscPreLoadIt - 0 for the first computation (with preloading turned off it is only 0) 1 for the second 2004*5c6c1daeSBarry Smith - PetscPreLoadMax - number of times it will do the computation, only one when preloading is turned on 2005*5c6c1daeSBarry Smith The first two variables are available throughout the program, the second two only between the PetscPreLoadBegin() 2006*5c6c1daeSBarry Smith and PetscPreLoadEnd() 2007*5c6c1daeSBarry Smith 2008*5c6c1daeSBarry Smith Level: intermediate 2009*5c6c1daeSBarry Smith 2010*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadEnd(), PetscPreLoadStage() 2011*5c6c1daeSBarry Smith 2012*5c6c1daeSBarry Smith Concepts: preloading 2013*5c6c1daeSBarry Smith Concepts: timing^accurate 2014*5c6c1daeSBarry Smith Concepts: paging^eliminating effects of 2015*5c6c1daeSBarry Smith 2016*5c6c1daeSBarry Smith 2017*5c6c1daeSBarry Smith M*/ 2018*5c6c1daeSBarry Smith 2019*5c6c1daeSBarry Smith /*MC 2020*5c6c1daeSBarry Smith PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) 2021*5c6c1daeSBarry Smith to get accurate timings 2022*5c6c1daeSBarry Smith 2023*5c6c1daeSBarry Smith Synopsis: 2024*5c6c1daeSBarry Smith void PetscPreLoadEnd(void); 2025*5c6c1daeSBarry Smith 2026*5c6c1daeSBarry Smith Not Collective 2027*5c6c1daeSBarry Smith 2028*5c6c1daeSBarry Smith Usage: 2029*5c6c1daeSBarry Smith .vb 2030*5c6c1daeSBarry Smith PetscPreLoadBegin(PETSC_TRUE,"first stage); 2031*5c6c1daeSBarry Smith lines of code 2032*5c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 2033*5c6c1daeSBarry Smith lines of code 2034*5c6c1daeSBarry Smith PetscPreLoadEnd(); 2035*5c6c1daeSBarry Smith .ve 2036*5c6c1daeSBarry Smith 2037*5c6c1daeSBarry Smith Notes: only works in C/C++ not fortran 2038*5c6c1daeSBarry Smith 2039*5c6c1daeSBarry Smith Level: intermediate 2040*5c6c1daeSBarry Smith 2041*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadStage() 2042*5c6c1daeSBarry Smith 2043*5c6c1daeSBarry Smith M*/ 2044*5c6c1daeSBarry Smith 2045*5c6c1daeSBarry Smith /*MC 2046*5c6c1daeSBarry Smith PetscPreLoadStage - Start a new segment of code to be timed separately. 2047*5c6c1daeSBarry Smith to get accurate timings 2048*5c6c1daeSBarry Smith 2049*5c6c1daeSBarry Smith Synopsis: 2050*5c6c1daeSBarry Smith void PetscPreLoadStage(char *name); 2051*5c6c1daeSBarry Smith 2052*5c6c1daeSBarry Smith Not Collective 2053*5c6c1daeSBarry Smith 2054*5c6c1daeSBarry Smith Usage: 2055*5c6c1daeSBarry Smith .vb 2056*5c6c1daeSBarry Smith PetscPreLoadBegin(PETSC_TRUE,"first stage); 2057*5c6c1daeSBarry Smith lines of code 2058*5c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 2059*5c6c1daeSBarry Smith lines of code 2060*5c6c1daeSBarry Smith PetscPreLoadEnd(); 2061*5c6c1daeSBarry Smith .ve 2062*5c6c1daeSBarry Smith 2063*5c6c1daeSBarry Smith Notes: only works in C/C++ not fortran 2064*5c6c1daeSBarry Smith 2065*5c6c1daeSBarry Smith Level: intermediate 2066*5c6c1daeSBarry Smith 2067*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd() 2068*5c6c1daeSBarry Smith 2069*5c6c1daeSBarry Smith M*/ 2070*5c6c1daeSBarry Smith 2071*5c6c1daeSBarry Smith #undef __FUNCT__ 2072*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogViewPython" 2073*5c6c1daeSBarry Smith /*@ 2074*5c6c1daeSBarry Smith PetscLogViewPython - Saves logging information in a Python format. 2075*5c6c1daeSBarry Smith 2076*5c6c1daeSBarry Smith Collective on PetscViewer 2077*5c6c1daeSBarry Smith 2078*5c6c1daeSBarry Smith Input Paramter: 2079*5c6c1daeSBarry Smith . viewer - viewer to save Python data 2080*5c6c1daeSBarry Smith 2081*5c6c1daeSBarry Smith Level: intermediate 2082*5c6c1daeSBarry Smith 2083*5c6c1daeSBarry Smith @*/ 2084*5c6c1daeSBarry Smith PetscErrorCode PetscLogViewPython(PetscViewer viewer) 2085*5c6c1daeSBarry Smith { 2086*5c6c1daeSBarry Smith FILE *fd; 2087*5c6c1daeSBarry Smith PetscLogDouble zero = 0.0; 2088*5c6c1daeSBarry Smith PetscStageLog stageLog; 2089*5c6c1daeSBarry Smith PetscStageInfo *stageInfo = PETSC_NULL; 2090*5c6c1daeSBarry Smith PetscEventPerfInfo *eventInfo = PETSC_NULL; 2091*5c6c1daeSBarry Smith const char *name; 2092*5c6c1daeSBarry Smith char stageName[2048]; 2093*5c6c1daeSBarry Smith char eventName[2048]; 2094*5c6c1daeSBarry Smith PetscLogDouble locTotalTime, TotalTime = 0, TotalFlops = 0; 2095*5c6c1daeSBarry Smith PetscLogDouble numMessages = 0, messageLength = 0, avgMessLen, numReductions = 0; 2096*5c6c1daeSBarry Smith PetscLogDouble stageTime, flops, mem, mess, messLen, red; 2097*5c6c1daeSBarry Smith PetscLogDouble fracTime, fracFlops, fracMessages, fracLength; 2098*5c6c1daeSBarry Smith PetscLogDouble fracReductions; 2099*5c6c1daeSBarry Smith PetscLogDouble tot,avg,x,y,*mydata; 2100*5c6c1daeSBarry Smith PetscMPIInt maxCt; 2101*5c6c1daeSBarry Smith PetscMPIInt size, rank, *mycount; 2102*5c6c1daeSBarry Smith PetscBool *localStageUsed, *stageUsed; 2103*5c6c1daeSBarry Smith PetscBool *localStageVisible, *stageVisible; 2104*5c6c1daeSBarry Smith int numStages, localNumEvents, numEvents; 2105*5c6c1daeSBarry Smith int stage, lastStage; 2106*5c6c1daeSBarry Smith PetscLogEvent event; 2107*5c6c1daeSBarry Smith PetscErrorCode ierr; 2108*5c6c1daeSBarry Smith PetscInt i; 2109*5c6c1daeSBarry Smith MPI_Comm comm; 2110*5c6c1daeSBarry Smith 2111*5c6c1daeSBarry Smith PetscFunctionBegin; 2112*5c6c1daeSBarry Smith ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr); 2113*5c6c1daeSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 2114*5c6c1daeSBarry Smith ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 2115*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 2116*5c6c1daeSBarry Smith ierr = PetscMalloc(size*sizeof(PetscLogDouble), &mydata);CHKERRQ(ierr); 2117*5c6c1daeSBarry Smith ierr = PetscMalloc(size*sizeof(PetscMPIInt), &mycount);CHKERRQ(ierr); 2118*5c6c1daeSBarry Smith 2119*5c6c1daeSBarry Smith /* Pop off any stages the user forgot to remove */ 2120*5c6c1daeSBarry Smith lastStage = 0; 2121*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 2122*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 2123*5c6c1daeSBarry Smith while (stage >= 0) { 2124*5c6c1daeSBarry Smith lastStage = stage; 2125*5c6c1daeSBarry Smith ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 2126*5c6c1daeSBarry Smith ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 2127*5c6c1daeSBarry Smith } 2128*5c6c1daeSBarry Smith /* Get the total elapsed time */ 2129*5c6c1daeSBarry Smith PetscTime(locTotalTime); locTotalTime -= petsc_BaseTime; 2130*5c6c1daeSBarry Smith 2131*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n#------ PETSc Performance Summary ----------\n\n");CHKERRQ(ierr); 2132*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Nproc = %d\n",size);CHKERRQ(ierr); 2133*5c6c1daeSBarry Smith 2134*5c6c1daeSBarry Smith /* Must preserve reduction count before we go on */ 2135*5c6c1daeSBarry Smith red = (petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct)/((PetscLogDouble) size); 2136*5c6c1daeSBarry Smith 2137*5c6c1daeSBarry Smith /* Calculate summary information */ 2138*5c6c1daeSBarry Smith 2139*5c6c1daeSBarry Smith /* Time */ 2140*5c6c1daeSBarry Smith ierr = MPI_Gather(&locTotalTime,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2141*5c6c1daeSBarry Smith if (!rank){ 2142*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Time = [ " );CHKERRQ(ierr); 2143*5c6c1daeSBarry Smith tot = 0.0; 2144*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2145*5c6c1daeSBarry Smith tot += mydata[i]; 2146*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2147*5c6c1daeSBarry Smith } 2148*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2149*5c6c1daeSBarry Smith avg = (tot)/((PetscLogDouble) size); 2150*5c6c1daeSBarry Smith TotalTime = tot; 2151*5c6c1daeSBarry Smith } 2152*5c6c1daeSBarry Smith 2153*5c6c1daeSBarry Smith /* Objects */ 2154*5c6c1daeSBarry Smith avg = (PetscLogDouble) petsc_numObjects; 2155*5c6c1daeSBarry Smith ierr = MPI_Gather(&avg,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2156*5c6c1daeSBarry Smith if (!rank){ 2157*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Objects = [ " );CHKERRQ(ierr); 2158*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2159*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2160*5c6c1daeSBarry Smith } 2161*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2162*5c6c1daeSBarry Smith } 2163*5c6c1daeSBarry Smith 2164*5c6c1daeSBarry Smith /* Flops */ 2165*5c6c1daeSBarry Smith ierr = MPI_Gather(&petsc_TotalFlops,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2166*5c6c1daeSBarry Smith if (!rank){ 2167*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Flops = [ " );CHKERRQ(ierr); 2168*5c6c1daeSBarry Smith tot = 0.0; 2169*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2170*5c6c1daeSBarry Smith tot += mydata[i]; 2171*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2172*5c6c1daeSBarry Smith } 2173*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr); 2174*5c6c1daeSBarry Smith TotalFlops = tot; 2175*5c6c1daeSBarry Smith } 2176*5c6c1daeSBarry Smith 2177*5c6c1daeSBarry Smith /* Memory */ 2178*5c6c1daeSBarry Smith ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr); 2179*5c6c1daeSBarry Smith ierr = MPI_Gather(&mem,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2180*5c6c1daeSBarry Smith if (!rank){ 2181*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "Memory = [ " );CHKERRQ(ierr); 2182*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2183*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2184*5c6c1daeSBarry Smith } 2185*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2186*5c6c1daeSBarry Smith } 2187*5c6c1daeSBarry Smith 2188*5c6c1daeSBarry Smith /* Messages */ 2189*5c6c1daeSBarry Smith mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct); 2190*5c6c1daeSBarry Smith ierr = MPI_Gather(&mess,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2191*5c6c1daeSBarry Smith if (!rank){ 2192*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPIMessages = [ " );CHKERRQ(ierr); 2193*5c6c1daeSBarry Smith tot = 0.0; 2194*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2195*5c6c1daeSBarry Smith tot += mydata[i]; 2196*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2197*5c6c1daeSBarry Smith } 2198*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2199*5c6c1daeSBarry Smith numMessages = tot; 2200*5c6c1daeSBarry Smith } 2201*5c6c1daeSBarry Smith 2202*5c6c1daeSBarry Smith /* Message Lengths */ 2203*5c6c1daeSBarry Smith mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len); 2204*5c6c1daeSBarry Smith ierr = MPI_Gather(&mess,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2205*5c6c1daeSBarry Smith if (!rank){ 2206*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPIMessageLengths = [ " );CHKERRQ(ierr); 2207*5c6c1daeSBarry Smith tot = 0.0; 2208*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2209*5c6c1daeSBarry Smith tot += mydata[i]; 2210*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2211*5c6c1daeSBarry Smith } 2212*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2213*5c6c1daeSBarry Smith messageLength = tot; 2214*5c6c1daeSBarry Smith } 2215*5c6c1daeSBarry Smith 2216*5c6c1daeSBarry Smith /* Reductions */ 2217*5c6c1daeSBarry Smith ierr = MPI_Gather(&red,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr); 2218*5c6c1daeSBarry Smith if (!rank){ 2219*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "MPIReductions = [ " );CHKERRQ(ierr); 2220*5c6c1daeSBarry Smith tot = 0.0; 2221*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2222*5c6c1daeSBarry Smith tot += mydata[i]; 2223*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2224*5c6c1daeSBarry Smith } 2225*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2226*5c6c1daeSBarry Smith numReductions = tot; 2227*5c6c1daeSBarry Smith } 2228*5c6c1daeSBarry Smith 2229*5c6c1daeSBarry Smith /* Get total number of stages -- 2230*5c6c1daeSBarry Smith Currently, a single processor can register more stages than another, but stages must all be registered in order. 2231*5c6c1daeSBarry Smith We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID. 2232*5c6c1daeSBarry Smith This seems best accomplished by assoicating a communicator with each stage. 2233*5c6c1daeSBarry Smith */ 2234*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 2235*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageUsed);CHKERRQ(ierr); 2236*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr); 2237*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageVisible);CHKERRQ(ierr); 2238*5c6c1daeSBarry Smith ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr); 2239*5c6c1daeSBarry Smith if (numStages > 0) { 2240*5c6c1daeSBarry Smith stageInfo = stageLog->stageInfo; 2241*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 2242*5c6c1daeSBarry Smith if (stage < stageLog->numStages) { 2243*5c6c1daeSBarry Smith localStageUsed[stage] = stageInfo[stage].used; 2244*5c6c1daeSBarry Smith localStageVisible[stage] = stageInfo[stage].perfInfo.visible; 2245*5c6c1daeSBarry Smith } else { 2246*5c6c1daeSBarry Smith localStageUsed[stage] = PETSC_FALSE; 2247*5c6c1daeSBarry Smith localStageVisible[stage] = PETSC_TRUE; 2248*5c6c1daeSBarry Smith } 2249*5c6c1daeSBarry Smith } 2250*5c6c1daeSBarry Smith ierr = MPI_Allreduce(localStageUsed, stageUsed, numStages, MPI_INT, MPI_LOR, comm);CHKERRQ(ierr); 2251*5c6c1daeSBarry Smith ierr = MPI_Allreduce(localStageVisible, stageVisible, numStages, MPI_INT, MPI_LAND, comm);CHKERRQ(ierr); 2252*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 2253*5c6c1daeSBarry Smith if (stageUsed[stage]) { 2254*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n#Summary of Stages: ----- Time ------ ----- Flops ----- --- Messages --- -- Message Lengths -- -- Reductions --\n");CHKERRQ(ierr); 2255*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "# Avg %%Total Avg %%Total counts %%Total Avg %%Total counts %%Total \n");CHKERRQ(ierr); 2256*5c6c1daeSBarry Smith break; 2257*5c6c1daeSBarry Smith } 2258*5c6c1daeSBarry Smith } 2259*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 2260*5c6c1daeSBarry Smith if (!stageUsed[stage]) continue; 2261*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 2262*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2263*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2264*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2265*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2266*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2267*5c6c1daeSBarry Smith name = stageInfo[stage].name; 2268*5c6c1daeSBarry Smith } else { 2269*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2270*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2271*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2272*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2273*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2274*5c6c1daeSBarry Smith name = ""; 2275*5c6c1daeSBarry Smith } 2276*5c6c1daeSBarry Smith mess *= 0.5; messLen *= 0.5; red /= size; 2277*5c6c1daeSBarry Smith if (TotalTime != 0.0) fracTime = stageTime/TotalTime; else fracTime = 0.0; 2278*5c6c1daeSBarry Smith if (TotalFlops != 0.0) fracFlops = flops/TotalFlops; else fracFlops = 0.0; 2279*5c6c1daeSBarry Smith /* Talk to Barry if (stageTime != 0.0) flops = (size*flops)/stageTime; else flops = 0.0; */ 2280*5c6c1daeSBarry Smith if (numMessages != 0.0) fracMessages = mess/numMessages; else fracMessages = 0.0; 2281*5c6c1daeSBarry Smith if (numMessages != 0.0) avgMessLen = messLen/numMessages; else avgMessLen = 0.0; 2282*5c6c1daeSBarry Smith if (messageLength != 0.0) fracLength = messLen/messageLength; else fracLength = 0.0; 2283*5c6c1daeSBarry Smith if (numReductions != 0.0) fracReductions = red/numReductions; else fracReductions = 0.0; 2284*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "# "); 2285*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%2d: %15s: %6.4e %5.1f%% %6.4e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% \n", 2286*5c6c1daeSBarry Smith stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops, 2287*5c6c1daeSBarry Smith mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr); 2288*5c6c1daeSBarry Smith } 2289*5c6c1daeSBarry Smith } 2290*5c6c1daeSBarry Smith 2291*5c6c1daeSBarry Smith /* Report events */ 2292*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"\n# Event\n");CHKERRQ(ierr); 2293*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"# ------------------------------------------------------\n");CHKERRQ(ierr); 2294*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"class Stage(object):\n");CHKERRQ(ierr); 2295*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," def __init__(self, name, time, flops, numMessages, messageLength, numReductions):\n");CHKERRQ(ierr); 2296*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," # The time and flops represent totals across processes, whereas reductions are only counted once\n");CHKERRQ(ierr); 2297*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.name = name\n");CHKERRQ(ierr); 2298*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.time = time\n");CHKERRQ(ierr); 2299*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.flops = flops\n");CHKERRQ(ierr); 2300*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.numMessages = numMessages\n");CHKERRQ(ierr); 2301*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.messageLength = messageLength\n");CHKERRQ(ierr); 2302*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.numReductions = numReductions\n");CHKERRQ(ierr); 2303*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd," self.event = {}\n");CHKERRQ(ierr); 2304*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd, "class Dummy(object):\n");CHKERRQ(ierr); 2305*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd, " pass\n");CHKERRQ(ierr); 2306*5c6c1daeSBarry Smith /* Problem: The stage name will not show up unless the stage executed on proc 1 */ 2307*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 2308*5c6c1daeSBarry Smith if (!stageVisible[stage]) continue; 2309*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 2310*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2311*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2312*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2313*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2314*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2315*5c6c1daeSBarry Smith } else { 2316*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 2317*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2318*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2319*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2320*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2321*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 2322*5c6c1daeSBarry Smith } 2323*5c6c1daeSBarry Smith mess *= 0.5; messLen *= 0.5; red /= size; 2324*5c6c1daeSBarry Smith 2325*5c6c1daeSBarry Smith /* Get total number of events in this stage -- 2326*5c6c1daeSBarry Smith Currently, a single processor can register more events than another, but events must all be registered in order, 2327*5c6c1daeSBarry Smith just like stages. We can removed this requirement if necessary by having a global event numbering and indirection 2328*5c6c1daeSBarry Smith on the event ID. This seems best accomplished by assoicating a communicator with each stage. 2329*5c6c1daeSBarry Smith 2330*5c6c1daeSBarry Smith Problem: If the event did not happen on proc 1, its name will not be available. 2331*5c6c1daeSBarry Smith Problem: Event visibility is not implemented 2332*5c6c1daeSBarry Smith */ 2333*5c6c1daeSBarry Smith 2334*5c6c1daeSBarry Smith { 2335*5c6c1daeSBarry Smith size_t len, c; 2336*5c6c1daeSBarry Smith 2337*5c6c1daeSBarry Smith ierr = PetscStrcpy(stageName, stageInfo[stage].name);CHKERRQ(ierr); 2338*5c6c1daeSBarry Smith ierr = PetscStrlen(stageName, &len);CHKERRQ(ierr); 2339*5c6c1daeSBarry Smith for (c = 0; c < len; ++c) { 2340*5c6c1daeSBarry Smith if (stageName[c] == ' ') stageName[c] = '_'; 2341*5c6c1daeSBarry Smith } 2342*5c6c1daeSBarry Smith } 2343*5c6c1daeSBarry Smith if (!rank){ 2344*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s = Stage('%s', %g, %g, %g, %g, %g)\n", stageName, stageName, stageTime, flops, mess, messLen, red);CHKERRQ(ierr); 2345*5c6c1daeSBarry Smith } 2346*5c6c1daeSBarry Smith 2347*5c6c1daeSBarry Smith if (localStageUsed[stage]) { 2348*5c6c1daeSBarry Smith eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo; 2349*5c6c1daeSBarry Smith localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents; 2350*5c6c1daeSBarry Smith } else { 2351*5c6c1daeSBarry Smith localNumEvents = 0; 2352*5c6c1daeSBarry Smith } 2353*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 2354*5c6c1daeSBarry Smith for (event = 0; event < numEvents; event++) { 2355*5c6c1daeSBarry Smith PetscBool hasEvent = PETSC_TRUE; 2356*5c6c1daeSBarry Smith PetscMPIInt tmpI; 2357*5c6c1daeSBarry Smith PetscLogDouble tmpR; 2358*5c6c1daeSBarry Smith 2359*5c6c1daeSBarry Smith if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) { 2360*5c6c1daeSBarry Smith size_t len, c; 2361*5c6c1daeSBarry Smith 2362*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&eventInfo[event].count, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 2363*5c6c1daeSBarry Smith ierr = PetscStrcpy(eventName, stageLog->eventLog->eventInfo[event].name);CHKERRQ(ierr); 2364*5c6c1daeSBarry Smith ierr = PetscStrlen(eventName, &len);CHKERRQ(ierr); 2365*5c6c1daeSBarry Smith for (c = 0; c < len; ++c) { 2366*5c6c1daeSBarry Smith if (eventName[c] == ' ') eventName[c] = '_'; 2367*5c6c1daeSBarry Smith } 2368*5c6c1daeSBarry Smith } else { 2369*5c6c1daeSBarry Smith ierr = MPI_Allreduce(&ierr, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 2370*5c6c1daeSBarry Smith eventName[0] = 0; 2371*5c6c1daeSBarry Smith hasEvent = PETSC_FALSE; 2372*5c6c1daeSBarry Smith } 2373*5c6c1daeSBarry Smith 2374*5c6c1daeSBarry Smith if (maxCt != 0) { 2375*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd,"#\n");CHKERRQ(ierr); 2376*5c6c1daeSBarry Smith if (!rank){ 2377*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s = Dummy()\n",eventName);CHKERRQ(ierr); 2378*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.event['%s'] = %s\n",stageName,eventName,eventName);CHKERRQ(ierr); 2379*5c6c1daeSBarry Smith } 2380*5c6c1daeSBarry Smith /* Count */ 2381*5c6c1daeSBarry Smith if (hasEvent) {tmpI = eventInfo[event].count;} 2382*5c6c1daeSBarry Smith else {tmpI = 0;} 2383*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpI,1, MPI_INT, mycount, 1, MPI_INT, 0, comm);CHKERRQ(ierr); 2384*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.Count = [ ", eventName);CHKERRQ(ierr); 2385*5c6c1daeSBarry Smith if (!rank){ 2386*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2387*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %7d,",mycount[i] );CHKERRQ(ierr); 2388*5c6c1daeSBarry Smith } 2389*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2390*5c6c1daeSBarry Smith } 2391*5c6c1daeSBarry Smith /* Time */ 2392*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].time;} 2393*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2394*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2395*5c6c1daeSBarry Smith if (!rank){ 2396*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.Time = [ ", eventName);CHKERRQ(ierr); 2397*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2398*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2399*5c6c1daeSBarry Smith } 2400*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2401*5c6c1daeSBarry Smith } 2402*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].time2;} 2403*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2404*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2405*5c6c1daeSBarry Smith if (!rank){ 2406*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.Time2 = [ ", eventName);CHKERRQ(ierr); 2407*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2408*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,", mydata[i]);CHKERRQ(ierr); 2409*5c6c1daeSBarry Smith } 2410*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2411*5c6c1daeSBarry Smith } 2412*5c6c1daeSBarry Smith /* Flops */ 2413*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].flops;} 2414*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2415*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2416*5c6c1daeSBarry Smith if (!rank){ 2417*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.Flops = [ ", eventName);CHKERRQ(ierr); 2418*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2419*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2420*5c6c1daeSBarry Smith } 2421*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr); 2422*5c6c1daeSBarry Smith } 2423*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].flops2;} 2424*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2425*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2426*5c6c1daeSBarry Smith if (!rank){ 2427*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.Flops2 = [ ", eventName);CHKERRQ(ierr); 2428*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2429*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,", mydata[i]);CHKERRQ(ierr); 2430*5c6c1daeSBarry Smith } 2431*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr); 2432*5c6c1daeSBarry Smith } 2433*5c6c1daeSBarry Smith /* Num Messages */ 2434*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].numMessages;} 2435*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2436*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2437*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.NumMessages = [ ", eventName);CHKERRQ(ierr); 2438*5c6c1daeSBarry Smith if (!rank){ 2439*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2440*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %7.1e,",mydata[i] );CHKERRQ(ierr); 2441*5c6c1daeSBarry Smith } 2442*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2443*5c6c1daeSBarry Smith } 2444*5c6c1daeSBarry Smith /* Message Length */ 2445*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].messageLength;} 2446*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2447*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2448*5c6c1daeSBarry Smith if (!rank){ 2449*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.MessageLength = [ ", eventName);CHKERRQ(ierr); 2450*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2451*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %5.3e,",mydata[i] );CHKERRQ(ierr); 2452*5c6c1daeSBarry Smith } 2453*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2454*5c6c1daeSBarry Smith } 2455*5c6c1daeSBarry Smith /* Num Reductions */ 2456*5c6c1daeSBarry Smith if (hasEvent) {tmpR = eventInfo[event].numReductions;} 2457*5c6c1daeSBarry Smith else {tmpR = 0.0;} 2458*5c6c1daeSBarry Smith ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr); 2459*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "%s.NumReductions = [ ", eventName);CHKERRQ(ierr); 2460*5c6c1daeSBarry Smith if (!rank){ 2461*5c6c1daeSBarry Smith for (i=0; i<size; i++){ 2462*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, " %7.1e,",mydata[i] );CHKERRQ(ierr); 2463*5c6c1daeSBarry Smith } 2464*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr); 2465*5c6c1daeSBarry Smith } 2466*5c6c1daeSBarry Smith } 2467*5c6c1daeSBarry Smith } 2468*5c6c1daeSBarry Smith } 2469*5c6c1daeSBarry Smith 2470*5c6c1daeSBarry Smith /* Right now, only stages on the first processor are reported here, meaning only objects associated with 2471*5c6c1daeSBarry Smith the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then 2472*5c6c1daeSBarry Smith stats for stages local to processor sets. 2473*5c6c1daeSBarry Smith */ 2474*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) { 2475*5c6c1daeSBarry Smith if (!localStageUsed[stage]) { 2476*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 2477*5c6c1daeSBarry Smith } 2478*5c6c1daeSBarry Smith } 2479*5c6c1daeSBarry Smith 2480*5c6c1daeSBarry Smith ierr = PetscFree(localStageUsed);CHKERRQ(ierr); 2481*5c6c1daeSBarry Smith ierr = PetscFree(stageUsed);CHKERRQ(ierr); 2482*5c6c1daeSBarry Smith ierr = PetscFree(localStageVisible);CHKERRQ(ierr); 2483*5c6c1daeSBarry Smith ierr = PetscFree(stageVisible);CHKERRQ(ierr); 2484*5c6c1daeSBarry Smith ierr = PetscFree(mydata);CHKERRQ(ierr); 2485*5c6c1daeSBarry Smith ierr = PetscFree(mycount);CHKERRQ(ierr); 2486*5c6c1daeSBarry Smith 2487*5c6c1daeSBarry Smith /* Information unrelated to this particular run */ 2488*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, 2489*5c6c1daeSBarry Smith "# ========================================================================================================================\n");CHKERRQ(ierr); 2490*5c6c1daeSBarry Smith PetscTime(y); 2491*5c6c1daeSBarry Smith PetscTime(x); 2492*5c6c1daeSBarry Smith PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); 2493*5c6c1daeSBarry Smith PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); 2494*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"AveragetimetogetPetscTime = %g\n", (y-x)/10.0);CHKERRQ(ierr); 2495*5c6c1daeSBarry Smith /* MPI information */ 2496*5c6c1daeSBarry Smith if (size > 1) { 2497*5c6c1daeSBarry Smith MPI_Status status; 2498*5c6c1daeSBarry Smith PetscMPIInt tag; 2499*5c6c1daeSBarry Smith MPI_Comm newcomm; 2500*5c6c1daeSBarry Smith 2501*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2502*5c6c1daeSBarry Smith PetscTime(x); 2503*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2504*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2505*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2506*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2507*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2508*5c6c1daeSBarry Smith PetscTime(y); 2509*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "AveragetimeforMPI_Barrier = %g\n", (y-x)/5.0);CHKERRQ(ierr); 2510*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr); 2511*5c6c1daeSBarry Smith ierr = MPI_Barrier(comm);CHKERRQ(ierr); 2512*5c6c1daeSBarry Smith if (rank) { 2513*5c6c1daeSBarry Smith ierr = MPI_Recv(0, 0, MPI_INT, rank-1, tag, newcomm, &status);CHKERRQ(ierr); 2514*5c6c1daeSBarry Smith ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr); 2515*5c6c1daeSBarry Smith } else { 2516*5c6c1daeSBarry Smith PetscTime(x); 2517*5c6c1daeSBarry Smith ierr = MPI_Send(0, 0, MPI_INT, 1, tag, newcomm);CHKERRQ(ierr); 2518*5c6c1daeSBarry Smith ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr); 2519*5c6c1daeSBarry Smith PetscTime(y); 2520*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm,fd,"AveragetimforzerosizeMPI_Send = %g\n", (y-x)/size);CHKERRQ(ierr); 2521*5c6c1daeSBarry Smith } 2522*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr); 2523*5c6c1daeSBarry Smith } 2524*5c6c1daeSBarry Smith 2525*5c6c1daeSBarry Smith /* Cleanup */ 2526*5c6c1daeSBarry Smith ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr); 2527*5c6c1daeSBarry Smith ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr); 2528*5c6c1daeSBarry Smith PetscFunctionReturn(0); 2529*5c6c1daeSBarry Smith } 2530*5c6c1daeSBarry Smith 2531*5c6c1daeSBarry Smith #else /* end of -DPETSC_USE_LOG section */ 2532*5c6c1daeSBarry Smith 2533*5c6c1daeSBarry Smith #undef __FUNCT__ 2534*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjectState" 2535*5c6c1daeSBarry Smith PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 2536*5c6c1daeSBarry Smith { 2537*5c6c1daeSBarry Smith PetscFunctionBegin; 2538*5c6c1daeSBarry Smith PetscFunctionReturn(0); 2539*5c6c1daeSBarry Smith } 2540*5c6c1daeSBarry Smith 2541*5c6c1daeSBarry Smith #endif /* PETSC_USE_LOG*/ 2542*5c6c1daeSBarry Smith 2543*5c6c1daeSBarry Smith 2544*5c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 2545*5c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID = 0; 2546*5c6c1daeSBarry Smith 2547*5c6c1daeSBarry Smith #undef __FUNCT__ 2548*5c6c1daeSBarry Smith #define __FUNCT__ "PetscClassIdRegister" 2549*5c6c1daeSBarry Smith /*@C 2550*5c6c1daeSBarry Smith PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code. 2551*5c6c1daeSBarry Smith 2552*5c6c1daeSBarry Smith Not Collective 2553*5c6c1daeSBarry Smith 2554*5c6c1daeSBarry Smith Input Parameter: 2555*5c6c1daeSBarry Smith . name - The class name 2556*5c6c1daeSBarry Smith 2557*5c6c1daeSBarry Smith Output Parameter: 2558*5c6c1daeSBarry Smith . oclass - The class id or classid 2559*5c6c1daeSBarry Smith 2560*5c6c1daeSBarry Smith Level: developer 2561*5c6c1daeSBarry Smith 2562*5c6c1daeSBarry Smith .keywords: log, class, register 2563*5c6c1daeSBarry Smith 2564*5c6c1daeSBarry Smith @*/ 2565*5c6c1daeSBarry Smith PetscErrorCode PetscClassIdRegister(const char name[],PetscClassId *oclass ) 2566*5c6c1daeSBarry Smith { 2567*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 2568*5c6c1daeSBarry Smith PetscStageLog stageLog; 2569*5c6c1daeSBarry Smith PetscInt stage; 2570*5c6c1daeSBarry Smith PetscErrorCode ierr; 2571*5c6c1daeSBarry Smith #endif 2572*5c6c1daeSBarry Smith 2573*5c6c1daeSBarry Smith PetscFunctionBegin; 2574*5c6c1daeSBarry Smith *oclass = ++PETSC_LARGEST_CLASSID; 2575*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 2576*5c6c1daeSBarry Smith ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 2577*5c6c1daeSBarry Smith ierr = PetscClassRegLogRegister(stageLog->classLog, name, *oclass);CHKERRQ(ierr); 2578*5c6c1daeSBarry Smith for (stage = 0; stage < stageLog->numStages; stage++) { 2579*5c6c1daeSBarry Smith ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 2580*5c6c1daeSBarry Smith } 2581*5c6c1daeSBarry Smith #endif 2582*5c6c1daeSBarry Smith PetscFunctionReturn(0); 2583*5c6c1daeSBarry Smith } 2584