178f1b9b4SToby Isaac #include <petscviewer.h> 278f1b9b4SToby Isaac #include <petscdevice.h> 378f1b9b4SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 478f1b9b4SToby Isaac #include <petsc/private/loghandlerimpl.h> 578f1b9b4SToby Isaac #include <petsc/private/deviceimpl.h> 678f1b9b4SToby Isaac #include <petscconfiginfo.h> 778f1b9b4SToby Isaac #include <petscmachineinfo.h> 878f1b9b4SToby Isaac #include "logdefault.h" 978f1b9b4SToby Isaac 1078f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoInit(PetscEventPerfInfo *eventInfo) 1178f1b9b4SToby Isaac { 1278f1b9b4SToby Isaac PetscFunctionBegin; 1378f1b9b4SToby Isaac PetscCall(PetscMemzero(eventInfo, sizeof(*eventInfo))); 1478f1b9b4SToby Isaac eventInfo->visible = PETSC_TRUE; 1578f1b9b4SToby Isaac eventInfo->id = -1; 1678f1b9b4SToby Isaac eventInfo->dof[0] = -1.0; 1778f1b9b4SToby Isaac eventInfo->dof[1] = -1.0; 1878f1b9b4SToby Isaac eventInfo->dof[2] = -1.0; 1978f1b9b4SToby Isaac eventInfo->dof[3] = -1.0; 2078f1b9b4SToby Isaac eventInfo->dof[4] = -1.0; 2178f1b9b4SToby Isaac eventInfo->dof[5] = -1.0; 2278f1b9b4SToby Isaac eventInfo->dof[6] = -1.0; 2378f1b9b4SToby Isaac eventInfo->dof[7] = -1.0; 2478f1b9b4SToby Isaac eventInfo->errors[0] = -1.0; 2578f1b9b4SToby Isaac eventInfo->errors[1] = -1.0; 2678f1b9b4SToby Isaac eventInfo->errors[2] = -1.0; 2778f1b9b4SToby Isaac eventInfo->errors[3] = -1.0; 2878f1b9b4SToby Isaac eventInfo->errors[4] = -1.0; 2978f1b9b4SToby Isaac eventInfo->errors[5] = -1.0; 3078f1b9b4SToby Isaac eventInfo->errors[6] = -1.0; 3178f1b9b4SToby Isaac eventInfo->errors[7] = -1.0; 3278f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 3378f1b9b4SToby Isaac } 3478f1b9b4SToby Isaac 3578f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoTic_Internal(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event, PetscBool resume) 3678f1b9b4SToby Isaac { 3778f1b9b4SToby Isaac PetscFunctionBegin; 3878f1b9b4SToby Isaac if (resume) { 3978f1b9b4SToby Isaac eventInfo->timeTmp -= time; 4078f1b9b4SToby Isaac eventInfo->flopsTmp -= petsc_TotalFlops_th; 4178f1b9b4SToby Isaac } else { 4278f1b9b4SToby Isaac eventInfo->timeTmp = -time; 4378f1b9b4SToby Isaac eventInfo->flopsTmp = -petsc_TotalFlops_th; 4478f1b9b4SToby Isaac } 4578f1b9b4SToby Isaac eventInfo->numMessages -= petsc_irecv_ct_th + petsc_isend_ct_th + petsc_recv_ct_th + petsc_send_ct_th; 4678f1b9b4SToby Isaac eventInfo->messageLength -= petsc_irecv_len_th + petsc_isend_len_th + petsc_recv_len_th + petsc_send_len_th; 4778f1b9b4SToby Isaac eventInfo->numReductions -= petsc_allreduce_ct_th + petsc_gather_ct_th + petsc_scatter_ct_th; 4878f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 4978f1b9b4SToby Isaac eventInfo->CpuToGpuCount -= petsc_ctog_ct_th; 5078f1b9b4SToby Isaac eventInfo->GpuToCpuCount -= petsc_gtoc_ct_th; 5178f1b9b4SToby Isaac eventInfo->CpuToGpuSize -= petsc_ctog_sz_th; 5278f1b9b4SToby Isaac eventInfo->GpuToCpuSize -= petsc_gtoc_sz_th; 5378f1b9b4SToby Isaac eventInfo->GpuFlops -= petsc_gflops_th; 5478f1b9b4SToby Isaac eventInfo->GpuTime -= petsc_gtime; 555268dc8aSHong Zhang if (PetscLogGpuEnergyFlag) eventInfo->GpuEnergy -= petsc_genergy; 565268dc8aSHong Zhang if (PetscLogGpuEnergyMeterFlag) eventInfo->GpuEnergy -= petsc_genergy_meter; 5778f1b9b4SToby Isaac #endif 5878f1b9b4SToby Isaac if (logMemory) { 5978f1b9b4SToby Isaac PetscLogDouble usage; 6078f1b9b4SToby Isaac PetscCall(PetscMemoryGetCurrentUsage(&usage)); 6178f1b9b4SToby Isaac eventInfo->memIncrease -= usage; 6278f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&usage)); 6378f1b9b4SToby Isaac eventInfo->mallocSpace -= usage; 6478f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&usage)); 6578f1b9b4SToby Isaac eventInfo->mallocIncrease -= usage; 6678f1b9b4SToby Isaac PetscCall(PetscMallocPushMaximumUsage(event)); 6778f1b9b4SToby Isaac } 6878f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 6978f1b9b4SToby Isaac } 7078f1b9b4SToby Isaac 7178f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoTic(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event) 7278f1b9b4SToby Isaac { 7378f1b9b4SToby Isaac PetscFunctionBegin; 7478f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoTic_Internal(eventInfo, time, logMemory, event, PETSC_FALSE)); 7578f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 7678f1b9b4SToby Isaac } 7778f1b9b4SToby Isaac 7878f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoResume(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event) 7978f1b9b4SToby Isaac { 8078f1b9b4SToby Isaac PetscFunctionBegin; 8178f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoTic_Internal(eventInfo, time, logMemory, event, PETSC_TRUE)); 8278f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 8378f1b9b4SToby Isaac } 8478f1b9b4SToby Isaac 8578f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoToc_Internal(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event, PetscBool pause) 8678f1b9b4SToby Isaac { 8778f1b9b4SToby Isaac PetscFunctionBegin; 8878f1b9b4SToby Isaac eventInfo->timeTmp += time; 8978f1b9b4SToby Isaac eventInfo->flopsTmp += petsc_TotalFlops_th; 9078f1b9b4SToby Isaac if (!pause) { 9178f1b9b4SToby Isaac eventInfo->time += eventInfo->timeTmp; 9278f1b9b4SToby Isaac eventInfo->time2 += eventInfo->timeTmp * eventInfo->timeTmp; 9378f1b9b4SToby Isaac eventInfo->flops += eventInfo->flopsTmp; 9478f1b9b4SToby Isaac eventInfo->flops2 += eventInfo->flopsTmp * eventInfo->flopsTmp; 9578f1b9b4SToby Isaac } 9678f1b9b4SToby Isaac eventInfo->numMessages += petsc_irecv_ct_th + petsc_isend_ct_th + petsc_recv_ct_th + petsc_send_ct_th; 9778f1b9b4SToby Isaac eventInfo->messageLength += petsc_irecv_len_th + petsc_isend_len_th + petsc_recv_len + petsc_send_len_th; 9878f1b9b4SToby Isaac eventInfo->numReductions += petsc_allreduce_ct_th + petsc_gather_ct_th + petsc_scatter_ct_th; 9978f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 10078f1b9b4SToby Isaac eventInfo->CpuToGpuCount += petsc_ctog_ct_th; 10178f1b9b4SToby Isaac eventInfo->GpuToCpuCount += petsc_gtoc_ct_th; 10278f1b9b4SToby Isaac eventInfo->CpuToGpuSize += petsc_ctog_sz_th; 10378f1b9b4SToby Isaac eventInfo->GpuToCpuSize += petsc_gtoc_sz_th; 10478f1b9b4SToby Isaac eventInfo->GpuFlops += petsc_gflops_th; 10578f1b9b4SToby Isaac eventInfo->GpuTime += petsc_gtime; 1065268dc8aSHong Zhang if (PetscLogGpuEnergyFlag) eventInfo->GpuEnergy += petsc_genergy; 1075268dc8aSHong Zhang if (PetscLogGpuEnergyMeterFlag) eventInfo->GpuEnergy += petsc_genergy_meter; 10878f1b9b4SToby Isaac #endif 10978f1b9b4SToby Isaac if (logMemory) { 11078f1b9b4SToby Isaac PetscLogDouble usage, musage; 11178f1b9b4SToby Isaac PetscCall(PetscMemoryGetCurrentUsage(&usage)); /* the comments below match the column labels printed in PetscLogView_Default() */ 11278f1b9b4SToby Isaac eventInfo->memIncrease += usage; /* RMI */ 11378f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&usage)); 11478f1b9b4SToby Isaac eventInfo->mallocSpace += usage; /* Malloc */ 115835f2295SStefano Zampini PetscCall(PetscMallocPopMaximumUsage(event, &musage)); 11678f1b9b4SToby Isaac eventInfo->mallocIncreaseEvent = PetscMax(musage - usage, eventInfo->mallocIncreaseEvent); /* EMalloc */ 11778f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&usage)); 11878f1b9b4SToby Isaac eventInfo->mallocIncrease += usage; /* MMalloc */ 11978f1b9b4SToby Isaac } 12078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 12178f1b9b4SToby Isaac } 12278f1b9b4SToby Isaac 12378f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoToc(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event) 12478f1b9b4SToby Isaac { 12578f1b9b4SToby Isaac PetscFunctionBegin; 12678f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoToc_Internal(eventInfo, time, logMemory, event, PETSC_FALSE)); 12778f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 12878f1b9b4SToby Isaac } 12978f1b9b4SToby Isaac 13078f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoPause(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event) 13178f1b9b4SToby Isaac { 13278f1b9b4SToby Isaac PetscFunctionBegin; 1333e446a5eSToby Isaac PetscCall(PetscEventPerfInfoToc_Internal(eventInfo, time, logMemory, event, PETSC_TRUE)); 13478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 13578f1b9b4SToby Isaac } 13678f1b9b4SToby Isaac 13778f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoAdd_Internal(const PetscEventPerfInfo *eventInfo, PetscEventPerfInfo *outInfo) 13878f1b9b4SToby Isaac { 13978f1b9b4SToby Isaac PetscFunctionBegin; 14078f1b9b4SToby Isaac outInfo->count += eventInfo->count; 14178f1b9b4SToby Isaac outInfo->time += eventInfo->time; 14278f1b9b4SToby Isaac outInfo->time2 += eventInfo->time2; 14378f1b9b4SToby Isaac outInfo->flops += eventInfo->flops; 14478f1b9b4SToby Isaac outInfo->flops2 += eventInfo->flops2; 14578f1b9b4SToby Isaac outInfo->numMessages += eventInfo->numMessages; 14678f1b9b4SToby Isaac outInfo->messageLength += eventInfo->messageLength; 14778f1b9b4SToby Isaac outInfo->numReductions += eventInfo->numReductions; 14878f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 14978f1b9b4SToby Isaac outInfo->CpuToGpuCount += eventInfo->CpuToGpuCount; 15078f1b9b4SToby Isaac outInfo->GpuToCpuCount += eventInfo->GpuToCpuCount; 15178f1b9b4SToby Isaac outInfo->CpuToGpuSize += eventInfo->CpuToGpuSize; 15278f1b9b4SToby Isaac outInfo->GpuToCpuSize += eventInfo->GpuToCpuSize; 15378f1b9b4SToby Isaac outInfo->GpuFlops += eventInfo->GpuFlops; 15478f1b9b4SToby Isaac outInfo->GpuTime += eventInfo->GpuTime; 1555268dc8aSHong Zhang outInfo->GpuEnergy += eventInfo->GpuEnergy; 15678f1b9b4SToby Isaac #endif 15778f1b9b4SToby Isaac outInfo->memIncrease += eventInfo->memIncrease; 15878f1b9b4SToby Isaac outInfo->mallocSpace += eventInfo->mallocSpace; 15978f1b9b4SToby Isaac outInfo->mallocIncreaseEvent += eventInfo->mallocIncreaseEvent; 16078f1b9b4SToby Isaac outInfo->mallocIncrease += eventInfo->mallocIncrease; 16178f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 16278f1b9b4SToby Isaac } 16378f1b9b4SToby Isaac 16478f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(EventPerfArray, PetscEventPerfInfo, PetscLogEvent, PetscEventPerfInfoInit, NULL, NULL) 16578f1b9b4SToby Isaac 16678f1b9b4SToby Isaac /* --- PetscClassPerf --- */ 16778f1b9b4SToby Isaac 16878f1b9b4SToby Isaac typedef struct { 16978f1b9b4SToby Isaac int creations; /* The number of objects of this class created */ 17078f1b9b4SToby Isaac int destructions; /* The number of objects of this class destroyed */ 17178f1b9b4SToby Isaac PetscLogDouble mem; /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */ 17278f1b9b4SToby Isaac PetscLogDouble descMem; /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */ 17378f1b9b4SToby Isaac } PetscClassPerf; 17478f1b9b4SToby Isaac 17578f1b9b4SToby Isaac static PetscErrorCode PetscClassPerfInit(PetscClassPerf *classInfo) 17678f1b9b4SToby Isaac { 17778f1b9b4SToby Isaac PetscFunctionBegin; 17878f1b9b4SToby Isaac PetscCall(PetscMemzero(classInfo, sizeof(*classInfo))); 17978f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 18078f1b9b4SToby Isaac } 18178f1b9b4SToby Isaac 18278f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ClassPerfArray, PetscClassPerf, PetscLogClass, PetscClassPerfInit, NULL, NULL) 18378f1b9b4SToby Isaac 18478f1b9b4SToby Isaac /* --- PetscStagePerf --- */ 18578f1b9b4SToby Isaac 18678f1b9b4SToby Isaac typedef struct _PetscStagePerf { 18778f1b9b4SToby Isaac PetscBool used; /* The stage was pushed on this processor */ 18878f1b9b4SToby Isaac PetscEventPerfInfo perfInfo; /* The stage performance information */ 18978f1b9b4SToby Isaac PetscLogEventPerfArray eventLog; /* The event information for this stage */ 19078f1b9b4SToby Isaac PetscLogClassPerfArray classLog; /* The class information for this stage */ 19178f1b9b4SToby Isaac } PetscStagePerf; 19278f1b9b4SToby Isaac 19378f1b9b4SToby Isaac static PetscErrorCode PetscStageInfoInit(PetscStagePerf *stageInfo) 19478f1b9b4SToby Isaac { 19578f1b9b4SToby Isaac PetscFunctionBegin; 19678f1b9b4SToby Isaac PetscCall(PetscMemzero(stageInfo, sizeof(*stageInfo))); 197f4f49eeaSPierre Jolivet PetscCall(PetscLogEventPerfArrayCreate(128, &stageInfo->eventLog)); 198f4f49eeaSPierre Jolivet PetscCall(PetscLogClassPerfArrayCreate(128, &stageInfo->classLog)); 19978f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoInit(&stageInfo->perfInfo)); 20078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 20178f1b9b4SToby Isaac } 20278f1b9b4SToby Isaac 20378f1b9b4SToby Isaac static PetscErrorCode PetscStageInfoReset(PetscStagePerf *stageInfo) 20478f1b9b4SToby Isaac { 20578f1b9b4SToby Isaac PetscFunctionBegin; 206f4f49eeaSPierre Jolivet PetscCall(PetscLogEventPerfArrayDestroy(&stageInfo->eventLog)); 207f4f49eeaSPierre Jolivet PetscCall(PetscLogClassPerfArrayDestroy(&stageInfo->classLog)); 20878f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 20978f1b9b4SToby Isaac } 21078f1b9b4SToby Isaac 21178f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(StageInfoArray, PetscStagePerf, PetscLogStage, PetscStageInfoInit, PetscStageInfoReset, NULL) 21278f1b9b4SToby Isaac 21378f1b9b4SToby Isaac /* --- Action --- */ 21478f1b9b4SToby Isaac 21578f1b9b4SToby Isaac /* The structure for action logging */ 21678f1b9b4SToby Isaac typedef enum { 21778f1b9b4SToby Isaac PETSC_LOG_ACTION_CREATE, 21878f1b9b4SToby Isaac PETSC_LOG_ACTION_DESTROY, 21978f1b9b4SToby Isaac PETSC_LOG_ACTION_BEGIN, 22078f1b9b4SToby Isaac PETSC_LOG_ACTION_END, 22178f1b9b4SToby Isaac } PetscLogActionType; 22278f1b9b4SToby Isaac 223b665b14eSToby Isaac typedef struct _Action { 224b665b14eSToby Isaac PetscLogActionType action; /* The type of execution */ 225b665b14eSToby Isaac PetscLogEvent event; /* The event number */ 226b665b14eSToby Isaac PetscClassId classid; /* The event class id */ 227b665b14eSToby Isaac PetscLogDouble time; /* The time of occurrence */ 228b665b14eSToby Isaac PetscLogDouble flops; /* The cumulative flops */ 229b665b14eSToby Isaac PetscLogDouble mem; /* The current memory usage */ 230b665b14eSToby Isaac PetscLogDouble maxmem; /* The maximum memory usage */ 2316497c311SBarry Smith PetscObjectId id1, id2, id3; /* The ids of associated objects */ 232b665b14eSToby Isaac } Action; 233b665b14eSToby Isaac 23478f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ActionArray, Action, PetscLogEvent, NULL, NULL, NULL) 23578f1b9b4SToby Isaac 23678f1b9b4SToby Isaac /* --- Object --- */ 23778f1b9b4SToby Isaac 238b665b14eSToby Isaac /* The structure for object logging */ 239b665b14eSToby Isaac typedef struct _Object { 240b665b14eSToby Isaac PetscObject obj; /* The associated PetscObject */ 241b665b14eSToby Isaac int parent; /* The parent id */ 242b665b14eSToby Isaac PetscLogDouble mem; /* The memory associated with the object */ 243b665b14eSToby Isaac char name[64]; /* The object name */ 244b665b14eSToby Isaac char info[64]; /* The information string */ 245b665b14eSToby Isaac } Object; 246b665b14eSToby Isaac 24778f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ObjectArray, Object, PetscObject, NULL, NULL, NULL) 24878f1b9b4SToby Isaac 24978f1b9b4SToby Isaac /* Map from (threadid,stage,event) to perfInfo data struct */ 25078f1b9b4SToby Isaac #include <petsc/private/hashmapijk.h> 25178f1b9b4SToby Isaac 25278f1b9b4SToby Isaac PETSC_HASH_MAP(HMapEvent, PetscHashIJKKey, PetscEventPerfInfo *, PetscHashIJKKeyHash, PetscHashIJKKeyEqual, NULL) 25378f1b9b4SToby Isaac 25478f1b9b4SToby Isaac typedef struct _n_PetscLogHandler_Default *PetscLogHandler_Default; 25578f1b9b4SToby Isaac struct _n_PetscLogHandler_Default { 25678f1b9b4SToby Isaac PetscLogStageInfoArray stages; 25778f1b9b4SToby Isaac PetscSpinlock lock; 25878f1b9b4SToby Isaac PetscLogActionArray petsc_actions; 25978f1b9b4SToby Isaac PetscLogObjectArray petsc_objects; 26078f1b9b4SToby Isaac PetscBool petsc_logActions; 26178f1b9b4SToby Isaac PetscBool petsc_logObjects; 26278f1b9b4SToby Isaac int petsc_numObjectsCreated; 26378f1b9b4SToby Isaac int petsc_numObjectsDestroyed; 26478f1b9b4SToby Isaac PetscHMapEvent eventInfoMap_th; 26578f1b9b4SToby Isaac int pause_depth; 266461318ebSToby Isaac PetscBool use_threadsafe; 26778f1b9b4SToby Isaac }; 26878f1b9b4SToby Isaac 26978f1b9b4SToby Isaac /* --- PetscLogHandler_Default --- */ 27078f1b9b4SToby Isaac 27178f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerContextCreate_Default(PetscLogHandler_Default *def_p) 27278f1b9b4SToby Isaac { 27378f1b9b4SToby Isaac PetscLogHandler_Default def; 27478f1b9b4SToby Isaac 27578f1b9b4SToby Isaac PetscFunctionBegin; 27678f1b9b4SToby Isaac PetscCall(PetscNew(def_p)); 27778f1b9b4SToby Isaac def = *def_p; 278f4f49eeaSPierre Jolivet PetscCall(PetscLogStageInfoArrayCreate(8, &def->stages)); 279f4f49eeaSPierre Jolivet PetscCall(PetscLogActionArrayCreate(64, &def->petsc_actions)); 280f4f49eeaSPierre Jolivet PetscCall(PetscLogObjectArrayCreate(64, &def->petsc_objects)); 2813bbd2b04SJunchao Zhang PetscCall(PetscSpinlockCreate(&def->lock)); 28278f1b9b4SToby Isaac 28378f1b9b4SToby Isaac PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_include_actions", &def->petsc_logActions, NULL)); 28478f1b9b4SToby Isaac PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_include_objects", &def->petsc_logObjects, NULL)); 285461318ebSToby Isaac PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_handler_default_use_threadsafe_events", &def->use_threadsafe, NULL)); 2863a7d0413SPierre Jolivet if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) PetscCall(PetscHMapEventCreate(&def->eventInfoMap_th)); 28778f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 28878f1b9b4SToby Isaac } 28978f1b9b4SToby Isaac 29078f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDestroy_Default(PetscLogHandler h) 29178f1b9b4SToby Isaac { 29278f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 29378f1b9b4SToby Isaac 29478f1b9b4SToby Isaac PetscFunctionBegin; 29578f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayDestroy(&def->stages)); 29678f1b9b4SToby Isaac PetscCall(PetscLogActionArrayDestroy(&def->petsc_actions)); 29778f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayDestroy(&def->petsc_objects)); 2983bbd2b04SJunchao Zhang PetscCall(PetscSpinlockDestroy(&def->lock)); 29978f1b9b4SToby Isaac if (def->eventInfoMap_th) { 30078f1b9b4SToby Isaac PetscEventPerfInfo **array; 30178f1b9b4SToby Isaac PetscInt n, off = 0; 30278f1b9b4SToby Isaac 30378f1b9b4SToby Isaac PetscCall(PetscHMapEventGetSize(def->eventInfoMap_th, &n)); 30478f1b9b4SToby Isaac PetscCall(PetscMalloc1(n, &array)); 30578f1b9b4SToby Isaac PetscCall(PetscHMapEventGetVals(def->eventInfoMap_th, &off, array)); 30678f1b9b4SToby Isaac for (PetscInt i = 0; i < n; i++) PetscCall(PetscFree(array[i])); 30778f1b9b4SToby Isaac PetscCall(PetscFree(array)); 30878f1b9b4SToby Isaac PetscCall(PetscHMapEventDestroy(&def->eventInfoMap_th)); 30978f1b9b4SToby Isaac } 310dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetEventPerfInfo_C", NULL)); 3118b08f494SToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetStagePerfInfo_C", NULL)); 312dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerSetLogActions_C", NULL)); 313dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerSetLogObjects_C", NULL)); 314dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerLogObjectState_C", NULL)); 315dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetNumObjects_C", NULL)); 316dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventDeactivatePush_C", NULL)); 317dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventDeactivatePop_C", NULL)); 318dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventsPause_C", NULL)); 319dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventsResume_C", NULL)); 320dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerDump_C", NULL)); 321dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerStageSetVisible_C", NULL)); 322dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerStageGetVisible_C", NULL)); 32378f1b9b4SToby Isaac PetscCall(PetscFree(def)); 32478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 32578f1b9b4SToby Isaac } 32678f1b9b4SToby Isaac 32778f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDefaultGetStageInfo(PetscLogHandler handler, PetscLogStage stage, PetscStagePerf **stage_info_p) 32878f1b9b4SToby Isaac { 32978f1b9b4SToby Isaac PetscStagePerf *stage_info = NULL; 33078f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 33178f1b9b4SToby Isaac 33278f1b9b4SToby Isaac PetscFunctionBegin; 33378f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayResize(def->stages, stage + 1)); 33478f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info)); 33578f1b9b4SToby Isaac *stage_info_p = stage_info; 33678f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 33778f1b9b4SToby Isaac } 33878f1b9b4SToby Isaac 339dff009beSToby Isaac static PetscErrorCode PetscLogHandlerGetEventPerfInfo_Default(PetscLogHandler handler, PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo **event_info_p) 34078f1b9b4SToby Isaac { 34178f1b9b4SToby Isaac PetscEventPerfInfo *event_info = NULL; 34278f1b9b4SToby Isaac PetscStagePerf *stage_info = NULL; 34378f1b9b4SToby Isaac PetscLogEventPerfArray event_log; 34478f1b9b4SToby Isaac 34578f1b9b4SToby Isaac PetscFunctionBegin; 34678f1b9b4SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(handler->state, &stage)); 34778f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info)); 34878f1b9b4SToby Isaac event_log = stage_info->eventLog; 34978f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayResize(event_log, event + 1)); 35078f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayGetRef(event_log, event, &event_info)); 35178f1b9b4SToby Isaac event_info->id = event; 35278f1b9b4SToby Isaac *event_info_p = event_info; 35378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 35478f1b9b4SToby Isaac } 35578f1b9b4SToby Isaac 3568b08f494SToby Isaac static PetscErrorCode PetscLogHandlerGetStagePerfInfo_Default(PetscLogHandler handler, PetscLogStage stage, PetscEventPerfInfo **stage_info_p) 3578b08f494SToby Isaac { 3588b08f494SToby Isaac PetscStagePerf *stage_perf_info = NULL; 3598b08f494SToby Isaac 3608b08f494SToby Isaac PetscFunctionBegin; 3618b08f494SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(handler->state, &stage)); 3628b08f494SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_perf_info)); 3638b08f494SToby Isaac *stage_info_p = &stage_perf_info->perfInfo; 3648b08f494SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 3658b08f494SToby Isaac } 3668b08f494SToby Isaac 36778f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDefaultGetClassPerf(PetscLogHandler handler, PetscLogStage stage, PetscLogClass clss, PetscClassPerf **class_info) 36878f1b9b4SToby Isaac { 36978f1b9b4SToby Isaac PetscLogClassPerfArray class_log; 37078f1b9b4SToby Isaac PetscStagePerf *stage_info; 37178f1b9b4SToby Isaac 37278f1b9b4SToby Isaac PetscFunctionBegin; 37378f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info)); 37478f1b9b4SToby Isaac class_log = stage_info->classLog; 37578f1b9b4SToby Isaac PetscCall(PetscLogClassPerfArrayResize(class_log, clss + 1)); 37678f1b9b4SToby Isaac PetscCall(PetscLogClassPerfArrayGetRef(class_log, clss, class_info)); 37778f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 37878f1b9b4SToby Isaac } 37978f1b9b4SToby Isaac 380*31a765c4SPierre Jolivet PETSC_PRAGMA_DIAGNOSTIC_IGNORED_BEGIN("-Wconversion") 38178f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerObjectCreate_Default(PetscLogHandler h, PetscObject obj) 38278f1b9b4SToby Isaac { 38378f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 38478f1b9b4SToby Isaac PetscLogState state; 38578f1b9b4SToby Isaac PetscLogStage stage; 38678f1b9b4SToby Isaac PetscClassPerf *classInfo; 38778f1b9b4SToby Isaac int oclass = 0; 38878f1b9b4SToby Isaac 38978f1b9b4SToby Isaac PetscFunctionBegin; 39078f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 39178f1b9b4SToby Isaac PetscCall(PetscSpinlockLock(&def->lock)); 39278f1b9b4SToby Isaac /* Record stage info */ 39378f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 39478f1b9b4SToby Isaac PetscCall(PetscLogStateGetClassFromClassId(state, obj->classid, &oclass)); 39578f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetClassPerf(h, stage, oclass, &classInfo)); 39678f1b9b4SToby Isaac classInfo->creations++; 39778f1b9b4SToby Isaac /* Record the creation action */ 39878f1b9b4SToby Isaac if (def->petsc_logActions) { 39978f1b9b4SToby Isaac Action new_action; 40078f1b9b4SToby Isaac 40178f1b9b4SToby Isaac PetscCall(PetscTime(&new_action.time)); 40278f1b9b4SToby Isaac new_action.time -= petsc_BaseTime; 40378f1b9b4SToby Isaac new_action.action = PETSC_LOG_ACTION_CREATE; 40478f1b9b4SToby Isaac new_action.event = -1; 40578f1b9b4SToby Isaac new_action.classid = obj->classid; 40678f1b9b4SToby Isaac new_action.id1 = obj->id; 40778f1b9b4SToby Isaac new_action.id2 = -1; 40878f1b9b4SToby Isaac new_action.id3 = -1; 40978f1b9b4SToby Isaac new_action.flops = petsc_TotalFlops; 41078f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&new_action.mem)); 41178f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem)); 41278f1b9b4SToby Isaac PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action)); 41378f1b9b4SToby Isaac } 41478f1b9b4SToby Isaac /* We don't just use obj->id to count all objects that are created 41578f1b9b4SToby Isaac because PetscLogHandlers are objects and PetscLogObjectDestroy() will not 41678f1b9b4SToby Isaac be called for them: the number of objects created and destroyed as counted 41778f1b9b4SToby Isaac here and below would have an imbalance */ 41878f1b9b4SToby Isaac def->petsc_numObjectsCreated++; 41978f1b9b4SToby Isaac /* Record the object */ 42078f1b9b4SToby Isaac if (def->petsc_logObjects) { 42178f1b9b4SToby Isaac Object new_object; 4226497c311SBarry Smith PetscInt objid; 42378f1b9b4SToby Isaac 42478f1b9b4SToby Isaac new_object.parent = -1; 42578f1b9b4SToby Isaac new_object.obj = obj; 42678f1b9b4SToby Isaac new_object.mem = 0; 42778f1b9b4SToby Isaac 42878f1b9b4SToby Isaac PetscCall(PetscMemzero(new_object.name, sizeof(new_object.name))); 42978f1b9b4SToby Isaac PetscCall(PetscMemzero(new_object.info, sizeof(new_object.info))); 43078f1b9b4SToby Isaac PetscAssert(obj->id >= 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Object ids from PetscObjectNewId_Internal() start at 1"); 4316497c311SBarry Smith PetscCall(PetscIntCast(obj->id, &objid)); 4326497c311SBarry Smith PetscCall(PetscLogObjectArrayResize(def->petsc_objects, objid)); 4336497c311SBarry Smith PetscCall(PetscLogObjectArraySet(def->petsc_objects, objid - 1, new_object)); 43478f1b9b4SToby Isaac } 43578f1b9b4SToby Isaac PetscCall(PetscSpinlockUnlock(&def->lock)); 43678f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 43778f1b9b4SToby Isaac } 43878f1b9b4SToby Isaac 43978f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerObjectDestroy_Default(PetscLogHandler h, PetscObject obj) 44078f1b9b4SToby Isaac { 44178f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 44278f1b9b4SToby Isaac PetscLogState state; 44378f1b9b4SToby Isaac PetscLogStage stage; 44478f1b9b4SToby Isaac PetscClassPerf *classInfo; 44578f1b9b4SToby Isaac int oclass = 0; 44678f1b9b4SToby Isaac 44778f1b9b4SToby Isaac PetscFunctionBegin; 44878f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 44978f1b9b4SToby Isaac /* Record stage info */ 45078f1b9b4SToby Isaac PetscCall(PetscSpinlockLock(&def->lock)); 45178f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 45278f1b9b4SToby Isaac if (stage >= 0) { 45378f1b9b4SToby Isaac /* stage < 0 can happen if the log summary is output before some things are destroyed */ 45478f1b9b4SToby Isaac PetscCall(PetscLogStateGetClassFromClassId(state, obj->classid, &oclass)); 45578f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetClassPerf(h, stage, oclass, &classInfo)); 45678f1b9b4SToby Isaac classInfo->destructions++; 45778f1b9b4SToby Isaac } 45878f1b9b4SToby Isaac /* Cannot Credit all ancestors with your memory because they may have already been destroyed*/ 45978f1b9b4SToby Isaac def->petsc_numObjectsDestroyed++; 46078f1b9b4SToby Isaac /* Dynamically enlarge logging structures */ 46178f1b9b4SToby Isaac /* Record the destruction action */ 46278f1b9b4SToby Isaac if (def->petsc_logActions) { 46378f1b9b4SToby Isaac Action new_action; 46478f1b9b4SToby Isaac 46578f1b9b4SToby Isaac PetscCall(PetscTime(&new_action.time)); 46678f1b9b4SToby Isaac new_action.time -= petsc_BaseTime; 46778f1b9b4SToby Isaac new_action.event = -1; 46878f1b9b4SToby Isaac new_action.action = PETSC_LOG_ACTION_DESTROY; 46978f1b9b4SToby Isaac new_action.classid = obj->classid; 47078f1b9b4SToby Isaac new_action.id1 = obj->id; 47178f1b9b4SToby Isaac new_action.id2 = -1; 47278f1b9b4SToby Isaac new_action.id3 = -1; 47378f1b9b4SToby Isaac new_action.flops = petsc_TotalFlops; 47478f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&new_action.mem)); 47578f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem)); 47678f1b9b4SToby Isaac PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action)); 47778f1b9b4SToby Isaac } 47878f1b9b4SToby Isaac if (def->petsc_logObjects) { 47978f1b9b4SToby Isaac Object *obj_entry = NULL; 4806497c311SBarry Smith PetscInt objid; 48178f1b9b4SToby Isaac 48278f1b9b4SToby Isaac PetscAssert(obj->id >= 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Object ids from PetscObjectNewId_Internal() start at 1"); 4836497c311SBarry Smith PetscCall(PetscIntCast(obj->id - 1, &objid)); 4846497c311SBarry Smith PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, objid, &obj_entry)); 48578f1b9b4SToby Isaac if (obj->name) PetscCall(PetscStrncpy(obj_entry->name, obj->name, 64)); 48678f1b9b4SToby Isaac obj_entry->obj = NULL; 48778f1b9b4SToby Isaac } 48878f1b9b4SToby Isaac PetscCall(PetscSpinlockUnlock(&def->lock)); 48978f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 49078f1b9b4SToby Isaac } 49178f1b9b4SToby Isaac 49278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventSync_Default(PetscLogHandler h, PetscLogEvent event, MPI_Comm comm) 49378f1b9b4SToby Isaac { 49478f1b9b4SToby Isaac PetscLogState state; 49578f1b9b4SToby Isaac PetscLogEventInfo event_info; 49678f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info; 49778f1b9b4SToby Isaac int stage; 49878f1b9b4SToby Isaac PetscLogDouble time = 0.0; 49978f1b9b4SToby Isaac 50078f1b9b4SToby Isaac PetscFunctionBegin; 5015aefd447SStefano Zampini if (!PetscLogSyncOn || comm == MPI_COMM_NULL) PetscFunctionReturn(PETSC_SUCCESS); 50278f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 50378f1b9b4SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 50478f1b9b4SToby Isaac if (!event_info.collective) PetscFunctionReturn(PETSC_SUCCESS); 50578f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 506dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info)); 50778f1b9b4SToby Isaac if (event_perf_info->depth > 0) PetscFunctionReturn(PETSC_SUCCESS); 50878f1b9b4SToby Isaac 50978f1b9b4SToby Isaac PetscCall(PetscTimeSubtract(&time)); 51078f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 51178f1b9b4SToby Isaac PetscCall(PetscTimeAdd(&time)); 51278f1b9b4SToby Isaac event_perf_info->syncTime += time; 51378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 51478f1b9b4SToby Isaac } 51578f1b9b4SToby Isaac 51678f1b9b4SToby Isaac static PetscErrorCode PetscLogGetStageEventPerfInfo_threaded(PetscLogHandler_Default def, PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo **eventInfo) 51778f1b9b4SToby Isaac { 51878f1b9b4SToby Isaac PetscEventPerfInfo *leventInfo = NULL; 51978f1b9b4SToby Isaac PetscHashIJKKey key; 52078f1b9b4SToby Isaac 52178f1b9b4SToby Isaac PetscFunctionBegin; 52278f1b9b4SToby Isaac #if PetscDefined(HAVE_THREADSAFETY) 52378f1b9b4SToby Isaac key.i = PetscLogGetTid(); 52478f1b9b4SToby Isaac #else 52578f1b9b4SToby Isaac key.i = 0; 52678f1b9b4SToby Isaac #endif 52778f1b9b4SToby Isaac key.j = stage; 52878f1b9b4SToby Isaac key.k = event; 52978f1b9b4SToby Isaac PetscCall(PetscSpinlockLock(&def->lock)); 53078f1b9b4SToby Isaac PetscCall(PetscHMapEventGet(def->eventInfoMap_th, key, &leventInfo)); 53178f1b9b4SToby Isaac if (!leventInfo) { 53278f1b9b4SToby Isaac PetscCall(PetscNew(&leventInfo)); 53378f1b9b4SToby Isaac leventInfo->id = event; 53478f1b9b4SToby Isaac PetscCall(PetscHMapEventSet(def->eventInfoMap_th, key, leventInfo)); 53578f1b9b4SToby Isaac } 53678f1b9b4SToby Isaac PetscCall(PetscSpinlockUnlock(&def->lock)); 53778f1b9b4SToby Isaac *eventInfo = leventInfo; 53878f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 53978f1b9b4SToby Isaac } 54078f1b9b4SToby Isaac 54178f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_Default(PetscLogHandler h, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 54278f1b9b4SToby Isaac { 54378f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 54478f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info = NULL; 54578f1b9b4SToby Isaac PetscLogEventInfo event_info; 54678f1b9b4SToby Isaac PetscLogDouble time; 54778f1b9b4SToby Isaac PetscLogState state; 54878f1b9b4SToby Isaac PetscLogStage stage; 54978f1b9b4SToby Isaac 55078f1b9b4SToby Isaac PetscFunctionBegin; 55178f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 5525aefd447SStefano Zampini if (PetscDefined(USE_DEBUG)) { 5535aefd447SStefano Zampini PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 5545aefd447SStefano Zampini if (PetscUnlikely(o1)) PetscValidHeader(o1, 3); 5555aefd447SStefano Zampini if (PetscUnlikely(o2)) PetscValidHeader(o2, 4); 5565aefd447SStefano Zampini if (PetscUnlikely(o3)) PetscValidHeader(o3, 5); 5575aefd447SStefano Zampini if (PetscUnlikely(o4)) PetscValidHeader(o4, 6); 5585aefd447SStefano Zampini if (event_info.collective && o1) { 5595aefd447SStefano Zampini PetscInt64 b1[2], b2[2]; 5605aefd447SStefano Zampini 5615aefd447SStefano Zampini b1[0] = -o1->cidx; 5625aefd447SStefano Zampini b1[1] = o1->cidx; 563462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(b1, b2, 2, MPIU_INT64, MPI_MAX, PetscObjectComm(o1))); 5649649dde3SJunchao Zhang PetscCheck(-b2[0] == b2[1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Collective event %s not called collectively %" PetscInt64_FMT " != %" PetscInt64_FMT, event_info.name, -b2[0], b2[1]); 5655aefd447SStefano Zampini } 5665aefd447SStefano Zampini } 56778f1b9b4SToby Isaac /* Synchronization */ 56878f1b9b4SToby Isaac PetscCall(PetscLogHandlerEventSync_Default(h, event, PetscObjectComm(o1))); 56978f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 57078f1b9b4SToby Isaac if (def->pause_depth > 0) stage = 0; // in pause-mode, all events run on the main stage 571461318ebSToby Isaac if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) { 57278f1b9b4SToby Isaac PetscCall(PetscLogGetStageEventPerfInfo_threaded(def, stage, event, &event_perf_info)); 5733a7d0413SPierre Jolivet if (event_perf_info->depth == 0) PetscCall(PetscEventPerfInfoInit(event_perf_info)); 57478f1b9b4SToby Isaac } else { 575dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info)); 57678f1b9b4SToby Isaac } 57778f1b9b4SToby Isaac PetscCheck(event_perf_info->depth >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to begin a paused event, this is not allowed"); 57878f1b9b4SToby Isaac event_perf_info->depth++; 57978f1b9b4SToby Isaac /* Check for double counting */ 58078f1b9b4SToby Isaac if (event_perf_info->depth > 1) PetscFunctionReturn(PETSC_SUCCESS); 58178f1b9b4SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 58278f1b9b4SToby Isaac /* Log the performance info */ 58378f1b9b4SToby Isaac event_perf_info->count++; 58478f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 585835f2295SStefano Zampini PetscCall(PetscEventPerfInfoTic(event_perf_info, time, PetscLogMemory, event)); 58678f1b9b4SToby Isaac if (def->petsc_logActions) { 58778f1b9b4SToby Isaac PetscLogDouble curTime; 58878f1b9b4SToby Isaac Action new_action; 58978f1b9b4SToby Isaac 59078f1b9b4SToby Isaac PetscCall(PetscTime(&curTime)); 59178f1b9b4SToby Isaac new_action.time = curTime - petsc_BaseTime; 59278f1b9b4SToby Isaac new_action.action = PETSC_LOG_ACTION_BEGIN; 59378f1b9b4SToby Isaac new_action.event = event; 59478f1b9b4SToby Isaac new_action.classid = event_info.classid; 59578f1b9b4SToby Isaac new_action.id1 = o1 ? o1->id : -1; 59678f1b9b4SToby Isaac new_action.id2 = o2 ? o2->id : -1; 59778f1b9b4SToby Isaac new_action.id3 = o3 ? o3->id : -1; 59878f1b9b4SToby Isaac new_action.flops = petsc_TotalFlops; 59978f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&new_action.mem)); 60078f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem)); 60178f1b9b4SToby Isaac PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action)); 60278f1b9b4SToby Isaac } 60378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 60478f1b9b4SToby Isaac } 60578f1b9b4SToby Isaac 60678f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_Default(PetscLogHandler h, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 60778f1b9b4SToby Isaac { 60878f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 60978f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info = NULL; 61078f1b9b4SToby Isaac PetscLogDouble time; 61178f1b9b4SToby Isaac PetscLogState state; 61278f1b9b4SToby Isaac int stage; 6135aefd447SStefano Zampini PetscLogEventInfo event_info; 61478f1b9b4SToby Isaac 61578f1b9b4SToby Isaac PetscFunctionBegin; 61678f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 6175aefd447SStefano Zampini if (PetscDefined(USE_DEBUG)) { 6185aefd447SStefano Zampini PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 6195aefd447SStefano Zampini if (PetscUnlikely(o1)) PetscValidHeader(o1, 3); 6205aefd447SStefano Zampini if (PetscUnlikely(o2)) PetscValidHeader(o2, 4); 6215aefd447SStefano Zampini if (PetscUnlikely(o3)) PetscValidHeader(o3, 5); 6225aefd447SStefano Zampini if (PetscUnlikely(o4)) PetscValidHeader(o4, 6); 6235aefd447SStefano Zampini if (event_info.collective && o1) { 6245aefd447SStefano Zampini PetscInt64 b1[2], b2[2]; 6255aefd447SStefano Zampini 6265aefd447SStefano Zampini b1[0] = -o1->cidx; 6275aefd447SStefano Zampini b1[1] = o1->cidx; 628462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(b1, b2, 2, MPIU_INT64, MPI_MAX, PetscObjectComm(o1))); 6299649dde3SJunchao Zhang PetscCheck(-b2[0] == b2[1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Collective event %s not called collectively %" PetscInt64_FMT " != %" PetscInt64_FMT, event_info.name, -b2[0], b2[1]); 6305aefd447SStefano Zampini } 6315aefd447SStefano Zampini } 63278f1b9b4SToby Isaac if (def->petsc_logActions) { 63378f1b9b4SToby Isaac PetscLogDouble curTime; 63478f1b9b4SToby Isaac Action new_action; 63578f1b9b4SToby Isaac 63678f1b9b4SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 63778f1b9b4SToby Isaac PetscCall(PetscTime(&curTime)); 63878f1b9b4SToby Isaac new_action.time = curTime - petsc_BaseTime; 63978f1b9b4SToby Isaac new_action.action = PETSC_LOG_ACTION_END; 64078f1b9b4SToby Isaac new_action.event = event; 64178f1b9b4SToby Isaac new_action.classid = event_info.classid; 64278f1b9b4SToby Isaac new_action.id1 = o1 ? o1->id : -1; 64378f1b9b4SToby Isaac new_action.id2 = o2 ? o2->id : -2; 64478f1b9b4SToby Isaac new_action.id3 = o3 ? o3->id : -3; 64578f1b9b4SToby Isaac new_action.flops = petsc_TotalFlops; 64678f1b9b4SToby Isaac PetscCall(PetscMallocGetCurrentUsage(&new_action.mem)); 64778f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem)); 64878f1b9b4SToby Isaac PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action)); 64978f1b9b4SToby Isaac } 65078f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 65178f1b9b4SToby Isaac if (def->pause_depth > 0) stage = 0; // all events run on the main stage in pause-mode 652461318ebSToby Isaac if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) { 65378f1b9b4SToby Isaac PetscCall(PetscLogGetStageEventPerfInfo_threaded(def, stage, event, &event_perf_info)); 65478f1b9b4SToby Isaac } else { 655dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info)); 65678f1b9b4SToby Isaac } 65778f1b9b4SToby Isaac PetscCheck(event_perf_info->depth > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to end paused event, not allowed"); 65878f1b9b4SToby Isaac event_perf_info->depth--; 65978f1b9b4SToby Isaac /* Check for double counting */ 66078f1b9b4SToby Isaac if (event_perf_info->depth > 0) PetscFunctionReturn(PETSC_SUCCESS); 66178f1b9b4SToby Isaac else PetscCheck(event_perf_info->depth == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Logging event had unbalanced begin/end pairs"); 66278f1b9b4SToby Isaac 66378f1b9b4SToby Isaac /* Log performance info */ 66478f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 665835f2295SStefano Zampini PetscCall(PetscEventPerfInfoToc(event_perf_info, time, PetscLogMemory, event)); 666461318ebSToby Isaac if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) { 66778f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info_global; 66878f1b9b4SToby Isaac PetscCall(PetscSpinlockLock(&def->lock)); 669dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info_global)); 67078f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoAdd_Internal(event_perf_info, event_perf_info_global)); 67178f1b9b4SToby Isaac PetscCall(PetscSpinlockUnlock(&def->lock)); 67278f1b9b4SToby Isaac } 67378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 67478f1b9b4SToby Isaac } 67578f1b9b4SToby Isaac 676dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventDeactivatePush_Default(PetscLogHandler h, PetscLogStage stage, PetscLogEvent event) 67778f1b9b4SToby Isaac { 67878f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info; 67978f1b9b4SToby Isaac 68078f1b9b4SToby Isaac PetscFunctionBegin; 68178f1b9b4SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage)); 682dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info)); 68378f1b9b4SToby Isaac event_perf_info->depth++; 68478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 68578f1b9b4SToby Isaac } 68678f1b9b4SToby Isaac 687dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventDeactivatePop_Default(PetscLogHandler h, PetscLogStage stage, PetscLogEvent event) 68878f1b9b4SToby Isaac { 68978f1b9b4SToby Isaac PetscEventPerfInfo *event_perf_info; 69078f1b9b4SToby Isaac 69178f1b9b4SToby Isaac PetscFunctionBegin; 69278f1b9b4SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage)); 693dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info)); 69478f1b9b4SToby Isaac event_perf_info->depth--; 69578f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 69678f1b9b4SToby Isaac } 69778f1b9b4SToby Isaac 698dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventsPause_Default(PetscLogHandler h) 69978f1b9b4SToby Isaac { 70078f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 70178f1b9b4SToby Isaac PetscLogDouble time; 70278f1b9b4SToby Isaac PetscInt num_stages; 70378f1b9b4SToby Isaac 70478f1b9b4SToby Isaac PetscFunctionBegin; 70578f1b9b4SToby Isaac if (def->pause_depth++ > 0) PetscFunctionReturn(PETSC_SUCCESS); 70678f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayGetSize(def->stages, &num_stages, NULL)); 70778f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 708b83e8237SZach Atkins /* Pause stages in reverse of the order they were pushed */ 709b83e8237SZach Atkins for (PetscInt stage = num_stages - 1; stage >= 0; stage--) { 71078f1b9b4SToby Isaac PetscStagePerf *stage_info = NULL; 71178f1b9b4SToby Isaac PetscInt num_events; 71278f1b9b4SToby Isaac 71378f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info)); 71478f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayGetSize(stage_info->eventLog, &num_events, NULL)); 715b83e8237SZach Atkins /* Pause events in reverse of the order they were pushed */ 716b83e8237SZach Atkins for (PetscInt event = num_events - 1; event >= 0; event--) { 71778f1b9b4SToby Isaac PetscEventPerfInfo *event_info = NULL; 71878f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayGetRef(stage_info->eventLog, event, &event_info)); 71978f1b9b4SToby Isaac if (event_info->depth > 0) { 72078f1b9b4SToby Isaac event_info->depth *= -1; 72178f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoPause(event_info, time, PetscLogMemory, event)); 72278f1b9b4SToby Isaac } 72378f1b9b4SToby Isaac } 72478f1b9b4SToby Isaac if (stage > 0 && stage_info->perfInfo.depth > 0) { 72578f1b9b4SToby Isaac stage_info->perfInfo.depth *= -1; 72678f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoPause(&stage_info->perfInfo, time, PetscLogMemory, -(stage + 2))); 72778f1b9b4SToby Isaac } 72878f1b9b4SToby Isaac } 72978f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 73078f1b9b4SToby Isaac } 73178f1b9b4SToby Isaac 732dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventsResume_Default(PetscLogHandler h) 73378f1b9b4SToby Isaac { 73478f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 73578f1b9b4SToby Isaac PetscLogDouble time; 73678f1b9b4SToby Isaac PetscInt num_stages; 73778f1b9b4SToby Isaac 73878f1b9b4SToby Isaac PetscFunctionBegin; 73978f1b9b4SToby Isaac if (--def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS); 74078f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayGetSize(def->stages, &num_stages, NULL)); 74178f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 742b83e8237SZach Atkins /* Unpause stages in the same order they were pushed */ 74378f1b9b4SToby Isaac for (PetscInt stage = 0; stage < num_stages; stage++) { 74478f1b9b4SToby Isaac PetscStagePerf *stage_info = NULL; 74578f1b9b4SToby Isaac PetscInt num_events; 74678f1b9b4SToby Isaac 74778f1b9b4SToby Isaac PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info)); 74878f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayGetSize(stage_info->eventLog, &num_events, NULL)); 749b83e8237SZach Atkins /* Unpause events in the same order they were pushed */ 75078f1b9b4SToby Isaac for (PetscInt event = 0; event < num_events; event++) { 75178f1b9b4SToby Isaac PetscEventPerfInfo *event_info = NULL; 75278f1b9b4SToby Isaac PetscCall(PetscLogEventPerfArrayGetRef(stage_info->eventLog, event, &event_info)); 75378f1b9b4SToby Isaac if (event_info->depth < 0) { 75478f1b9b4SToby Isaac event_info->depth *= -1; 75578f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoResume(event_info, time, PetscLogMemory, event)); 75678f1b9b4SToby Isaac } 75778f1b9b4SToby Isaac } 75878f1b9b4SToby Isaac if (stage > 0 && stage_info->perfInfo.depth < 0) { 75978f1b9b4SToby Isaac stage_info->perfInfo.depth *= -1; 76078f1b9b4SToby Isaac PetscCall(PetscEventPerfInfoResume(&stage_info->perfInfo, time, PetscLogMemory, -(stage + 2))); 76178f1b9b4SToby Isaac } 76278f1b9b4SToby Isaac } 76378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 76478f1b9b4SToby Isaac } 76578f1b9b4SToby Isaac 76678f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerStagePush_Default(PetscLogHandler h, PetscLogStage new_stage) 76778f1b9b4SToby Isaac { 76878f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 76978f1b9b4SToby Isaac PetscLogDouble time; 77078f1b9b4SToby Isaac PetscLogState state; 77178f1b9b4SToby Isaac PetscLogStage current_stage; 77278f1b9b4SToby Isaac PetscStagePerf *new_stage_info; 77378f1b9b4SToby Isaac 77478f1b9b4SToby Isaac PetscFunctionBegin; 77578f1b9b4SToby Isaac if (def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS); 77678f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 77778f1b9b4SToby Isaac current_stage = state->current_stage; 77878f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, new_stage, &new_stage_info)); 77978f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 78078f1b9b4SToby Isaac 78178f1b9b4SToby Isaac /* Record flops/time of previous stage */ 78278f1b9b4SToby Isaac if (current_stage >= 0) { 78378f1b9b4SToby Isaac if (PetscBTLookup(state->active, current_stage)) { 78478f1b9b4SToby Isaac PetscStagePerf *current_stage_info; 78578f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, current_stage, ¤t_stage_info)); 786835f2295SStefano Zampini PetscCall(PetscEventPerfInfoToc(¤t_stage_info->perfInfo, time, PetscLogMemory, -(current_stage + 2))); 78778f1b9b4SToby Isaac } 78878f1b9b4SToby Isaac } 78978f1b9b4SToby Isaac new_stage_info->used = PETSC_TRUE; 79078f1b9b4SToby Isaac new_stage_info->perfInfo.count++; 79178f1b9b4SToby Isaac new_stage_info->perfInfo.depth++; 79278f1b9b4SToby Isaac /* Subtract current quantities so that we obtain the difference when we pop */ 793835f2295SStefano Zampini if (PetscBTLookup(state->active, new_stage)) PetscCall(PetscEventPerfInfoTic(&new_stage_info->perfInfo, time, PetscLogMemory, -(new_stage + 2))); 79478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 79578f1b9b4SToby Isaac } 79678f1b9b4SToby Isaac 79778f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerStagePop_Default(PetscLogHandler h, PetscLogStage old_stage) 79878f1b9b4SToby Isaac { 79978f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)h->data; 80078f1b9b4SToby Isaac PetscLogStage current_stage; 80178f1b9b4SToby Isaac PetscStagePerf *old_stage_info; 80278f1b9b4SToby Isaac PetscLogState state; 80378f1b9b4SToby Isaac PetscLogDouble time; 80478f1b9b4SToby Isaac 80578f1b9b4SToby Isaac PetscFunctionBegin; 80678f1b9b4SToby Isaac if (def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS); 80778f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 80878f1b9b4SToby Isaac current_stage = state->current_stage; 80978f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, old_stage, &old_stage_info)); 81078f1b9b4SToby Isaac PetscCall(PetscTime(&time)); 81178f1b9b4SToby Isaac old_stage_info->perfInfo.depth--; 8123a7d0413SPierre Jolivet if (PetscBTLookup(state->active, old_stage)) PetscCall(PetscEventPerfInfoToc(&old_stage_info->perfInfo, time, PetscLogMemory, -(old_stage + 2))); 81378f1b9b4SToby Isaac if (current_stage >= 0) { 81478f1b9b4SToby Isaac if (PetscBTLookup(state->active, current_stage)) { 81578f1b9b4SToby Isaac PetscStagePerf *current_stage_info; 81678f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, current_stage, ¤t_stage_info)); 817835f2295SStefano Zampini PetscCall(PetscEventPerfInfoTic(¤t_stage_info->perfInfo, time, PetscLogMemory, -(current_stage + 2))); 81878f1b9b4SToby Isaac } 81978f1b9b4SToby Isaac } 82078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 82178f1b9b4SToby Isaac } 82278f1b9b4SToby Isaac 823dff009beSToby Isaac static PetscErrorCode PetscLogHandlerStageSetVisible_Default(PetscLogHandler h, PetscLogStage stage, PetscBool is_visible) 82478f1b9b4SToby Isaac { 82578f1b9b4SToby Isaac PetscStagePerf *stage_info; 82678f1b9b4SToby Isaac 82778f1b9b4SToby Isaac PetscFunctionBegin; 82878f1b9b4SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage)); 82978f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, stage, &stage_info)); 83078f1b9b4SToby Isaac stage_info->perfInfo.visible = is_visible; 83178f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 83278f1b9b4SToby Isaac } 83378f1b9b4SToby Isaac 834dff009beSToby Isaac static PetscErrorCode PetscLogHandlerStageGetVisible_Default(PetscLogHandler h, PetscLogStage stage, PetscBool *is_visible) 83578f1b9b4SToby Isaac { 83678f1b9b4SToby Isaac PetscStagePerf *stage_info; 83778f1b9b4SToby Isaac 83878f1b9b4SToby Isaac PetscFunctionBegin; 83978f1b9b4SToby Isaac if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage)); 84078f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(h, stage, &stage_info)); 84178f1b9b4SToby Isaac *is_visible = stage_info->perfInfo.visible; 84278f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 84378f1b9b4SToby Isaac } 84478f1b9b4SToby Isaac 845dff009beSToby Isaac static PetscErrorCode PetscLogHandlerSetLogActions_Default(PetscLogHandler handler, PetscBool flag) 84678f1b9b4SToby Isaac { 84778f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 84878f1b9b4SToby Isaac 84978f1b9b4SToby Isaac PetscFunctionBegin; 85078f1b9b4SToby Isaac def->petsc_logActions = flag; 85178f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 85278f1b9b4SToby Isaac } 85378f1b9b4SToby Isaac 854dff009beSToby Isaac static PetscErrorCode PetscLogHandlerSetLogObjects_Default(PetscLogHandler handler, PetscBool flag) 85578f1b9b4SToby Isaac { 85678f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 85778f1b9b4SToby Isaac 85878f1b9b4SToby Isaac PetscFunctionBegin; 85978f1b9b4SToby Isaac def->petsc_logObjects = flag; 86078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 86178f1b9b4SToby Isaac } 86278f1b9b4SToby Isaac 863dff009beSToby Isaac static PetscErrorCode PetscLogHandlerLogObjectState_Default(PetscLogHandler handler, PetscObject obj, const char format[], va_list Argp) 86478f1b9b4SToby Isaac { 86578f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 86678f1b9b4SToby Isaac size_t fullLength; 86778f1b9b4SToby Isaac 86878f1b9b4SToby Isaac PetscFunctionBegin; 86978f1b9b4SToby Isaac if (def->petsc_logObjects) { 87078f1b9b4SToby Isaac Object *obj_entry = NULL; 8716497c311SBarry Smith PetscInt objid; 87278f1b9b4SToby Isaac 8736497c311SBarry Smith PetscCall(PetscIntCast(obj->id - 1, &objid)); 8746497c311SBarry Smith PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, objid, &obj_entry)); 87578f1b9b4SToby Isaac PetscCall(PetscVSNPrintf(obj_entry->info, 64, format, &fullLength, Argp)); 87678f1b9b4SToby Isaac } 87778f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 87878f1b9b4SToby Isaac } 87978f1b9b4SToby Isaac 880dff009beSToby Isaac static PetscErrorCode PetscLogHandlerGetNumObjects_Default(PetscLogHandler handler, PetscInt *num_objects) 88178f1b9b4SToby Isaac { 88278f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 88378f1b9b4SToby Isaac 88478f1b9b4SToby Isaac PetscFunctionBegin; 88578f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, num_objects, NULL)); 88678f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 88778f1b9b4SToby Isaac } 88878f1b9b4SToby Isaac 889dff009beSToby Isaac static PetscErrorCode PetscLogHandlerDump_Default(PetscLogHandler handler, const char sname[]) 89078f1b9b4SToby Isaac { 89178f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 89278f1b9b4SToby Isaac FILE *fd; 89378f1b9b4SToby Isaac char file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN]; 89478f1b9b4SToby Isaac PetscLogDouble flops, _TotalTime; 89578f1b9b4SToby Isaac PetscMPIInt rank; 89678f1b9b4SToby Isaac int curStage; 89778f1b9b4SToby Isaac PetscLogState state; 89878f1b9b4SToby Isaac PetscInt num_events; 89978f1b9b4SToby Isaac PetscLogEvent event; 90078f1b9b4SToby Isaac 90178f1b9b4SToby Isaac PetscFunctionBegin; 90278f1b9b4SToby Isaac /* Calculate the total elapsed time */ 90378f1b9b4SToby Isaac PetscCall(PetscTime(&_TotalTime)); 90478f1b9b4SToby Isaac _TotalTime -= petsc_BaseTime; 90578f1b9b4SToby Isaac /* Open log file */ 90678f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)handler), &rank)); 90778f1b9b4SToby Isaac PetscCall(PetscSNPrintf(file, PETSC_STATIC_ARRAY_LENGTH(file), "%s.%d", sname && sname[0] ? sname : "Log", rank)); 90878f1b9b4SToby Isaac PetscCall(PetscFixFilename(file, fname)); 90978f1b9b4SToby Isaac PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, "w", &fd)); 91078f1b9b4SToby Isaac PetscCheck(!(rank == 0) || !(!fd), PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname); 91178f1b9b4SToby Isaac /* Output totals */ 91278f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Total Flop %14e %16.8e\n", petsc_TotalFlops, _TotalTime)); 91378f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Clock Resolution %g\n", 0.0)); 91478f1b9b4SToby Isaac /* Output actions */ 91578f1b9b4SToby Isaac if (def->petsc_logActions) { 91678f1b9b4SToby Isaac PetscInt num_actions; 91778f1b9b4SToby Isaac PetscCall(PetscLogActionArrayGetSize(def->petsc_actions, &num_actions, NULL)); 918835f2295SStefano Zampini PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Actions accomplished %" PetscInt_FMT "\n", num_actions)); 91978f1b9b4SToby Isaac for (int a = 0; a < num_actions; a++) { 92078f1b9b4SToby Isaac Action *action; 92178f1b9b4SToby Isaac 92278f1b9b4SToby Isaac PetscCall(PetscLogActionArrayGetRef(def->petsc_actions, a, &action)); 923835f2295SStefano Zampini PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "%g %d %d %d %" PetscInt64_FMT " %" PetscInt64_FMT " %" PetscInt64_FMT " %g %g %g\n", action->time, action->action, action->event, action->classid, action->id1, action->id2, action->id3, action->flops, 924835f2295SStefano Zampini action->mem, action->maxmem)); 92578f1b9b4SToby Isaac } 92678f1b9b4SToby Isaac } 92778f1b9b4SToby Isaac /* Output objects */ 92878f1b9b4SToby Isaac if (def->petsc_logObjects) { 92978f1b9b4SToby Isaac PetscInt num_objects; 93078f1b9b4SToby Isaac 93178f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL)); 93278f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Objects created %d destroyed %d\n", def->petsc_numObjectsCreated, def->petsc_numObjectsDestroyed)); 93378f1b9b4SToby Isaac for (int o = 0; o < num_objects; o++) { 93478f1b9b4SToby Isaac Object *object = NULL; 93578f1b9b4SToby Isaac 93678f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, o, &object)); 93778f1b9b4SToby Isaac if (object->parent != -1) continue; // object with this id wasn't logged, probably a PetscLogHandler 93878f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Parent ID: %d Memory: %d\n", object->parent, (int)object->mem)); 93978f1b9b4SToby Isaac if (!object->name[0]) { 94078f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "No Name\n")); 94178f1b9b4SToby Isaac } else { 94278f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Name: %s\n", object->name)); 94378f1b9b4SToby Isaac } 94478f1b9b4SToby Isaac if (!object->info[0]) { 94578f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "No Info\n")); 94678f1b9b4SToby Isaac } else { 94778f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Info: %s\n", object->info)); 94878f1b9b4SToby Isaac } 94978f1b9b4SToby Isaac } 95078f1b9b4SToby Isaac } 95178f1b9b4SToby Isaac /* Output events */ 95278f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Event log:\n")); 95378f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 95478f1b9b4SToby Isaac PetscCall(PetscLogStateGetNumEvents(state, &num_events)); 95578f1b9b4SToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &curStage)); 95678f1b9b4SToby Isaac for (event = 0; event < num_events; event++) { 95778f1b9b4SToby Isaac PetscEventPerfInfo *event_info; 95878f1b9b4SToby Isaac 959dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, curStage, event, &event_info)); 96078f1b9b4SToby Isaac if (event_info->time != 0.0) flops = event_info->flops / event_info->time; 96178f1b9b4SToby Isaac else flops = 0.0; 96278f1b9b4SToby Isaac PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "%d %16d %16g %16g %16g\n", event, event_info->count, event_info->flops, event_info->time, flops)); 96378f1b9b4SToby Isaac } 96478f1b9b4SToby Isaac PetscCall(PetscFClose(PETSC_COMM_SELF, fd)); 96578f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 96678f1b9b4SToby Isaac } 96778f1b9b4SToby Isaac 96878f1b9b4SToby Isaac /* 96978f1b9b4SToby Isaac PetscLogView_Detailed - Each process prints the times for its own events 97078f1b9b4SToby Isaac 97178f1b9b4SToby Isaac */ 97278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_Detailed(PetscLogHandler handler, PetscViewer viewer) 97378f1b9b4SToby Isaac { 97478f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 97578f1b9b4SToby Isaac PetscLogDouble locTotalTime, numRed, maxMem; 97678f1b9b4SToby Isaac PetscInt numStages, numEvents; 97778f1b9b4SToby Isaac MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 97878f1b9b4SToby Isaac PetscMPIInt rank, size; 97978f1b9b4SToby Isaac PetscLogGlobalNames global_stages, global_events; 98078f1b9b4SToby Isaac PetscLogState state; 98178f1b9b4SToby Isaac PetscEventPerfInfo zero_info; 98278f1b9b4SToby Isaac 98378f1b9b4SToby Isaac PetscFunctionBegin; 98478f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 98578f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_size(comm, &size)); 98678f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_rank(comm, &rank)); 98778f1b9b4SToby Isaac /* Must preserve reduction count before we go on */ 98878f1b9b4SToby Isaac numRed = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; 98978f1b9b4SToby Isaac /* Get the total elapsed time */ 99078f1b9b4SToby Isaac PetscCall(PetscTime(&locTotalTime)); 99178f1b9b4SToby Isaac locTotalTime -= petsc_BaseTime; 99278f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "size = %d\n", size)); 99378f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalTimes = {}\n")); 99478f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMessages = {}\n")); 99578f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMessageLens = {}\n")); 99678f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalReductions = {}\n")); 99778f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalFlop = {}\n")); 99878f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalObjects = {}\n")); 99978f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMemory = {}\n")); 100078f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages)); 100178f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events)); 100278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages)); 100378f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents)); 100478f1b9b4SToby Isaac PetscCall(PetscMemzero(&zero_info, sizeof(zero_info))); 100578f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "Stages = {}\n")); 100678f1b9b4SToby Isaac for (PetscInt stage = 0; stage < numStages; stage++) { 100778f1b9b4SToby Isaac PetscInt stage_id; 100878f1b9b4SToby Isaac const char *stage_name; 100978f1b9b4SToby Isaac 101078f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 101178f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 101278f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"] = {}\n", stage_name)); 101378f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"][\"summary\"] = {}\n", stage_name)); 101478f1b9b4SToby Isaac for (PetscInt event = 0; event < numEvents; event++) { 101578f1b9b4SToby Isaac PetscEventPerfInfo *eventInfo = &zero_info; 101678f1b9b4SToby Isaac PetscBool is_zero = PETSC_FALSE; 101778f1b9b4SToby Isaac PetscInt event_id; 101878f1b9b4SToby Isaac const char *event_name; 101978f1b9b4SToby Isaac 102078f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id)); 102178f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name)); 1022dff009beSToby Isaac if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo)); 102378f1b9b4SToby Isaac is_zero = eventInfo->count == 0 ? PETSC_TRUE : PETSC_FALSE; 10245440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPI_C_BOOL, MPI_LAND, comm)); 10253a7d0413SPierre Jolivet if (!is_zero) PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"][\"%s\"] = {}\n", stage_name, event_name)); 102678f1b9b4SToby Isaac } 102778f1b9b4SToby Isaac } 102878f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&maxMem)); 102978f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 103078f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalTimes[%d] = %g\n", rank, locTotalTime)); 103157508eceSPierre Jolivet PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMessages[%d] = %g\n", rank, petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct)); 103257508eceSPierre Jolivet PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMessageLens[%d] = %g\n", rank, petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len)); 103378f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalReductions[%d] = %g\n", rank, numRed)); 103478f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalFlop[%d] = %g\n", rank, petsc_TotalFlops)); 103578f1b9b4SToby Isaac { 103678f1b9b4SToby Isaac PetscInt num_objects; 103778f1b9b4SToby Isaac 103878f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL)); 1039835f2295SStefano Zampini PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalObjects[%d] = %" PetscInt_FMT "\n", rank, num_objects)); 104078f1b9b4SToby Isaac } 104178f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMemory[%d] = %g\n", rank, maxMem)); 104278f1b9b4SToby Isaac PetscCall(PetscViewerFlush(viewer)); 104378f1b9b4SToby Isaac for (PetscInt stage = 0; stage < numStages; stage++) { 104478f1b9b4SToby Isaac PetscEventPerfInfo *stage_perf_info = &zero_info; 104578f1b9b4SToby Isaac PetscInt stage_id; 104678f1b9b4SToby Isaac const char *stage_name; 104778f1b9b4SToby Isaac 104878f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 104978f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 105078f1b9b4SToby Isaac if (stage_id >= 0) { 105178f1b9b4SToby Isaac PetscStagePerf *stage_info; 105278f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_info)); 105378f1b9b4SToby Isaac stage_perf_info = &stage_info->perfInfo; 105478f1b9b4SToby Isaac } 105578f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "Stages[\"%s\"][\"summary\"][%d] = {\"time\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flop\" : %g}\n", stage_name, rank, stage_perf_info->time, 105678f1b9b4SToby Isaac stage_perf_info->numMessages, stage_perf_info->messageLength, stage_perf_info->numReductions, stage_perf_info->flops)); 105778f1b9b4SToby Isaac for (PetscInt event = 0; event < numEvents; event++) { 105878f1b9b4SToby Isaac PetscEventPerfInfo *eventInfo = &zero_info; 105978f1b9b4SToby Isaac PetscBool is_zero = PETSC_FALSE; 106078f1b9b4SToby Isaac PetscInt event_id; 106178f1b9b4SToby Isaac const char *event_name; 106278f1b9b4SToby Isaac 106378f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id)); 106478f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name)); 1065dff009beSToby Isaac if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo)); 106678f1b9b4SToby Isaac is_zero = eventInfo->count == 0 ? PETSC_TRUE : PETSC_FALSE; 1067418fb43bSPierre Jolivet PetscCall(PetscArraycmp(eventInfo, &zero_info, 1, &is_zero)); 10685440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPI_C_BOOL, MPI_LAND, comm)); 106978f1b9b4SToby Isaac if (!is_zero) { 107078f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "Stages[\"%s\"][\"%s\"][%d] = {\"count\" : %d, \"time\" : %g, \"syncTime\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flop\" : %g", stage_name, event_name, rank, 107178f1b9b4SToby Isaac eventInfo->count, eventInfo->time, eventInfo->syncTime, eventInfo->numMessages, eventInfo->messageLength, eventInfo->numReductions, eventInfo->flops)); 107278f1b9b4SToby Isaac if (eventInfo->dof[0] >= 0.) { 107378f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", \"dof\" : [")); 107478f1b9b4SToby Isaac for (PetscInt d = 0; d < 8; ++d) { 107578f1b9b4SToby Isaac if (d > 0) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", ")); 107678f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%g", eventInfo->dof[d])); 107778f1b9b4SToby Isaac } 107878f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "]")); 107978f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", \"error\" : [")); 108078f1b9b4SToby Isaac for (PetscInt e = 0; e < 8; ++e) { 108178f1b9b4SToby Isaac if (e > 0) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", ")); 108278f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%g", eventInfo->errors[e])); 108378f1b9b4SToby Isaac } 108478f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "]")); 108578f1b9b4SToby Isaac } 108678f1b9b4SToby Isaac } 108778f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "}\n")); 108878f1b9b4SToby Isaac } 108978f1b9b4SToby Isaac } 109078f1b9b4SToby Isaac PetscCall(PetscViewerFlush(viewer)); 109178f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 109278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_events)); 109378f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_stages)); 109478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 109578f1b9b4SToby Isaac } 109678f1b9b4SToby Isaac 109778f1b9b4SToby Isaac /* 109878f1b9b4SToby Isaac PetscLogView_CSV - Each process prints the times for its own events in Comma-Separated Value Format 109978f1b9b4SToby Isaac */ 110078f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_CSV(PetscLogHandler handler, PetscViewer viewer) 110178f1b9b4SToby Isaac { 110278f1b9b4SToby Isaac PetscLogDouble locTotalTime, maxMem; 110378f1b9b4SToby Isaac PetscInt numStages, numEvents, stage, event; 110478f1b9b4SToby Isaac MPI_Comm comm = PetscObjectComm((PetscObject)viewer); 110578f1b9b4SToby Isaac PetscMPIInt rank, size; 110678f1b9b4SToby Isaac PetscLogGlobalNames global_stages, global_events; 110778f1b9b4SToby Isaac PetscLogState state; 110878f1b9b4SToby Isaac PetscEventPerfInfo zero_info; 110978f1b9b4SToby Isaac 111078f1b9b4SToby Isaac PetscFunctionBegin; 111178f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 111278f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_size(comm, &size)); 111378f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_rank(comm, &rank)); 111478f1b9b4SToby Isaac /* Must preserve reduction count before we go on */ 111578f1b9b4SToby Isaac /* Get the total elapsed time */ 111678f1b9b4SToby Isaac PetscCall(PetscTime(&locTotalTime)); 111778f1b9b4SToby Isaac locTotalTime -= petsc_BaseTime; 111878f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&maxMem)); 111978f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages)); 112078f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events)); 112178f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages)); 112278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents)); 112378f1b9b4SToby Isaac PetscCall(PetscMemzero(&zero_info, sizeof(zero_info))); 112478f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 112578f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPrintf(viewer, "Stage Name,Event Name,Rank,Count,Time,Num Messages,Message Length,Num Reductions,FLOP,dof0,dof1,dof2,dof3,dof4,dof5,dof6,dof7,e0,e1,e2,e3,e4,e5,e6,e7,%d\n", size)); 112678f1b9b4SToby Isaac PetscCall(PetscViewerFlush(viewer)); 112778f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 112878f1b9b4SToby Isaac PetscEventPerfInfo *stage_perf_info; 112978f1b9b4SToby Isaac PetscInt stage_id; 113078f1b9b4SToby Isaac const char *stage_name; 113178f1b9b4SToby Isaac 113278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 113378f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 113478f1b9b4SToby Isaac stage_perf_info = &zero_info; 113578f1b9b4SToby Isaac if (stage_id >= 0) { 113678f1b9b4SToby Isaac PetscStagePerf *stage_info; 113778f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_info)); 113878f1b9b4SToby Isaac stage_perf_info = &stage_info->perfInfo; 113978f1b9b4SToby Isaac } 114078f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%s,summary,%d,1,%g,%g,%g,%g,%g\n", stage_name, rank, stage_perf_info->time, stage_perf_info->numMessages, stage_perf_info->messageLength, stage_perf_info->numReductions, stage_perf_info->flops)); 114178f1b9b4SToby Isaac for (event = 0; event < numEvents; event++) { 114278f1b9b4SToby Isaac PetscEventPerfInfo *eventInfo = &zero_info; 114378f1b9b4SToby Isaac PetscBool is_zero = PETSC_FALSE; 114478f1b9b4SToby Isaac PetscInt event_id; 114578f1b9b4SToby Isaac const char *event_name; 114678f1b9b4SToby Isaac 114778f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id)); 114878f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name)); 1149dff009beSToby Isaac if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo)); 1150418fb43bSPierre Jolivet PetscCall(PetscArraycmp(eventInfo, &zero_info, 1, &is_zero)); 11515440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPI_C_BOOL, MPI_LAND, comm)); 115278f1b9b4SToby Isaac if (!is_zero) { 115378f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%s,%s,%d,%d,%g,%g,%g,%g,%g", stage_name, event_name, rank, eventInfo->count, eventInfo->time, eventInfo->numMessages, eventInfo->messageLength, eventInfo->numReductions, eventInfo->flops)); 115478f1b9b4SToby Isaac if (eventInfo->dof[0] >= 0.) { 115578f1b9b4SToby Isaac for (PetscInt d = 0; d < 8; ++d) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ",%g", eventInfo->dof[d])); 115678f1b9b4SToby Isaac for (PetscInt e = 0; e < 8; ++e) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ",%g", eventInfo->errors[e])); 115778f1b9b4SToby Isaac } 115878f1b9b4SToby Isaac } 115978f1b9b4SToby Isaac PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n")); 116078f1b9b4SToby Isaac } 116178f1b9b4SToby Isaac } 116278f1b9b4SToby Isaac PetscCall(PetscViewerFlush(viewer)); 116378f1b9b4SToby Isaac PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 116478f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_stages)); 116578f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_events)); 116678f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 116778f1b9b4SToby Isaac } 116878f1b9b4SToby Isaac 11691d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnSync(PetscViewer viewer) 117078f1b9b4SToby Isaac { 117178f1b9b4SToby Isaac PetscFunctionBegin; 117278f1b9b4SToby Isaac if (!PetscLogSyncOn) PetscFunctionReturn(PETSC_SUCCESS); 11731d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n")); 11741d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n")); 11751d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 11761d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # WARNING!!! #\n")); 11771d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 11781d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This program was run with logging synchronization. #\n")); 11791d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This option provides more meaningful imbalance #\n")); 11801d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # figures at the expense of slowing things down and #\n")); 11811d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # providing a distorted view of the overall runtime. #\n")); 11821d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 11831d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n\n\n")); 118478f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 118578f1b9b4SToby Isaac } 118678f1b9b4SToby Isaac 11871d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnDebugging(PetscViewer viewer) 118878f1b9b4SToby Isaac { 118978f1b9b4SToby Isaac PetscFunctionBegin; 119078f1b9b4SToby Isaac if (PetscDefined(USE_DEBUG)) { 11911d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n")); 11921d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n")); 11931d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 11941d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # WARNING!!! #\n")); 11951d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 11961d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This code was compiled with a debugging option. #\n")); 11971d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # To get timing results run ./configure #\n")); 11981d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # using --with-debugging=no, the performance will #\n")); 11991d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # be generally two or three times faster. #\n")); 12001d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12011d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n\n\n")); 120278f1b9b4SToby Isaac } 120378f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 120478f1b9b4SToby Isaac } 120578f1b9b4SToby Isaac 12061d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnNoGpuAwareMpi(PetscViewer viewer) 120778f1b9b4SToby Isaac { 120878f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 120978f1b9b4SToby Isaac PetscMPIInt size; 121078f1b9b4SToby Isaac PetscBool deviceInitialized = PETSC_FALSE; 121178f1b9b4SToby Isaac 121278f1b9b4SToby Isaac PetscFunctionBegin; 1213c621c6acSBarry Smith PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)viewer), &size)); 121478f1b9b4SToby Isaac for (int i = PETSC_DEVICE_HOST + 1; i < PETSC_DEVICE_MAX; ++i) { 121578f1b9b4SToby Isaac const PetscDeviceType dtype = PetscDeviceTypeCast(i); 121678f1b9b4SToby Isaac if (PetscDeviceInitialized(dtype)) { /* a non-host device was initialized */ 121778f1b9b4SToby Isaac deviceInitialized = PETSC_TRUE; 121878f1b9b4SToby Isaac break; 121978f1b9b4SToby Isaac } 122078f1b9b4SToby Isaac } 1221f0b74427SPierre Jolivet /* the last condition says PETSc is configured with device but it is a pure CPU run, so don't print misleading warnings */ 122278f1b9b4SToby Isaac if (use_gpu_aware_mpi || size == 1 || !deviceInitialized) PetscFunctionReturn(PETSC_SUCCESS); 12231d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n")); 12241d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n")); 12251d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12261d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # WARNING!!! #\n")); 12271d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12281d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This code was compiled with GPU support and you've #\n")); 12291d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # created PETSc/GPU objects, but you intentionally #\n")); 12301d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # used -use_gpu_aware_mpi 0, requiring PETSc to copy #\n")); 12311d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # additional data between the GPU and CPU. To obtain #\n")); 12321d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # meaningful timing results on multi-rank runs, use #\n")); 12331d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # GPU-aware MPI instead. #\n")); 12341d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12351d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n\n\n")); 123678f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 123778f1b9b4SToby Isaac #else 123878f1b9b4SToby Isaac return PETSC_SUCCESS; 123978f1b9b4SToby Isaac #endif 124078f1b9b4SToby Isaac } 124178f1b9b4SToby Isaac 12421d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnGpuTime(PetscViewer viewer) 124378f1b9b4SToby Isaac { 12447d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU) 124578f1b9b4SToby Isaac 124678f1b9b4SToby Isaac PetscFunctionBegin; 124778f1b9b4SToby Isaac if (!PetscLogGpuTimeFlag || petsc_gflops == 0) PetscFunctionReturn(PETSC_SUCCESS); 12481d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n")); 12491d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n")); 12501d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12511d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # WARNING!!! #\n")); 12521d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12531d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This code was run with -log_view_gpu_time #\n")); 12541d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # This provides accurate timing within the GPU kernels #\n")); 12551d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # but can slow down the entire computation by a #\n")); 12561d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # measurable amount. For fastest runs we recommend #\n")); 12571d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # not using this option. #\n")); 12581d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " # #\n")); 12591d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " ##########################################################\n\n\n")); 126078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 126178f1b9b4SToby Isaac #else 126278f1b9b4SToby Isaac return PETSC_SUCCESS; 126378f1b9b4SToby Isaac #endif 126478f1b9b4SToby Isaac } 126578f1b9b4SToby Isaac 1266a0449d98SPierre Jolivet PETSC_INTERN int PetscGlobalArgc; 1267a0449d98SPierre Jolivet PETSC_INTERN char **PetscGlobalArgs; 1268a0449d98SPierre Jolivet 126978f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_Info(PetscLogHandler handler, PetscViewer viewer) 127078f1b9b4SToby Isaac { 127178f1b9b4SToby Isaac PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data; 127278f1b9b4SToby Isaac char arch[128], hostname[128], username[128], pname[PETSC_MAX_PATH_LEN], date[128]; 127378f1b9b4SToby Isaac PetscLogDouble locTotalTime, TotalTime, TotalFlops; 127478f1b9b4SToby Isaac PetscLogDouble numMessages, messageLength, avgMessLen, numReductions; 127578f1b9b4SToby Isaac PetscLogDouble stageTime, flops, flopr, mem, mess, messLen, red; 127678f1b9b4SToby Isaac PetscLogDouble fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed; 127778f1b9b4SToby Isaac PetscLogDouble fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed; 127878f1b9b4SToby Isaac PetscLogDouble min, max, tot, ratio, avg, x, y; 127978f1b9b4SToby Isaac PetscLogDouble minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratC, totm, totml, totr, mal, malmax, emalmax; 128078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 128178f1b9b4SToby Isaac PetscLogEvent KSP_Solve, SNES_Solve, TS_Step, TAO_Solve; /* These need to be fixed to be some events registered with certain objects */ 12825268dc8aSHong Zhang PetscLogDouble cct, gct, csz, gsz, gmaxt, gflops, gflopr, fracgflops, gjoules, geff; 128378f1b9b4SToby Isaac #endif 128478f1b9b4SToby Isaac PetscMPIInt minC, maxC; 128578f1b9b4SToby Isaac PetscMPIInt size, rank; 128678f1b9b4SToby Isaac PetscBool *localStageUsed, *stageUsed; 128778f1b9b4SToby Isaac PetscBool *localStageVisible, *stageVisible; 128878f1b9b4SToby Isaac PetscInt numStages, numEvents; 128978f1b9b4SToby Isaac int stage, oclass; 129078f1b9b4SToby Isaac PetscLogEvent event; 129178f1b9b4SToby Isaac char version[256]; 129278f1b9b4SToby Isaac MPI_Comm comm; 12937d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU) 129478f1b9b4SToby Isaac PetscInt64 nas = 0x7FF0000000000002; 129578f1b9b4SToby Isaac #endif 129678f1b9b4SToby Isaac PetscLogGlobalNames global_stages, global_events; 129778f1b9b4SToby Isaac PetscEventPerfInfo zero_info; 129878f1b9b4SToby Isaac PetscLogState state; 129978f1b9b4SToby Isaac 130078f1b9b4SToby Isaac PetscFunctionBegin; 130178f1b9b4SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 130278f1b9b4SToby Isaac PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); 130378f1b9b4SToby Isaac PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 130478f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_size(comm, &size)); 130578f1b9b4SToby Isaac PetscCallMPI(MPI_Comm_rank(comm, &rank)); 130678f1b9b4SToby Isaac /* Get the total elapsed time */ 130778f1b9b4SToby Isaac PetscCall(PetscTime(&locTotalTime)); 130878f1b9b4SToby Isaac locTotalTime -= petsc_BaseTime; 130978f1b9b4SToby Isaac 13101d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "****************************************************************************************************************************************************************\n")); 13111d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "*** WIDEN YOUR WINDOW TO 160 CHARACTERS. Use 'enscript -r -fCourier9' to print this document ***\n")); 13121d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "****************************************************************************************************************************************************************\n")); 13131d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n------------------------------------------------------------------ PETSc Performance Summary: ------------------------------------------------------------------\n\n")); 13141d031f67SBarry Smith PetscCall(PetscLogViewWarnSync(viewer)); 13151d031f67SBarry Smith PetscCall(PetscLogViewWarnDebugging(viewer)); 13161d031f67SBarry Smith PetscCall(PetscLogViewWarnNoGpuAwareMpi(viewer)); 13171d031f67SBarry Smith PetscCall(PetscLogViewWarnGpuTime(viewer)); 131878f1b9b4SToby Isaac PetscCall(PetscGetArchType(arch, sizeof(arch))); 131978f1b9b4SToby Isaac PetscCall(PetscGetHostName(hostname, sizeof(hostname))); 132078f1b9b4SToby Isaac PetscCall(PetscGetUserName(username, sizeof(username))); 132178f1b9b4SToby Isaac PetscCall(PetscGetProgramName(pname, sizeof(pname))); 132278f1b9b4SToby Isaac PetscCall(PetscGetDate(date, sizeof(date))); 132378f1b9b4SToby Isaac PetscCall(PetscGetVersion(version, sizeof(version))); 1324456dbbcdSJunchao Zhang 1325456dbbcdSJunchao Zhang #if defined(PETSC_HAVE_CUPM) 1326456dbbcdSJunchao Zhang const char *cupm = PetscDefined(HAVE_CUDA) ? "CUDA" : "HIP"; 13275c78b439SPierre Jolivet if (PetscDeviceCUPMRuntimeArch) 13285c78b439SPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, "%s on a %s named %s with %d process%s and %s architecture %d, by %s on %s\n", pname, arch, hostname, size, size > 1 ? "es" : "", cupm, PetscDeviceCUPMRuntimeArch, username, date)); 1329456dbbcdSJunchao Zhang else 1330456dbbcdSJunchao Zhang #endif 13315c78b439SPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, "%s on a %s named %s with %d process%s, by %s on %s\n", pname, arch, hostname, size, size > 1 ? "es" : "", username, date)); 1332456dbbcdSJunchao Zhang 133378f1b9b4SToby Isaac #if defined(PETSC_HAVE_OPENMP) 13341d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Using %" PetscInt_FMT " OpenMP threads\n", PetscNumOMPThreads)); 133578f1b9b4SToby Isaac #endif 13361d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Using %s\n", version)); 133778f1b9b4SToby Isaac 133878f1b9b4SToby Isaac /* Must preserve reduction count before we go on */ 133978f1b9b4SToby Isaac red = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; 134078f1b9b4SToby Isaac 134178f1b9b4SToby Isaac /* Calculate summary information */ 13421d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n Max Max/Min Avg Total\n")); 134378f1b9b4SToby Isaac /* Time */ 1344462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1345462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1346462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 134778f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 134878f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 134978f1b9b4SToby Isaac else ratio = 0.0; 13501d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Time (sec): %5.3e %7.3f %5.3e\n", max, ratio, avg)); 135178f1b9b4SToby Isaac TotalTime = tot; 135278f1b9b4SToby Isaac /* Objects */ 135378f1b9b4SToby Isaac { 135478f1b9b4SToby Isaac PetscInt num_objects; 135578f1b9b4SToby Isaac 135678f1b9b4SToby Isaac PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL)); 135778f1b9b4SToby Isaac avg = (PetscLogDouble)num_objects; 135878f1b9b4SToby Isaac } 1359462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&avg, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1360462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&avg, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1361462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&avg, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 136278f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 136378f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 136478f1b9b4SToby Isaac else ratio = 0.0; 13651d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Objects: %5.3e %7.3f %5.3e\n", max, ratio, avg)); 136678f1b9b4SToby Isaac /* Flops */ 1367462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&petsc_TotalFlops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1368462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&petsc_TotalFlops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1369462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&petsc_TotalFlops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 137078f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 137178f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 137278f1b9b4SToby Isaac else ratio = 0.0; 13731d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Flops: %5.3e %7.3f %5.3e %5.3e\n", max, ratio, avg, tot)); 137478f1b9b4SToby Isaac TotalFlops = tot; 137578f1b9b4SToby Isaac /* Flops/sec -- Must talk to Barry here */ 137678f1b9b4SToby Isaac if (locTotalTime != 0.0) flops = petsc_TotalFlops / locTotalTime; 137778f1b9b4SToby Isaac else flops = 0.0; 1378462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&flops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1379462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&flops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1380462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&flops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 138178f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 138278f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 138378f1b9b4SToby Isaac else ratio = 0.0; 13841d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Flops/sec: %5.3e %7.3f %5.3e %5.3e\n", max, ratio, avg, tot)); 138578f1b9b4SToby Isaac /* Memory */ 138678f1b9b4SToby Isaac PetscCall(PetscMallocGetMaximumUsage(&mem)); 138778f1b9b4SToby Isaac if (mem > 0.0) { 1388462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mem, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1389462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mem, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1390462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mem, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 139178f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 139278f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 139378f1b9b4SToby Isaac else ratio = 0.0; 13941d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Memory (bytes): %5.3e %7.3f %5.3e %5.3e\n", max, ratio, avg, tot)); 139578f1b9b4SToby Isaac } 139678f1b9b4SToby Isaac /* Messages */ 139778f1b9b4SToby Isaac mess = 0.5 * (petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct); 1398462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1399462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1400462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 140178f1b9b4SToby Isaac avg = tot / ((PetscLogDouble)size); 140278f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 140378f1b9b4SToby Isaac else ratio = 0.0; 14041d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "MPI Msg Count: %5.3e %7.3f %5.3e %5.3e\n", max, ratio, avg, tot)); 140578f1b9b4SToby Isaac numMessages = tot; 140678f1b9b4SToby Isaac /* Message Lengths */ 140778f1b9b4SToby Isaac mess = 0.5 * (petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len); 1408462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1409462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1410462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 141178f1b9b4SToby Isaac if (numMessages != 0) avg = tot / numMessages; 141278f1b9b4SToby Isaac else avg = 0.0; 141378f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 141478f1b9b4SToby Isaac else ratio = 0.0; 14151d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "MPI Msg Len (bytes): %5.3e %7.3f %5.3e %5.3e\n", max, ratio, avg, tot)); 141678f1b9b4SToby Isaac messageLength = tot; 141778f1b9b4SToby Isaac /* Reductions */ 1418462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&red, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1419462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&red, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1420462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&red, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 142178f1b9b4SToby Isaac if (min != 0.0) ratio = max / min; 142278f1b9b4SToby Isaac else ratio = 0.0; 14231d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "MPI Reductions: %5.3e %7.3f\n", max, ratio)); 142478f1b9b4SToby Isaac numReductions = red; /* wrong because uses count from process zero */ 14251d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n")); 14261d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " e.g., VecAXPY() for real vectors of length N --> 2N flops\n")); 14271d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " and VecAXPY() for complex vectors of length N --> 8N flops\n")); 142878f1b9b4SToby Isaac 142978f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages)); 143078f1b9b4SToby Isaac PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events)); 143178f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages)); 143278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents)); 143378f1b9b4SToby Isaac PetscCall(PetscMemzero(&zero_info, sizeof(zero_info))); 143478f1b9b4SToby Isaac PetscCall(PetscMalloc1(numStages, &localStageUsed)); 143578f1b9b4SToby Isaac PetscCall(PetscMalloc1(numStages, &stageUsed)); 143678f1b9b4SToby Isaac PetscCall(PetscMalloc1(numStages, &localStageVisible)); 143778f1b9b4SToby Isaac PetscCall(PetscMalloc1(numStages, &stageVisible)); 143878f1b9b4SToby Isaac if (numStages > 0) { 143978f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 144078f1b9b4SToby Isaac PetscInt stage_id; 144178f1b9b4SToby Isaac 144278f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 144378f1b9b4SToby Isaac if (stage_id >= 0) { 144478f1b9b4SToby Isaac PetscStagePerf *stage_info; 144578f1b9b4SToby Isaac 144678f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info)); 144778f1b9b4SToby Isaac localStageUsed[stage] = stage_info->used; 144878f1b9b4SToby Isaac localStageVisible[stage] = stage_info->perfInfo.visible; 144978f1b9b4SToby Isaac } else { 145078f1b9b4SToby Isaac localStageUsed[stage] = PETSC_FALSE; 145178f1b9b4SToby Isaac localStageVisible[stage] = PETSC_TRUE; 145278f1b9b4SToby Isaac } 145378f1b9b4SToby Isaac } 14545440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(localStageUsed, stageUsed, numStages, MPI_C_BOOL, MPI_LOR, comm)); 14555440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(localStageVisible, stageVisible, numStages, MPI_C_BOOL, MPI_LAND, comm)); 145678f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 145778f1b9b4SToby Isaac if (stageUsed[stage] && stageVisible[stage]) { 14581d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\nSummary of Stages: ----- Time ------ ----- Flop ------ --- Messages --- -- Message Lengths -- -- Reductions --\n")); 14591d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Avg %%Total Avg %%Total Count %%Total Avg %%Total Count %%Total\n")); 146078f1b9b4SToby Isaac break; 146178f1b9b4SToby Isaac } 146278f1b9b4SToby Isaac } 146378f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 146478f1b9b4SToby Isaac PetscInt stage_id; 146578f1b9b4SToby Isaac PetscEventPerfInfo *stage_info; 146678f1b9b4SToby Isaac const char *stage_name; 146778f1b9b4SToby Isaac 146878f1b9b4SToby Isaac if (!(stageUsed[stage] && stageVisible[stage])) continue; 146978f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 147078f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 147178f1b9b4SToby Isaac stage_info = &zero_info; 147278f1b9b4SToby Isaac if (localStageUsed[stage]) { 147378f1b9b4SToby Isaac PetscStagePerf *stage_perf_info; 147478f1b9b4SToby Isaac 147578f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_perf_info)); 147678f1b9b4SToby Isaac stage_info = &stage_perf_info->perfInfo; 147778f1b9b4SToby Isaac } 1478462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1479462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1480462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1481462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1482462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 148378f1b9b4SToby Isaac mess *= 0.5; 148478f1b9b4SToby Isaac messLen *= 0.5; 148578f1b9b4SToby Isaac red /= size; 148678f1b9b4SToby Isaac if (TotalTime != 0.0) fracTime = stageTime / TotalTime; 148778f1b9b4SToby Isaac else fracTime = 0.0; 148878f1b9b4SToby Isaac if (TotalFlops != 0.0) fracFlops = flops / TotalFlops; 148978f1b9b4SToby Isaac else fracFlops = 0.0; 149078f1b9b4SToby Isaac /* Talk to Barry if (stageTime != 0.0) flops = (size*flops)/stageTime; else flops = 0.0; */ 149178f1b9b4SToby Isaac if (numMessages != 0.0) fracMessages = mess / numMessages; 149278f1b9b4SToby Isaac else fracMessages = 0.0; 149378f1b9b4SToby Isaac if (mess != 0.0) avgMessLen = messLen / mess; 149478f1b9b4SToby Isaac else avgMessLen = 0.0; 149578f1b9b4SToby Isaac if (messageLength != 0.0) fracLength = messLen / messageLength; 149678f1b9b4SToby Isaac else fracLength = 0.0; 149778f1b9b4SToby Isaac if (numReductions != 0.0) fracReductions = red / numReductions; 149878f1b9b4SToby Isaac else fracReductions = 0.0; 14991d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%2d: %15s: %6.4e %5.1f%% %6.4e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%%\n", stage, stage_name, stageTime / size, 100.0 * fracTime, flops, 100.0 * fracFlops, mess, 100.0 * fracMessages, avgMessLen, 100.0 * fracLength, red, 100.0 * fracReductions)); 150078f1b9b4SToby Isaac } 150178f1b9b4SToby Isaac } 150278f1b9b4SToby Isaac 15031d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n------------------------------------------------------------------------------------------------------------------------\n")); 15041d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n")); 15051d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Phase summary info:\n")); 15061d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Count: number of times phase was executed\n")); 15075cb5107fSJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, " Time and Flop: Max - maximum over all processes\n")); 15085cb5107fSJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, " Ratio - ratio of maximum to minimum over all processes\n")); 15091d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Mess: number of messages sent\n")); 15101d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " AvgLen: average message length (bytes)\n")); 15111d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Reduct: number of global reductions\n")); 15121d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Global: entire computation\n")); 15131d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n")); 15141d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %%T - percent time in this phase %%F - percent flop in this phase\n")); 15151d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %%M - percent messages in this phase %%L - percent message lengths in this phase\n")); 15161d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %%R - percent reductions in this phase\n")); 15175cb5107fSJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, " Total Mflop/s: 1e-6 * (sum of flop over all processes)/(max time over all processes)\n")); 151878f1b9b4SToby Isaac if (PetscLogMemory) { 15191d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Memory usage is summed over all MPI processes, it is given in mega-bytes\n")); 15201d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Malloc Mbytes: Memory allocated and kept during event (sum over all calls to event). May be negative\n")); 15211d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " EMalloc Mbytes: extra memory allocated during event and then freed (maximum over all calls to events). Never negative\n")); 15221d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " MMalloc Mbytes: Increase in high water mark of allocated memory (sum over all calls to event). Never negative\n")); 15231d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " RMI Mbytes: Increase in resident memory (sum over all calls to event)\n")); 152478f1b9b4SToby Isaac } 152578f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 15265cb5107fSJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, " GPU Mflop/s: 1e-6 * (sum of flop on GPU over all processes)/(max GPU time over all processes)\n")); 15271d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " CpuToGpu Count: total number of CPU to GPU copies per processor\n")); 152869fd5feaSJose E. Roman PetscCall(PetscViewerASCIIPrintf(viewer, " CpuToGpu Size (Mbytes): 1e-6 * (total size of CPU to GPU copies per processor)\n")); 15291d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " GpuToCpu Count: total number of GPU to CPU copies per processor\n")); 153069fd5feaSJose E. Roman PetscCall(PetscViewerASCIIPrintf(viewer, " GpuToCpu Size (Mbytes): 1e-6 * (total size of GPU to CPU copies per processor)\n")); 15311d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " GPU %%F: percent flops on GPU in this event\n")); 153278f1b9b4SToby Isaac #endif 15331d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------\n")); 153478f1b9b4SToby Isaac 15351d031f67SBarry Smith PetscCall(PetscLogViewWarnDebugging(viewer)); 153678f1b9b4SToby Isaac 153778f1b9b4SToby Isaac /* Report events */ 15381d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Event Count Time (sec) Flop --- Global --- --- Stage ---- Total")); 15391d031f67SBarry Smith if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, " Malloc EMalloc MMalloc RMI")); 154078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 15411d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " GPU - CpuToGpu - - GpuToCpu - GPU")); 15425268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) PetscCall(PetscViewerASCIIPrintf(viewer, " GPU GPU")); 154378f1b9b4SToby Isaac #endif 15441d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 15451d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Max Ratio Max Ratio Max Ratio Mess AvgLen Reduct %%T %%F %%M %%L %%R %%T %%F %%M %%L %%R Mflop/s")); 15461d031f67SBarry Smith if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, " Mbytes Mbytes Mbytes Mbytes")); 154778f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 15481d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Mflop/s Count Size Count Size %%F")); 15495268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) PetscCall(PetscViewerASCIIPrintf(viewer, " Joule Mflop/J")); 155078f1b9b4SToby Isaac #endif 15511d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 15521d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------")); 15531d031f67SBarry Smith if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, "-----------------------------")); 155478f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 15551d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "---------------------------------------")); 15565268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) PetscCall(PetscViewerASCIIPrintf(viewer, "-------------------")); 155778f1b9b4SToby Isaac #endif 15581d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 155978f1b9b4SToby Isaac 156078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 156178f1b9b4SToby Isaac /* this indirect way of accessing these values is needed when PETSc is build with multiple libraries since the symbols are not in libpetscsys */ 15628025bc25SToby Isaac PetscCall(PetscLogStateGetEventFromName(state, "TaoSolve", &TAO_Solve)); 156378f1b9b4SToby Isaac PetscCall(PetscLogStateGetEventFromName(state, "TSStep", &TS_Step)); 156478f1b9b4SToby Isaac PetscCall(PetscLogStateGetEventFromName(state, "SNESSolve", &SNES_Solve)); 156578f1b9b4SToby Isaac PetscCall(PetscLogStateGetEventFromName(state, "KSPSolve", &KSP_Solve)); 156678f1b9b4SToby Isaac #endif 156778f1b9b4SToby Isaac 156878f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 156978f1b9b4SToby Isaac PetscInt stage_id; 157078f1b9b4SToby Isaac PetscEventPerfInfo *stage_info; 157178f1b9b4SToby Isaac const char *stage_name; 157278f1b9b4SToby Isaac 157378f1b9b4SToby Isaac if (!(stageVisible[stage] && stageUsed[stage])) continue; 157478f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id)); 157578f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 15761d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n--- Event Stage %d: %s\n\n", stage, stage_name)); 157778f1b9b4SToby Isaac stage_info = &zero_info; 157878f1b9b4SToby Isaac if (localStageUsed[stage]) { 157978f1b9b4SToby Isaac PetscStagePerf *stage_perf_info; 158078f1b9b4SToby Isaac 158178f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_perf_info)); 158278f1b9b4SToby Isaac stage_info = &stage_perf_info->perfInfo; 158378f1b9b4SToby Isaac } 1584462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1585462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1586462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1587462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1588462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&stage_info->numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 158978f1b9b4SToby Isaac mess *= 0.5; 159078f1b9b4SToby Isaac messLen *= 0.5; 159178f1b9b4SToby Isaac red /= size; 159278f1b9b4SToby Isaac 159378f1b9b4SToby Isaac for (event = 0; event < numEvents; event++) { 159478f1b9b4SToby Isaac PetscInt event_id; 159578f1b9b4SToby Isaac PetscEventPerfInfo *event_info = &zero_info; 159678f1b9b4SToby Isaac PetscBool is_zero = PETSC_FALSE; 159778f1b9b4SToby Isaac const char *event_name; 159878f1b9b4SToby Isaac 159978f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id)); 160078f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name)); 16013a7d0413SPierre Jolivet if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &event_info)); 1602418fb43bSPierre Jolivet PetscCall(PetscArraycmp(event_info, &zero_info, 1, &is_zero)); 16035440e5dcSBarry Smith PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPI_C_BOOL, MPI_LAND, comm)); 160478f1b9b4SToby Isaac if (!is_zero) { 160578f1b9b4SToby Isaac flopr = event_info->flops; 1606462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1607462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1608462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->flops, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1609462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->time, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm)); 1610462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->time, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 1611462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->time, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1612462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->numMessages, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1613462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1614462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->numReductions, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1615462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->count, &minC, 1, MPI_INT, MPI_MIN, comm)); 1616462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->count, &maxC, 1, MPI_INT, MPI_MAX, comm)); 161778f1b9b4SToby Isaac if (PetscLogMemory) { 1618462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->memIncrease, &mem, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1619462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->mallocSpace, &mal, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1620462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->mallocIncrease, &malmax, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1621462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->mallocIncreaseEvent, &emalmax, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 162278f1b9b4SToby Isaac } 162378f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 1624462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->CpuToGpuCount, &cct, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1625462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->GpuToCpuCount, &gct, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1626462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->CpuToGpuSize, &csz, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1627462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->GpuToCpuSize, &gsz, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1628462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->GpuFlops, &gflops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 1629462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&event_info->GpuTime, &gmaxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm)); 16305268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) PetscCallMPI(MPIU_Allreduce(&event_info->GpuEnergy, &gjoules, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm)); 163178f1b9b4SToby Isaac #endif 163278f1b9b4SToby Isaac if (mint < 0.0) { 16335cb5107fSJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, "WARNING!!! Minimum time %g over all processes 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, event_name)); 163478f1b9b4SToby Isaac mint = 0; 163578f1b9b4SToby Isaac } 16365cb5107fSJunchao Zhang PetscCheck(minf >= 0.0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Minimum flop %g over all processes for %s is negative! Not possible!", minf, event_name); 16377d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU) 163878f1b9b4SToby Isaac /* Put NaN into the time for all events that may not be time accurately since they may happen asynchronously on the GPU */ 163978f1b9b4SToby Isaac if (!PetscLogGpuTimeFlag && petsc_gflops > 0) { 164078f1b9b4SToby Isaac memcpy(&gmaxt, &nas, sizeof(PetscLogDouble)); 164178f1b9b4SToby Isaac if (event_id != SNES_Solve && event_id != KSP_Solve && event_id != TS_Step && event_id != TAO_Solve) { 164278f1b9b4SToby Isaac memcpy(&mint, &nas, sizeof(PetscLogDouble)); 164378f1b9b4SToby Isaac memcpy(&maxt, &nas, sizeof(PetscLogDouble)); 164478f1b9b4SToby Isaac } 164578f1b9b4SToby Isaac } 164678f1b9b4SToby Isaac #endif 164778f1b9b4SToby Isaac totm *= 0.5; 164878f1b9b4SToby Isaac totml *= 0.5; 164978f1b9b4SToby Isaac totr /= size; 165078f1b9b4SToby Isaac 165178f1b9b4SToby Isaac if (maxC != 0) { 165278f1b9b4SToby Isaac if (minC != 0) ratC = ((PetscLogDouble)maxC) / minC; 165378f1b9b4SToby Isaac else ratC = 0.0; 165478f1b9b4SToby Isaac if (mint != 0.0) ratt = maxt / mint; 165578f1b9b4SToby Isaac else ratt = 0.0; 165678f1b9b4SToby Isaac if (minf != 0.0) ratf = maxf / minf; 165778f1b9b4SToby Isaac else ratf = 0.0; 165878f1b9b4SToby Isaac if (TotalTime != 0.0) fracTime = tott / TotalTime; 165978f1b9b4SToby Isaac else fracTime = 0.0; 166078f1b9b4SToby Isaac if (TotalFlops != 0.0) fracFlops = totf / TotalFlops; 166178f1b9b4SToby Isaac else fracFlops = 0.0; 166278f1b9b4SToby Isaac if (stageTime != 0.0) fracStageTime = tott / stageTime; 166378f1b9b4SToby Isaac else fracStageTime = 0.0; 166478f1b9b4SToby Isaac if (flops != 0.0) fracStageFlops = totf / flops; 166578f1b9b4SToby Isaac else fracStageFlops = 0.0; 166678f1b9b4SToby Isaac if (numMessages != 0.0) fracMess = totm / numMessages; 166778f1b9b4SToby Isaac else fracMess = 0.0; 166878f1b9b4SToby Isaac if (messageLength != 0.0) fracMessLen = totml / messageLength; 166978f1b9b4SToby Isaac else fracMessLen = 0.0; 167078f1b9b4SToby Isaac if (numReductions != 0.0) fracRed = totr / numReductions; 167178f1b9b4SToby Isaac else fracRed = 0.0; 167278f1b9b4SToby Isaac if (mess != 0.0) fracStageMess = totm / mess; 167378f1b9b4SToby Isaac else fracStageMess = 0.0; 167478f1b9b4SToby Isaac if (messLen != 0.0) fracStageMessLen = totml / messLen; 167578f1b9b4SToby Isaac else fracStageMessLen = 0.0; 167678f1b9b4SToby Isaac if (red != 0.0) fracStageRed = totr / red; 167778f1b9b4SToby Isaac else fracStageRed = 0.0; 167878f1b9b4SToby Isaac if (totm != 0.0) totml /= totm; 167978f1b9b4SToby Isaac else totml = 0.0; 168078f1b9b4SToby Isaac if (maxt != 0.0) flopr = totf / maxt; 168178f1b9b4SToby Isaac else flopr = 0.0; 16820a82db20SJunchao Zhang if (fracStageTime > 1.0 || fracStageFlops > 1.0 || fracStageMess > 1.0 || fracStageMessLen > 1.0 || fracStageRed > 1.0) { 16830a82db20SJunchao Zhang if (PetscIsNanReal(maxt)) 16840a82db20SJunchao Zhang PetscCall(PetscViewerASCIIPrintf(viewer, "%-16s %7d %3.1f n/a n/a %3.2e %3.1f %2.1e %2.1e %2.1e %2.0f %2.0f %2.0f %2.0f %2.0f Multiple stages n/a", event_name, maxC, ratC, maxf, ratf, totm, totml, totr, 100.0 * fracTime, 100.0 * fracFlops, 100.0 * fracMess, 100.0 * fracMessLen, 100.0 * fracRed)); 16850a82db20SJunchao Zhang else 16861d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%-16s %7d %3.1f %5.4e %3.1f %3.2e %3.1f %2.1e %2.1e %2.1e %2.0f %2.0f %2.0f %2.0f %2.0f Multiple stages %5.0f", event_name, maxC, ratC, maxt, ratt, maxf, ratf, totm, totml, totr, 100.0 * fracTime, 100.0 * fracFlops, 100.0 * fracMess, 100.0 * fracMessLen, 100.0 * fracRed, PetscAbs(flopr) / 1.0e6)); 16870a82db20SJunchao Zhang } else { 16880a82db20SJunchao Zhang if (PetscIsNanReal(maxt)) { // when maxt, ratt, flopr are NaN (i.e., run with GPUs but without -log_view_gpu_time), replace the confusing "nan" with "n/a" 16891d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%-16s %7d %3.1f n/a n/a %3.2e %3.1f %2.1e %2.1e %2.1e %2.0f %2.0f %2.0f %2.0f %2.0f %3.0f %2.0f %2.0f %2.0f %2.0f n/a", event_name, maxC, ratC, maxf, ratf, totm, totml, totr, 100.0 * fracTime, 100.0 * fracFlops, 100.0 * fracMess, 100.0 * fracMessLen, 100.0 * fracRed, 100.0 * fracStageTime, 100.0 * fracStageFlops, 100.0 * fracStageMess, 100.0 * fracStageMessLen, 100.0 * fracStageRed)); 16903141c872SJunchao Zhang } else { 16911d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%-16s %7d %3.1f %5.4e %3.1f %3.2e %3.1f %2.1e %2.1e %2.1e %2.0f %2.0f %2.0f %2.0f %2.0f %3.0f %2.0f %2.0f %2.0f %2.0f %5.0f", event_name, maxC, ratC, maxt, ratt, maxf, ratf, totm, totml, totr, 100.0 * fracTime, 100.0 * fracFlops, 100.0 * fracMess, 100.0 * fracMessLen, 100.0 * fracRed, 100.0 * fracStageTime, 100.0 * fracStageFlops, 100.0 * fracStageMess, 100.0 * fracStageMessLen, 100.0 * fracStageRed, PetscAbs(flopr) / 1.0e6)); 16923141c872SJunchao Zhang } 16933141c872SJunchao Zhang } 16941d031f67SBarry Smith if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, " %5.0f %5.0f %5.0f %5.0f", mal / 1.0e6, emalmax / 1.0e6, malmax / 1.0e6, mem / 1.0e6)); 169578f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 169678f1b9b4SToby Isaac if (totf != 0.0) fracgflops = gflops / totf; 169778f1b9b4SToby Isaac else fracgflops = 0.0; 169878f1b9b4SToby Isaac if (gmaxt != 0.0) gflopr = gflops / gmaxt; 169978f1b9b4SToby Isaac else gflopr = 0.0; 17000a82db20SJunchao Zhang if (PetscIsNanReal(gflopr)) { 17011d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " n/a %4.0f %3.2e %4.0f %3.2e %2.0f", cct / size, csz / (1.0e6 * size), gct / size, gsz / (1.0e6 * size), 100.0 * fracgflops)); 17023141c872SJunchao Zhang } else { 17031d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %5.0f %4.0f %3.2e %4.0f %3.2e %2.0f", PetscAbs(gflopr) / 1.0e6, cct / size, csz / (1.0e6 * size), gct / size, gsz / (1.0e6 * size), 100.0 * fracgflops)); 17043141c872SJunchao Zhang } 17055268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) { 17065268dc8aSHong Zhang if (gjoules != 0.0) geff = gflops / gjoules; 17075268dc8aSHong Zhang else geff = 0.0; 17085268dc8aSHong Zhang PetscCall(PetscViewerASCIIPrintf(viewer, " %4.2e %4.2e", gjoules, geff)); 17095268dc8aSHong Zhang } 171078f1b9b4SToby Isaac #endif 17111d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 171278f1b9b4SToby Isaac } 171378f1b9b4SToby Isaac } 171478f1b9b4SToby Isaac } 171578f1b9b4SToby Isaac } 171678f1b9b4SToby Isaac 171778f1b9b4SToby Isaac /* Memory usage and object creation */ 17181d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------")); 17191d031f67SBarry Smith if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, "-----------------------------")); 172078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE) 17211d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "---------------------------------------")); 17225268dc8aSHong Zhang if (PetscLogGpuEnergyFlag || PetscLogGpuEnergyMeterFlag) PetscCall(PetscViewerASCIIPrintf(viewer, "-------------------")); 172378f1b9b4SToby Isaac #endif 17241d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 17251d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 172678f1b9b4SToby Isaac 172778f1b9b4SToby Isaac /* Right now, only stages on the first processor are reported here, meaning only objects associated with 172878f1b9b4SToby Isaac the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then 172978f1b9b4SToby Isaac stats for stages local to processor sets. 173078f1b9b4SToby Isaac */ 173178f1b9b4SToby Isaac /* We should figure out the longest object name here (now 20 characters) */ 17321d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Object Type Creations Destructions. Reports information only for process 0.\n")); 173378f1b9b4SToby Isaac for (stage = 0; stage < numStages; stage++) { 173478f1b9b4SToby Isaac const char *stage_name; 173578f1b9b4SToby Isaac 173678f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name)); 17371d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n--- Event Stage %d: %s\n\n", stage, stage_name)); 173878f1b9b4SToby Isaac if (localStageUsed[stage]) { 173978f1b9b4SToby Isaac PetscInt num_classes; 174078f1b9b4SToby Isaac 174178f1b9b4SToby Isaac PetscCall(PetscLogStateGetNumClasses(state, &num_classes)); 174278f1b9b4SToby Isaac for (oclass = 0; oclass < num_classes; oclass++) { 174378f1b9b4SToby Isaac PetscClassPerf *class_perf_info; 174478f1b9b4SToby Isaac 174578f1b9b4SToby Isaac PetscCall(PetscLogHandlerDefaultGetClassPerf(handler, stage, oclass, &class_perf_info)); 1746a0449d98SPierre Jolivet if (class_perf_info->creations > 0 || class_perf_info->destructions > 0) { 174778f1b9b4SToby Isaac PetscLogClassInfo class_reg_info; 1748a0449d98SPierre Jolivet PetscBool flg = PETSC_FALSE; 174978f1b9b4SToby Isaac 175078f1b9b4SToby Isaac PetscCall(PetscLogStateClassGetInfo(state, oclass, &class_reg_info)); 175107e942bbSPierre Jolivet if (stage == 0 && oclass == num_classes - 1) { 1752a0449d98SPierre Jolivet if (PetscGlobalArgc == 0 && PetscGlobalArgs == NULL) { 175307e942bbSPierre Jolivet PetscCall(PetscStrcmp(class_reg_info.name, "Viewer", &flg)); 17545993eba9SPierre Jolivet if (flg && class_perf_info->creations == PetscLogNumViewersCreated && class_perf_info->destructions == PetscLogNumViewersDestroyed) continue; 1755a0449d98SPierre Jolivet } 1756a0449d98SPierre Jolivet } 1757a0449d98SPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, "%20s %5d %5d\n", class_reg_info.name, class_perf_info->creations, class_perf_info->destructions)); 175878f1b9b4SToby Isaac } 175978f1b9b4SToby Isaac } 176078f1b9b4SToby Isaac } 176178f1b9b4SToby Isaac } 176278f1b9b4SToby Isaac 176378f1b9b4SToby Isaac PetscCall(PetscFree(localStageUsed)); 176478f1b9b4SToby Isaac PetscCall(PetscFree(stageUsed)); 176578f1b9b4SToby Isaac PetscCall(PetscFree(localStageVisible)); 176678f1b9b4SToby Isaac PetscCall(PetscFree(stageVisible)); 176778f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_stages)); 176878f1b9b4SToby Isaac PetscCall(PetscLogGlobalNamesDestroy(&global_events)); 176978f1b9b4SToby Isaac 177078f1b9b4SToby Isaac /* Information unrelated to this particular run */ 17711d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "========================================================================================================================\n")); 177278f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177378f1b9b4SToby Isaac PetscCall(PetscTime(&x)); 177478f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177578f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177678f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177778f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177878f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 177978f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 178078f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 178178f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 178278f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 178378f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 17841d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Average time to get PetscTime(): %g\n", (y - x) / 10.0)); 178578f1b9b4SToby Isaac /* MPI information */ 178678f1b9b4SToby Isaac if (size > 1) { 178778f1b9b4SToby Isaac MPI_Status status; 178878f1b9b4SToby Isaac PetscMPIInt tag; 178978f1b9b4SToby Isaac MPI_Comm newcomm; 179078f1b9b4SToby Isaac 179178f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179278f1b9b4SToby Isaac PetscCall(PetscTime(&x)); 179378f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179478f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179578f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179678f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179778f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 179878f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 17991d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Average time for MPI_Barrier(): %g\n", (y - x) / 5.0)); 180078f1b9b4SToby Isaac PetscCall(PetscCommDuplicate(comm, &newcomm, &tag)); 180178f1b9b4SToby Isaac PetscCallMPI(MPI_Barrier(comm)); 180278f1b9b4SToby Isaac if (rank) { 180378f1b9b4SToby Isaac PetscCallMPI(MPI_Recv(NULL, 0, MPI_INT, rank - 1, tag, newcomm, &status)); 180478f1b9b4SToby Isaac PetscCallMPI(MPI_Send(NULL, 0, MPI_INT, (rank + 1) % size, tag, newcomm)); 180578f1b9b4SToby Isaac } else { 180678f1b9b4SToby Isaac PetscCall(PetscTime(&x)); 180778f1b9b4SToby Isaac PetscCallMPI(MPI_Send(NULL, 0, MPI_INT, 1, tag, newcomm)); 180878f1b9b4SToby Isaac PetscCallMPI(MPI_Recv(NULL, 0, MPI_INT, size - 1, tag, newcomm, &status)); 180978f1b9b4SToby Isaac PetscCall(PetscTime(&y)); 18101d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Average time for zero size MPI_Send(): %g\n", (y - x) / size)); 181178f1b9b4SToby Isaac } 181278f1b9b4SToby Isaac PetscCall(PetscCommDestroy(&newcomm)); 181378f1b9b4SToby Isaac } 181478f1b9b4SToby Isaac PetscCall(PetscOptionsView(NULL, viewer)); 181578f1b9b4SToby Isaac 181678f1b9b4SToby Isaac /* Machine and compile information */ 181778f1b9b4SToby Isaac if (PetscDefined(USE_FORTRAN_KERNELS)) { 18181d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with FORTRAN kernels\n")); 181978f1b9b4SToby Isaac } else { 18201d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled without FORTRAN kernels\n")); 182178f1b9b4SToby Isaac } 182278f1b9b4SToby Isaac if (PetscDefined(USE_64BIT_INDICES)) { 18231d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 64-bit PetscInt\n")); 182478f1b9b4SToby Isaac } else if (PetscDefined(USE___FLOAT128)) { 18251d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 32-bit PetscInt\n")); 182678f1b9b4SToby Isaac } 182778f1b9b4SToby Isaac if (PetscDefined(USE_REAL_SINGLE)) { 18281d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with single precision PetscScalar and PetscReal\n")); 182978f1b9b4SToby Isaac } else if (PetscDefined(USE___FLOAT128)) { 18301d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 128 bit precision PetscScalar and PetscReal\n")); 183178f1b9b4SToby Isaac } 183278f1b9b4SToby Isaac if (PetscDefined(USE_REAL_MAT_SINGLE)) { 18331d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with single precision matrices\n")); 183478f1b9b4SToby Isaac } else { 18351d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with full precision matrices (default)\n")); 183678f1b9b4SToby Isaac } 18371d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "sizeof(short) %d sizeof(int) %d sizeof(long) %d sizeof(void*) %d sizeof(PetscScalar) %d sizeof(PetscInt) %d\n", (int)sizeof(short), (int)sizeof(int), (int)sizeof(long), (int)sizeof(void *), (int)sizeof(PetscScalar), (int)sizeof(PetscInt))); 183878f1b9b4SToby Isaac 18391d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Configure options: %s", petscconfigureoptions)); 18401d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petscmachineinfo)); 18411d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsccompilerinfo)); 18421d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsccompilerflagsinfo)); 18431d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsclinkerinfo)); 184478f1b9b4SToby Isaac 184578f1b9b4SToby Isaac /* Cleanup */ 18461d031f67SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "\n")); 18471d031f67SBarry Smith PetscCall(PetscLogViewWarnNoGpuAwareMpi(viewer)); 18481d031f67SBarry Smith PetscCall(PetscLogViewWarnDebugging(viewer)); 184978f1b9b4SToby Isaac PetscCall(PetscFPTrapPop()); 185078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 185178f1b9b4SToby Isaac } 1852*31a765c4SPierre Jolivet PETSC_PRAGMA_DIAGNOSTIC_IGNORED_END() 185378f1b9b4SToby Isaac 185478f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default(PetscLogHandler handler, PetscViewer viewer) 185578f1b9b4SToby Isaac { 185678f1b9b4SToby Isaac PetscViewerFormat format; 18574d86920dSPierre Jolivet 185878f1b9b4SToby Isaac PetscFunctionBegin; 185978f1b9b4SToby Isaac PetscCall(PetscViewerGetFormat(viewer, &format)); 186078f1b9b4SToby Isaac if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO) { 186178f1b9b4SToby Isaac PetscCall(PetscLogHandlerView_Default_Info(handler, viewer)); 186278f1b9b4SToby Isaac } else if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 186378f1b9b4SToby Isaac PetscCall(PetscLogHandlerView_Default_Detailed(handler, viewer)); 186478f1b9b4SToby Isaac } else if (format == PETSC_VIEWER_ASCII_CSV) { 186578f1b9b4SToby Isaac PetscCall(PetscLogHandlerView_Default_CSV(handler, viewer)); 186678f1b9b4SToby Isaac } 186778f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 186878f1b9b4SToby Isaac } 186978f1b9b4SToby Isaac 187078f1b9b4SToby Isaac /*MC 1871294de794SToby Isaac PETSCLOGHANDLERDEFAULT - PETSCLOGHANDLERDEFAULT = "default" - A `PetscLogHandler` that collects data for PETSc 1872b665b14eSToby Isaac default profiling log viewers (`PetscLogView()` and `PetscLogDump()`). A log handler of this type is 1873b665b14eSToby Isaac created and started (`PetscLogHandlerStart()`) by `PetscLogDefaultBegin()`. 187478f1b9b4SToby Isaac 187578f1b9b4SToby Isaac Options Database Keys: 187678f1b9b4SToby Isaac + -log_include_actions - include a growing list of actions (event beginnings and endings, object creations and destructions) in `PetscLogDump()` (`PetscLogActions()`). 187778f1b9b4SToby Isaac - -log_include_objects - include a growing list of object creations and destructions in `PetscLogDump()` (`PetscLogObjects()`). 187878f1b9b4SToby Isaac 187978f1b9b4SToby Isaac Level: developer 188078f1b9b4SToby Isaac 188178f1b9b4SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler` 188278f1b9b4SToby Isaac M*/ 188378f1b9b4SToby Isaac 188478f1b9b4SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler handler) 188578f1b9b4SToby Isaac { 188678f1b9b4SToby Isaac PetscFunctionBegin; 188778f1b9b4SToby Isaac PetscCall(PetscLogHandlerContextCreate_Default((PetscLogHandler_Default *)&handler->data)); 188878f1b9b4SToby Isaac handler->ops->destroy = PetscLogHandlerDestroy_Default; 188978f1b9b4SToby Isaac handler->ops->eventbegin = PetscLogHandlerEventBegin_Default; 189078f1b9b4SToby Isaac handler->ops->eventend = PetscLogHandlerEventEnd_Default; 189178f1b9b4SToby Isaac handler->ops->eventsync = PetscLogHandlerEventSync_Default; 189278f1b9b4SToby Isaac handler->ops->objectcreate = PetscLogHandlerObjectCreate_Default; 189378f1b9b4SToby Isaac handler->ops->objectdestroy = PetscLogHandlerObjectDestroy_Default; 189478f1b9b4SToby Isaac handler->ops->stagepush = PetscLogHandlerStagePush_Default; 189578f1b9b4SToby Isaac handler->ops->stagepop = PetscLogHandlerStagePop_Default; 189678f1b9b4SToby Isaac handler->ops->view = PetscLogHandlerView_Default; 1897dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetEventPerfInfo_C", PetscLogHandlerGetEventPerfInfo_Default)); 18988b08f494SToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetStagePerfInfo_C", PetscLogHandlerGetStagePerfInfo_Default)); 1899dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerSetLogActions_C", PetscLogHandlerSetLogActions_Default)); 1900dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerSetLogObjects_C", PetscLogHandlerSetLogObjects_Default)); 1901dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerLogObjectState_C", PetscLogHandlerLogObjectState_Default)); 1902dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetNumObjects_C", PetscLogHandlerGetNumObjects_Default)); 1903dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventDeactivatePush_C", PetscLogHandlerEventDeactivatePush_Default)); 1904dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventDeactivatePop_C", PetscLogHandlerEventDeactivatePop_Default)); 1905dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsPause_C", PetscLogHandlerEventsPause_Default)); 1906dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsResume_C", PetscLogHandlerEventsResume_Default)); 1907dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerDump_C", PetscLogHandlerDump_Default)); 1908dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerStageSetVisible_C", PetscLogHandlerStageSetVisible_Default)); 1909dff009beSToby Isaac PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerStageGetVisible_C", PetscLogHandlerStageGetVisible_Default)); 191078f1b9b4SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 191178f1b9b4SToby Isaac } 1912