xref: /petsc/src/sys/logging/handler/impls/default/logdefault.c (revision 7d766218e3bc62b9d20359dfd3a8f5ff55ad6b2a)
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;
5578f1b9b4SToby Isaac #endif
5678f1b9b4SToby Isaac   if (logMemory) {
5778f1b9b4SToby Isaac     PetscLogDouble usage;
5878f1b9b4SToby Isaac     PetscCall(PetscMemoryGetCurrentUsage(&usage));
5978f1b9b4SToby Isaac     eventInfo->memIncrease -= usage;
6078f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&usage));
6178f1b9b4SToby Isaac     eventInfo->mallocSpace -= usage;
6278f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&usage));
6378f1b9b4SToby Isaac     eventInfo->mallocIncrease -= usage;
6478f1b9b4SToby Isaac     PetscCall(PetscMallocPushMaximumUsage(event));
6578f1b9b4SToby Isaac   }
6678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6778f1b9b4SToby Isaac }
6878f1b9b4SToby Isaac 
6978f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoTic(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event)
7078f1b9b4SToby Isaac {
7178f1b9b4SToby Isaac   PetscFunctionBegin;
7278f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoTic_Internal(eventInfo, time, logMemory, event, PETSC_FALSE));
7378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
7478f1b9b4SToby Isaac }
7578f1b9b4SToby Isaac 
7678f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoResume(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event)
7778f1b9b4SToby Isaac {
7878f1b9b4SToby Isaac   PetscFunctionBegin;
7978f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoTic_Internal(eventInfo, time, logMemory, event, PETSC_TRUE));
8078f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
8178f1b9b4SToby Isaac }
8278f1b9b4SToby Isaac 
8378f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoToc_Internal(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event, PetscBool pause)
8478f1b9b4SToby Isaac {
8578f1b9b4SToby Isaac   PetscFunctionBegin;
8678f1b9b4SToby Isaac   eventInfo->timeTmp += time;
8778f1b9b4SToby Isaac   eventInfo->flopsTmp += petsc_TotalFlops_th;
8878f1b9b4SToby Isaac   if (!pause) {
8978f1b9b4SToby Isaac     eventInfo->time += eventInfo->timeTmp;
9078f1b9b4SToby Isaac     eventInfo->time2 += eventInfo->timeTmp * eventInfo->timeTmp;
9178f1b9b4SToby Isaac     eventInfo->flops += eventInfo->flopsTmp;
9278f1b9b4SToby Isaac     eventInfo->flops2 += eventInfo->flopsTmp * eventInfo->flopsTmp;
9378f1b9b4SToby Isaac   }
9478f1b9b4SToby Isaac   eventInfo->numMessages += petsc_irecv_ct_th + petsc_isend_ct_th + petsc_recv_ct_th + petsc_send_ct_th;
9578f1b9b4SToby Isaac   eventInfo->messageLength += petsc_irecv_len_th + petsc_isend_len_th + petsc_recv_len + petsc_send_len_th;
9678f1b9b4SToby Isaac   eventInfo->numReductions += petsc_allreduce_ct_th + petsc_gather_ct_th + petsc_scatter_ct_th;
9778f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
9878f1b9b4SToby Isaac   eventInfo->CpuToGpuCount += petsc_ctog_ct_th;
9978f1b9b4SToby Isaac   eventInfo->GpuToCpuCount += petsc_gtoc_ct_th;
10078f1b9b4SToby Isaac   eventInfo->CpuToGpuSize += petsc_ctog_sz_th;
10178f1b9b4SToby Isaac   eventInfo->GpuToCpuSize += petsc_gtoc_sz_th;
10278f1b9b4SToby Isaac   eventInfo->GpuFlops += petsc_gflops_th;
10378f1b9b4SToby Isaac   eventInfo->GpuTime += petsc_gtime;
10478f1b9b4SToby Isaac #endif
10578f1b9b4SToby Isaac   if (logMemory) {
10678f1b9b4SToby Isaac     PetscLogDouble usage, musage;
10778f1b9b4SToby Isaac     PetscCall(PetscMemoryGetCurrentUsage(&usage)); /* the comments below match the column labels printed in PetscLogView_Default() */
10878f1b9b4SToby Isaac     eventInfo->memIncrease += usage;               /* RMI */
10978f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&usage));
11078f1b9b4SToby Isaac     eventInfo->mallocSpace += usage; /* Malloc */
11178f1b9b4SToby Isaac     PetscCall(PetscMallocPopMaximumUsage((int)event, &musage));
11278f1b9b4SToby Isaac     eventInfo->mallocIncreaseEvent = PetscMax(musage - usage, eventInfo->mallocIncreaseEvent); /* EMalloc */
11378f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&usage));
11478f1b9b4SToby Isaac     eventInfo->mallocIncrease += usage; /* MMalloc */
11578f1b9b4SToby Isaac   }
11678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
11778f1b9b4SToby Isaac }
11878f1b9b4SToby Isaac 
11978f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoToc(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event)
12078f1b9b4SToby Isaac {
12178f1b9b4SToby Isaac   PetscFunctionBegin;
12278f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoToc_Internal(eventInfo, time, logMemory, event, PETSC_FALSE));
12378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
12478f1b9b4SToby Isaac }
12578f1b9b4SToby Isaac 
12678f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoPause(PetscEventPerfInfo *eventInfo, PetscLogDouble time, PetscBool logMemory, int event)
12778f1b9b4SToby Isaac {
12878f1b9b4SToby Isaac   PetscFunctionBegin;
1293e446a5eSToby Isaac   PetscCall(PetscEventPerfInfoToc_Internal(eventInfo, time, logMemory, event, PETSC_TRUE));
13078f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13178f1b9b4SToby Isaac }
13278f1b9b4SToby Isaac 
13378f1b9b4SToby Isaac static PetscErrorCode PetscEventPerfInfoAdd_Internal(const PetscEventPerfInfo *eventInfo, PetscEventPerfInfo *outInfo)
13478f1b9b4SToby Isaac {
13578f1b9b4SToby Isaac   PetscFunctionBegin;
13678f1b9b4SToby Isaac   outInfo->count += eventInfo->count;
13778f1b9b4SToby Isaac   outInfo->time += eventInfo->time;
13878f1b9b4SToby Isaac   outInfo->time2 += eventInfo->time2;
13978f1b9b4SToby Isaac   outInfo->flops += eventInfo->flops;
14078f1b9b4SToby Isaac   outInfo->flops2 += eventInfo->flops2;
14178f1b9b4SToby Isaac   outInfo->numMessages += eventInfo->numMessages;
14278f1b9b4SToby Isaac   outInfo->messageLength += eventInfo->messageLength;
14378f1b9b4SToby Isaac   outInfo->numReductions += eventInfo->numReductions;
14478f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
14578f1b9b4SToby Isaac   outInfo->CpuToGpuCount += eventInfo->CpuToGpuCount;
14678f1b9b4SToby Isaac   outInfo->GpuToCpuCount += eventInfo->GpuToCpuCount;
14778f1b9b4SToby Isaac   outInfo->CpuToGpuSize += eventInfo->CpuToGpuSize;
14878f1b9b4SToby Isaac   outInfo->GpuToCpuSize += eventInfo->GpuToCpuSize;
14978f1b9b4SToby Isaac   outInfo->GpuFlops += eventInfo->GpuFlops;
15078f1b9b4SToby Isaac   outInfo->GpuTime += eventInfo->GpuTime;
15178f1b9b4SToby Isaac #endif
15278f1b9b4SToby Isaac   outInfo->memIncrease += eventInfo->memIncrease;
15378f1b9b4SToby Isaac   outInfo->mallocSpace += eventInfo->mallocSpace;
15478f1b9b4SToby Isaac   outInfo->mallocIncreaseEvent += eventInfo->mallocIncreaseEvent;
15578f1b9b4SToby Isaac   outInfo->mallocIncrease += eventInfo->mallocIncrease;
15678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15778f1b9b4SToby Isaac }
15878f1b9b4SToby Isaac 
15978f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(EventPerfArray, PetscEventPerfInfo, PetscLogEvent, PetscEventPerfInfoInit, NULL, NULL)
16078f1b9b4SToby Isaac 
16178f1b9b4SToby Isaac /* --- PetscClassPerf --- */
16278f1b9b4SToby Isaac 
16378f1b9b4SToby Isaac typedef struct {
16478f1b9b4SToby Isaac   int            creations;    /* The number of objects of this class created */
16578f1b9b4SToby Isaac   int            destructions; /* The number of objects of this class destroyed */
16678f1b9b4SToby Isaac   PetscLogDouble mem;          /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */
16778f1b9b4SToby Isaac   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */
16878f1b9b4SToby Isaac } PetscClassPerf;
16978f1b9b4SToby Isaac 
17078f1b9b4SToby Isaac static PetscErrorCode PetscClassPerfInit(PetscClassPerf *classInfo)
17178f1b9b4SToby Isaac {
17278f1b9b4SToby Isaac   PetscFunctionBegin;
17378f1b9b4SToby Isaac   PetscCall(PetscMemzero(classInfo, sizeof(*classInfo)));
17478f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
17578f1b9b4SToby Isaac }
17678f1b9b4SToby Isaac 
17778f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ClassPerfArray, PetscClassPerf, PetscLogClass, PetscClassPerfInit, NULL, NULL)
17878f1b9b4SToby Isaac 
17978f1b9b4SToby Isaac /* --- PetscStagePerf --- */
18078f1b9b4SToby Isaac 
18178f1b9b4SToby Isaac typedef struct _PetscStagePerf {
18278f1b9b4SToby Isaac   PetscBool              used;     /* The stage was pushed on this processor */
18378f1b9b4SToby Isaac   PetscEventPerfInfo     perfInfo; /* The stage performance information */
18478f1b9b4SToby Isaac   PetscLogEventPerfArray eventLog; /* The event information for this stage */
18578f1b9b4SToby Isaac   PetscLogClassPerfArray classLog; /* The class information for this stage */
18678f1b9b4SToby Isaac } PetscStagePerf;
18778f1b9b4SToby Isaac 
18878f1b9b4SToby Isaac static PetscErrorCode PetscStageInfoInit(PetscStagePerf *stageInfo)
18978f1b9b4SToby Isaac {
19078f1b9b4SToby Isaac   PetscFunctionBegin;
19178f1b9b4SToby Isaac   PetscCall(PetscMemzero(stageInfo, sizeof(*stageInfo)));
192f4f49eeaSPierre Jolivet   PetscCall(PetscLogEventPerfArrayCreate(128, &stageInfo->eventLog));
193f4f49eeaSPierre Jolivet   PetscCall(PetscLogClassPerfArrayCreate(128, &stageInfo->classLog));
19478f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoInit(&stageInfo->perfInfo));
19578f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19678f1b9b4SToby Isaac }
19778f1b9b4SToby Isaac 
19878f1b9b4SToby Isaac static PetscErrorCode PetscStageInfoReset(PetscStagePerf *stageInfo)
19978f1b9b4SToby Isaac {
20078f1b9b4SToby Isaac   PetscFunctionBegin;
201f4f49eeaSPierre Jolivet   PetscCall(PetscLogEventPerfArrayDestroy(&stageInfo->eventLog));
202f4f49eeaSPierre Jolivet   PetscCall(PetscLogClassPerfArrayDestroy(&stageInfo->classLog));
20378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
20478f1b9b4SToby Isaac }
20578f1b9b4SToby Isaac 
20678f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(StageInfoArray, PetscStagePerf, PetscLogStage, PetscStageInfoInit, PetscStageInfoReset, NULL)
20778f1b9b4SToby Isaac 
20878f1b9b4SToby Isaac /* --- Action --- */
20978f1b9b4SToby Isaac 
21078f1b9b4SToby Isaac /* The structure for action logging */
21178f1b9b4SToby Isaac typedef enum {
21278f1b9b4SToby Isaac   PETSC_LOG_ACTION_CREATE,
21378f1b9b4SToby Isaac   PETSC_LOG_ACTION_DESTROY,
21478f1b9b4SToby Isaac   PETSC_LOG_ACTION_BEGIN,
21578f1b9b4SToby Isaac   PETSC_LOG_ACTION_END,
21678f1b9b4SToby Isaac } PetscLogActionType;
21778f1b9b4SToby Isaac 
218b665b14eSToby Isaac typedef struct _Action {
219b665b14eSToby Isaac   PetscLogActionType action;        /* The type of execution */
220b665b14eSToby Isaac   PetscLogEvent      event;         /* The event number */
221b665b14eSToby Isaac   PetscClassId       classid;       /* The event class id */
222b665b14eSToby Isaac   PetscLogDouble     time;          /* The time of occurrence */
223b665b14eSToby Isaac   PetscLogDouble     flops;         /* The cumulative flops */
224b665b14eSToby Isaac   PetscLogDouble     mem;           /* The current memory usage */
225b665b14eSToby Isaac   PetscLogDouble     maxmem;        /* The maximum memory usage */
226b665b14eSToby Isaac   int                id1, id2, id3; /* The ids of associated objects */
227b665b14eSToby Isaac } Action;
228b665b14eSToby Isaac 
22978f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ActionArray, Action, PetscLogEvent, NULL, NULL, NULL)
23078f1b9b4SToby Isaac 
23178f1b9b4SToby Isaac /* --- Object --- */
23278f1b9b4SToby Isaac 
233b665b14eSToby Isaac /* The structure for object logging */
234b665b14eSToby Isaac typedef struct _Object {
235b665b14eSToby Isaac   PetscObject    obj;      /* The associated PetscObject */
236b665b14eSToby Isaac   int            parent;   /* The parent id */
237b665b14eSToby Isaac   PetscLogDouble mem;      /* The memory associated with the object */
238b665b14eSToby Isaac   char           name[64]; /* The object name */
239b665b14eSToby Isaac   char           info[64]; /* The information string */
240b665b14eSToby Isaac } Object;
241b665b14eSToby Isaac 
24278f1b9b4SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(ObjectArray, Object, PetscObject, NULL, NULL, NULL)
24378f1b9b4SToby Isaac 
24478f1b9b4SToby Isaac /* Map from (threadid,stage,event) to perfInfo data struct */
24578f1b9b4SToby Isaac #include <petsc/private/hashmapijk.h>
24678f1b9b4SToby Isaac 
24778f1b9b4SToby Isaac PETSC_HASH_MAP(HMapEvent, PetscHashIJKKey, PetscEventPerfInfo *, PetscHashIJKKeyHash, PetscHashIJKKeyEqual, NULL)
24878f1b9b4SToby Isaac 
24978f1b9b4SToby Isaac typedef struct _n_PetscLogHandler_Default *PetscLogHandler_Default;
25078f1b9b4SToby Isaac struct _n_PetscLogHandler_Default {
25178f1b9b4SToby Isaac   PetscLogStageInfoArray stages;
25278f1b9b4SToby Isaac   PetscSpinlock          lock;
25378f1b9b4SToby Isaac   PetscLogActionArray    petsc_actions;
25478f1b9b4SToby Isaac   PetscLogObjectArray    petsc_objects;
25578f1b9b4SToby Isaac   PetscBool              petsc_logActions;
25678f1b9b4SToby Isaac   PetscBool              petsc_logObjects;
25778f1b9b4SToby Isaac   int                    petsc_numObjectsCreated;
25878f1b9b4SToby Isaac   int                    petsc_numObjectsDestroyed;
25978f1b9b4SToby Isaac   PetscHMapEvent         eventInfoMap_th;
26078f1b9b4SToby Isaac   int                    pause_depth;
261461318ebSToby Isaac   PetscBool              use_threadsafe;
26278f1b9b4SToby Isaac };
26378f1b9b4SToby Isaac 
26478f1b9b4SToby Isaac /* --- PetscLogHandler_Default --- */
26578f1b9b4SToby Isaac 
26678f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerContextCreate_Default(PetscLogHandler_Default *def_p)
26778f1b9b4SToby Isaac {
26878f1b9b4SToby Isaac   PetscLogHandler_Default def;
26978f1b9b4SToby Isaac 
27078f1b9b4SToby Isaac   PetscFunctionBegin;
27178f1b9b4SToby Isaac   PetscCall(PetscNew(def_p));
27278f1b9b4SToby Isaac   def = *def_p;
273f4f49eeaSPierre Jolivet   PetscCall(PetscLogStageInfoArrayCreate(8, &def->stages));
274f4f49eeaSPierre Jolivet   PetscCall(PetscLogActionArrayCreate(64, &def->petsc_actions));
275f4f49eeaSPierre Jolivet   PetscCall(PetscLogObjectArrayCreate(64, &def->petsc_objects));
2763bbd2b04SJunchao Zhang   PetscCall(PetscSpinlockCreate(&def->lock));
27778f1b9b4SToby Isaac 
27878f1b9b4SToby Isaac   PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_include_actions", &def->petsc_logActions, NULL));
27978f1b9b4SToby Isaac   PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_include_objects", &def->petsc_logObjects, NULL));
280461318ebSToby Isaac   PetscCall(PetscOptionsGetBool(NULL, NULL, "-log_handler_default_use_threadsafe_events", &def->use_threadsafe, NULL));
281461318ebSToby Isaac   if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) { PetscCall(PetscHMapEventCreate(&def->eventInfoMap_th)); }
28278f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
28378f1b9b4SToby Isaac }
28478f1b9b4SToby Isaac 
28578f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDestroy_Default(PetscLogHandler h)
28678f1b9b4SToby Isaac {
28778f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
28878f1b9b4SToby Isaac 
28978f1b9b4SToby Isaac   PetscFunctionBegin;
29078f1b9b4SToby Isaac   PetscCall(PetscLogStageInfoArrayDestroy(&def->stages));
29178f1b9b4SToby Isaac   PetscCall(PetscLogActionArrayDestroy(&def->petsc_actions));
29278f1b9b4SToby Isaac   PetscCall(PetscLogObjectArrayDestroy(&def->petsc_objects));
2933bbd2b04SJunchao Zhang   PetscCall(PetscSpinlockDestroy(&def->lock));
29478f1b9b4SToby Isaac   if (def->eventInfoMap_th) {
29578f1b9b4SToby Isaac     PetscEventPerfInfo **array;
29678f1b9b4SToby Isaac     PetscInt             n, off = 0;
29778f1b9b4SToby Isaac 
29878f1b9b4SToby Isaac     PetscCall(PetscHMapEventGetSize(def->eventInfoMap_th, &n));
29978f1b9b4SToby Isaac     PetscCall(PetscMalloc1(n, &array));
30078f1b9b4SToby Isaac     PetscCall(PetscHMapEventGetVals(def->eventInfoMap_th, &off, array));
30178f1b9b4SToby Isaac     for (PetscInt i = 0; i < n; i++) PetscCall(PetscFree(array[i]));
30278f1b9b4SToby Isaac     PetscCall(PetscFree(array));
30378f1b9b4SToby Isaac     PetscCall(PetscHMapEventDestroy(&def->eventInfoMap_th));
30478f1b9b4SToby Isaac   }
305dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetEventPerfInfo_C", NULL));
3068b08f494SToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetStagePerfInfo_C", NULL));
307dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerSetLogActions_C", NULL));
308dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerSetLogObjects_C", NULL));
309dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerLogObjectState_C", NULL));
310dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerGetNumObjects_C", NULL));
311dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventDeactivatePush_C", NULL));
312dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventDeactivatePop_C", NULL));
313dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventsPause_C", NULL));
314dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerEventsResume_C", NULL));
315dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerDump_C", NULL));
316dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerStageSetVisible_C", NULL));
317dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)h, "PetscLogHandlerStageGetVisible_C", NULL));
31878f1b9b4SToby Isaac   PetscCall(PetscFree(def));
31978f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
32078f1b9b4SToby Isaac }
32178f1b9b4SToby Isaac 
32278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDefaultGetStageInfo(PetscLogHandler handler, PetscLogStage stage, PetscStagePerf **stage_info_p)
32378f1b9b4SToby Isaac {
32478f1b9b4SToby Isaac   PetscStagePerf         *stage_info = NULL;
32578f1b9b4SToby Isaac   PetscLogHandler_Default def        = (PetscLogHandler_Default)handler->data;
32678f1b9b4SToby Isaac 
32778f1b9b4SToby Isaac   PetscFunctionBegin;
32878f1b9b4SToby Isaac   PetscCall(PetscLogStageInfoArrayResize(def->stages, stage + 1));
32978f1b9b4SToby Isaac   PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info));
33078f1b9b4SToby Isaac   *stage_info_p = stage_info;
33178f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
33278f1b9b4SToby Isaac }
33378f1b9b4SToby Isaac 
334dff009beSToby Isaac static PetscErrorCode PetscLogHandlerGetEventPerfInfo_Default(PetscLogHandler handler, PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo **event_info_p)
33578f1b9b4SToby Isaac {
33678f1b9b4SToby Isaac   PetscEventPerfInfo    *event_info = NULL;
33778f1b9b4SToby Isaac   PetscStagePerf        *stage_info = NULL;
33878f1b9b4SToby Isaac   PetscLogEventPerfArray event_log;
33978f1b9b4SToby Isaac 
34078f1b9b4SToby Isaac   PetscFunctionBegin;
34178f1b9b4SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(handler->state, &stage));
34278f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info));
34378f1b9b4SToby Isaac   event_log = stage_info->eventLog;
34478f1b9b4SToby Isaac   PetscCall(PetscLogEventPerfArrayResize(event_log, event + 1));
34578f1b9b4SToby Isaac   PetscCall(PetscLogEventPerfArrayGetRef(event_log, event, &event_info));
34678f1b9b4SToby Isaac   event_info->id = event;
34778f1b9b4SToby Isaac   *event_info_p  = event_info;
34878f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
34978f1b9b4SToby Isaac }
35078f1b9b4SToby Isaac 
3518b08f494SToby Isaac static PetscErrorCode PetscLogHandlerGetStagePerfInfo_Default(PetscLogHandler handler, PetscLogStage stage, PetscEventPerfInfo **stage_info_p)
3528b08f494SToby Isaac {
3538b08f494SToby Isaac   PetscStagePerf *stage_perf_info = NULL;
3548b08f494SToby Isaac 
3558b08f494SToby Isaac   PetscFunctionBegin;
3568b08f494SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(handler->state, &stage));
3578b08f494SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_perf_info));
3588b08f494SToby Isaac   *stage_info_p = &stage_perf_info->perfInfo;
3598b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
3608b08f494SToby Isaac }
3618b08f494SToby Isaac 
36278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerDefaultGetClassPerf(PetscLogHandler handler, PetscLogStage stage, PetscLogClass clss, PetscClassPerf **class_info)
36378f1b9b4SToby Isaac {
36478f1b9b4SToby Isaac   PetscLogClassPerfArray class_log;
36578f1b9b4SToby Isaac   PetscStagePerf        *stage_info;
36678f1b9b4SToby Isaac 
36778f1b9b4SToby Isaac   PetscFunctionBegin;
36878f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info));
36978f1b9b4SToby Isaac   class_log = stage_info->classLog;
37078f1b9b4SToby Isaac   PetscCall(PetscLogClassPerfArrayResize(class_log, clss + 1));
37178f1b9b4SToby Isaac   PetscCall(PetscLogClassPerfArrayGetRef(class_log, clss, class_info));
37278f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
37378f1b9b4SToby Isaac }
37478f1b9b4SToby Isaac 
37578f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerObjectCreate_Default(PetscLogHandler h, PetscObject obj)
37678f1b9b4SToby Isaac {
37778f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
37878f1b9b4SToby Isaac   PetscLogState           state;
37978f1b9b4SToby Isaac   PetscLogStage           stage;
38078f1b9b4SToby Isaac   PetscClassPerf         *classInfo;
38178f1b9b4SToby Isaac   int                     oclass = 0;
38278f1b9b4SToby Isaac 
38378f1b9b4SToby Isaac   PetscFunctionBegin;
38478f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
38578f1b9b4SToby Isaac   PetscCall(PetscSpinlockLock(&def->lock));
38678f1b9b4SToby Isaac   /* Record stage info */
38778f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
38878f1b9b4SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, obj->classid, &oclass));
38978f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetClassPerf(h, stage, oclass, &classInfo));
39078f1b9b4SToby Isaac   classInfo->creations++;
39178f1b9b4SToby Isaac   /* Record the creation action */
39278f1b9b4SToby Isaac   if (def->petsc_logActions) {
39378f1b9b4SToby Isaac     Action new_action;
39478f1b9b4SToby Isaac 
39578f1b9b4SToby Isaac     PetscCall(PetscTime(&new_action.time));
39678f1b9b4SToby Isaac     new_action.time -= petsc_BaseTime;
39778f1b9b4SToby Isaac     new_action.action  = PETSC_LOG_ACTION_CREATE;
39878f1b9b4SToby Isaac     new_action.event   = -1;
39978f1b9b4SToby Isaac     new_action.classid = obj->classid;
40078f1b9b4SToby Isaac     new_action.id1     = obj->id;
40178f1b9b4SToby Isaac     new_action.id2     = -1;
40278f1b9b4SToby Isaac     new_action.id3     = -1;
40378f1b9b4SToby Isaac     new_action.flops   = petsc_TotalFlops;
40478f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&new_action.mem));
40578f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem));
40678f1b9b4SToby Isaac     PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action));
40778f1b9b4SToby Isaac   }
40878f1b9b4SToby Isaac   /* We don't just use obj->id to count all objects that are created
40978f1b9b4SToby Isaac      because PetscLogHandlers are objects and PetscLogObjectDestroy() will not
41078f1b9b4SToby Isaac      be called for them: the number of objects created and destroyed as counted
41178f1b9b4SToby Isaac      here and below would have an imbalance */
41278f1b9b4SToby Isaac   def->petsc_numObjectsCreated++;
41378f1b9b4SToby Isaac   /* Record the object */
41478f1b9b4SToby Isaac   if (def->petsc_logObjects) {
41578f1b9b4SToby Isaac     Object new_object;
41678f1b9b4SToby Isaac 
41778f1b9b4SToby Isaac     new_object.parent = -1;
41878f1b9b4SToby Isaac     new_object.obj    = obj;
41978f1b9b4SToby Isaac     new_object.mem    = 0;
42078f1b9b4SToby Isaac 
42178f1b9b4SToby Isaac     PetscCall(PetscMemzero(new_object.name, sizeof(new_object.name)));
42278f1b9b4SToby Isaac     PetscCall(PetscMemzero(new_object.info, sizeof(new_object.info)));
42378f1b9b4SToby Isaac     PetscAssert(obj->id >= 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Object ids from PetscObjectNewId_Internal() start at 1");
42478f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayResize(def->petsc_objects, obj->id));
42578f1b9b4SToby Isaac     PetscCall(PetscLogObjectArraySet(def->petsc_objects, obj->id - 1, new_object));
42678f1b9b4SToby Isaac   }
42778f1b9b4SToby Isaac   PetscCall(PetscSpinlockUnlock(&def->lock));
42878f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
42978f1b9b4SToby Isaac }
43078f1b9b4SToby Isaac 
43178f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerObjectDestroy_Default(PetscLogHandler h, PetscObject obj)
43278f1b9b4SToby Isaac {
43378f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
43478f1b9b4SToby Isaac   PetscLogState           state;
43578f1b9b4SToby Isaac   PetscLogStage           stage;
43678f1b9b4SToby Isaac   PetscClassPerf         *classInfo;
43778f1b9b4SToby Isaac   int                     oclass = 0;
43878f1b9b4SToby Isaac 
43978f1b9b4SToby Isaac   PetscFunctionBegin;
44078f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
44178f1b9b4SToby Isaac   /* Record stage info */
44278f1b9b4SToby Isaac   PetscCall(PetscSpinlockLock(&def->lock));
44378f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
44478f1b9b4SToby Isaac   if (stage >= 0) {
44578f1b9b4SToby Isaac     /* stage < 0 can happen if the log summary is output before some things are destroyed */
44678f1b9b4SToby Isaac     PetscCall(PetscLogStateGetClassFromClassId(state, obj->classid, &oclass));
44778f1b9b4SToby Isaac     PetscCall(PetscLogHandlerDefaultGetClassPerf(h, stage, oclass, &classInfo));
44878f1b9b4SToby Isaac     classInfo->destructions++;
44978f1b9b4SToby Isaac   }
45078f1b9b4SToby Isaac   /* Cannot Credit all ancestors with your memory because they may have already been destroyed*/
45178f1b9b4SToby Isaac   def->petsc_numObjectsDestroyed++;
45278f1b9b4SToby Isaac   /* Dynamically enlarge logging structures */
45378f1b9b4SToby Isaac   /* Record the destruction action */
45478f1b9b4SToby Isaac   if (def->petsc_logActions) {
45578f1b9b4SToby Isaac     Action new_action;
45678f1b9b4SToby Isaac 
45778f1b9b4SToby Isaac     PetscCall(PetscTime(&new_action.time));
45878f1b9b4SToby Isaac     new_action.time -= petsc_BaseTime;
45978f1b9b4SToby Isaac     new_action.event   = -1;
46078f1b9b4SToby Isaac     new_action.action  = PETSC_LOG_ACTION_DESTROY;
46178f1b9b4SToby Isaac     new_action.classid = obj->classid;
46278f1b9b4SToby Isaac     new_action.id1     = obj->id;
46378f1b9b4SToby Isaac     new_action.id2     = -1;
46478f1b9b4SToby Isaac     new_action.id3     = -1;
46578f1b9b4SToby Isaac     new_action.flops   = petsc_TotalFlops;
46678f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&new_action.mem));
46778f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem));
46878f1b9b4SToby Isaac     PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action));
46978f1b9b4SToby Isaac   }
47078f1b9b4SToby Isaac   if (def->petsc_logObjects) {
47178f1b9b4SToby Isaac     Object *obj_entry = NULL;
47278f1b9b4SToby Isaac 
47378f1b9b4SToby Isaac     PetscAssert(obj->id >= 1, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Object ids from PetscObjectNewId_Internal() start at 1");
47478f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, obj->id - 1, &obj_entry));
47578f1b9b4SToby Isaac     if (obj->name) PetscCall(PetscStrncpy(obj_entry->name, obj->name, 64));
47678f1b9b4SToby Isaac     obj_entry->obj = NULL;
47778f1b9b4SToby Isaac   }
47878f1b9b4SToby Isaac   PetscCall(PetscSpinlockUnlock(&def->lock));
47978f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
48078f1b9b4SToby Isaac }
48178f1b9b4SToby Isaac 
48278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventSync_Default(PetscLogHandler h, PetscLogEvent event, MPI_Comm comm)
48378f1b9b4SToby Isaac {
48478f1b9b4SToby Isaac   PetscLogState       state;
48578f1b9b4SToby Isaac   PetscLogEventInfo   event_info;
48678f1b9b4SToby Isaac   PetscEventPerfInfo *event_perf_info;
48778f1b9b4SToby Isaac   int                 stage;
48878f1b9b4SToby Isaac   PetscLogDouble      time = 0.0;
48978f1b9b4SToby Isaac 
49078f1b9b4SToby Isaac   PetscFunctionBegin;
4915aefd447SStefano Zampini   if (!PetscLogSyncOn || comm == MPI_COMM_NULL) PetscFunctionReturn(PETSC_SUCCESS);
49278f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
49378f1b9b4SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
49478f1b9b4SToby Isaac   if (!event_info.collective) PetscFunctionReturn(PETSC_SUCCESS);
49578f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
496dff009beSToby Isaac   PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info));
49778f1b9b4SToby Isaac   if (event_perf_info->depth > 0) PetscFunctionReturn(PETSC_SUCCESS);
49878f1b9b4SToby Isaac 
49978f1b9b4SToby Isaac   PetscCall(PetscTimeSubtract(&time));
50078f1b9b4SToby Isaac   PetscCallMPI(MPI_Barrier(comm));
50178f1b9b4SToby Isaac   PetscCall(PetscTimeAdd(&time));
50278f1b9b4SToby Isaac   event_perf_info->syncTime += time;
50378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
50478f1b9b4SToby Isaac }
50578f1b9b4SToby Isaac 
50678f1b9b4SToby Isaac static PetscErrorCode PetscLogGetStageEventPerfInfo_threaded(PetscLogHandler_Default def, PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo **eventInfo)
50778f1b9b4SToby Isaac {
50878f1b9b4SToby Isaac   PetscEventPerfInfo *leventInfo = NULL;
50978f1b9b4SToby Isaac   PetscHashIJKKey     key;
51078f1b9b4SToby Isaac 
51178f1b9b4SToby Isaac   PetscFunctionBegin;
51278f1b9b4SToby Isaac #if PetscDefined(HAVE_THREADSAFETY)
51378f1b9b4SToby Isaac   key.i = PetscLogGetTid();
51478f1b9b4SToby Isaac #else
51578f1b9b4SToby Isaac   key.i = 0;
51678f1b9b4SToby Isaac #endif
51778f1b9b4SToby Isaac   key.j = stage;
51878f1b9b4SToby Isaac   key.k = event;
51978f1b9b4SToby Isaac   PetscCall(PetscSpinlockLock(&def->lock));
52078f1b9b4SToby Isaac   PetscCall(PetscHMapEventGet(def->eventInfoMap_th, key, &leventInfo));
52178f1b9b4SToby Isaac   if (!leventInfo) {
52278f1b9b4SToby Isaac     PetscCall(PetscNew(&leventInfo));
52378f1b9b4SToby Isaac     leventInfo->id = event;
52478f1b9b4SToby Isaac     PetscCall(PetscHMapEventSet(def->eventInfoMap_th, key, leventInfo));
52578f1b9b4SToby Isaac   }
52678f1b9b4SToby Isaac   PetscCall(PetscSpinlockUnlock(&def->lock));
52778f1b9b4SToby Isaac   *eventInfo = leventInfo;
52878f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
52978f1b9b4SToby Isaac }
53078f1b9b4SToby Isaac 
53178f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_Default(PetscLogHandler h, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
53278f1b9b4SToby Isaac {
53378f1b9b4SToby Isaac   PetscLogHandler_Default def             = (PetscLogHandler_Default)h->data;
53478f1b9b4SToby Isaac   PetscEventPerfInfo     *event_perf_info = NULL;
53578f1b9b4SToby Isaac   PetscLogEventInfo       event_info;
53678f1b9b4SToby Isaac   PetscLogDouble          time;
53778f1b9b4SToby Isaac   PetscLogState           state;
53878f1b9b4SToby Isaac   PetscLogStage           stage;
53978f1b9b4SToby Isaac 
54078f1b9b4SToby Isaac   PetscFunctionBegin;
54178f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
5425aefd447SStefano Zampini   if (PetscDefined(USE_DEBUG)) {
5435aefd447SStefano Zampini     PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
5445aefd447SStefano Zampini     if (PetscUnlikely(o1)) PetscValidHeader(o1, 3);
5455aefd447SStefano Zampini     if (PetscUnlikely(o2)) PetscValidHeader(o2, 4);
5465aefd447SStefano Zampini     if (PetscUnlikely(o3)) PetscValidHeader(o3, 5);
5475aefd447SStefano Zampini     if (PetscUnlikely(o4)) PetscValidHeader(o4, 6);
5485aefd447SStefano Zampini     if (event_info.collective && o1) {
5495aefd447SStefano Zampini       PetscInt64 b1[2], b2[2];
5505aefd447SStefano Zampini 
5515aefd447SStefano Zampini       b1[0] = -o1->cidx;
5525aefd447SStefano Zampini       b1[1] = o1->cidx;
5535aefd447SStefano Zampini       PetscCall(MPIU_Allreduce(b1, b2, 2, MPIU_INT64, MPI_MAX, PetscObjectComm(o1)));
5545aefd447SStefano Zampini       PetscCheck(-b2[0] == b2[1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Collective event %s not called collectively %" PetscInt64_FMT " != %" PetscInt64_FMT, event_info.name, b1[1], b2[1]);
5555aefd447SStefano Zampini     }
5565aefd447SStefano Zampini   }
55778f1b9b4SToby Isaac   /* Synchronization */
55878f1b9b4SToby Isaac   PetscCall(PetscLogHandlerEventSync_Default(h, event, PetscObjectComm(o1)));
55978f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
56078f1b9b4SToby Isaac   if (def->pause_depth > 0) stage = 0; // in pause-mode, all events run on the main stage
561461318ebSToby Isaac   if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) {
56278f1b9b4SToby Isaac     PetscCall(PetscLogGetStageEventPerfInfo_threaded(def, stage, event, &event_perf_info));
56378f1b9b4SToby Isaac     if (event_perf_info->depth == 0) { PetscCall(PetscEventPerfInfoInit(event_perf_info)); }
56478f1b9b4SToby Isaac   } else {
565dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info));
56678f1b9b4SToby Isaac   }
56778f1b9b4SToby Isaac   PetscCheck(event_perf_info->depth >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to begin a paused event, this is not allowed");
56878f1b9b4SToby Isaac   event_perf_info->depth++;
56978f1b9b4SToby Isaac   /* Check for double counting */
57078f1b9b4SToby Isaac   if (event_perf_info->depth > 1) PetscFunctionReturn(PETSC_SUCCESS);
57178f1b9b4SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
57278f1b9b4SToby Isaac   /* Log the performance info */
57378f1b9b4SToby Isaac   event_perf_info->count++;
57478f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
57578f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoTic(event_perf_info, time, PetscLogMemory, (int)event));
57678f1b9b4SToby Isaac   if (def->petsc_logActions) {
57778f1b9b4SToby Isaac     PetscLogDouble curTime;
57878f1b9b4SToby Isaac     Action         new_action;
57978f1b9b4SToby Isaac 
58078f1b9b4SToby Isaac     PetscCall(PetscTime(&curTime));
58178f1b9b4SToby Isaac     new_action.time    = curTime - petsc_BaseTime;
58278f1b9b4SToby Isaac     new_action.action  = PETSC_LOG_ACTION_BEGIN;
58378f1b9b4SToby Isaac     new_action.event   = event;
58478f1b9b4SToby Isaac     new_action.classid = event_info.classid;
58578f1b9b4SToby Isaac     new_action.id1     = o1 ? o1->id : -1;
58678f1b9b4SToby Isaac     new_action.id2     = o2 ? o2->id : -1;
58778f1b9b4SToby Isaac     new_action.id3     = o3 ? o3->id : -1;
58878f1b9b4SToby Isaac     new_action.flops   = petsc_TotalFlops;
58978f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&new_action.mem));
59078f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem));
59178f1b9b4SToby Isaac     PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action));
59278f1b9b4SToby Isaac   }
59378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
59478f1b9b4SToby Isaac }
59578f1b9b4SToby Isaac 
59678f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_Default(PetscLogHandler h, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
59778f1b9b4SToby Isaac {
59878f1b9b4SToby Isaac   PetscLogHandler_Default def             = (PetscLogHandler_Default)h->data;
59978f1b9b4SToby Isaac   PetscEventPerfInfo     *event_perf_info = NULL;
60078f1b9b4SToby Isaac   PetscLogDouble          time;
60178f1b9b4SToby Isaac   PetscLogState           state;
60278f1b9b4SToby Isaac   int                     stage;
6035aefd447SStefano Zampini   PetscLogEventInfo       event_info;
60478f1b9b4SToby Isaac 
60578f1b9b4SToby Isaac   PetscFunctionBegin;
60678f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
6075aefd447SStefano Zampini   if (PetscDefined(USE_DEBUG)) {
6085aefd447SStefano Zampini     PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
6095aefd447SStefano Zampini     if (PetscUnlikely(o1)) PetscValidHeader(o1, 3);
6105aefd447SStefano Zampini     if (PetscUnlikely(o2)) PetscValidHeader(o2, 4);
6115aefd447SStefano Zampini     if (PetscUnlikely(o3)) PetscValidHeader(o3, 5);
6125aefd447SStefano Zampini     if (PetscUnlikely(o4)) PetscValidHeader(o4, 6);
6135aefd447SStefano Zampini     if (event_info.collective && o1) {
6145aefd447SStefano Zampini       PetscInt64 b1[2], b2[2];
6155aefd447SStefano Zampini 
6165aefd447SStefano Zampini       b1[0] = -o1->cidx;
6175aefd447SStefano Zampini       b1[1] = o1->cidx;
6185aefd447SStefano Zampini       PetscCall(MPIU_Allreduce(b1, b2, 2, MPIU_INT64, MPI_MAX, PetscObjectComm(o1)));
6195aefd447SStefano Zampini       PetscCheck(-b2[0] == b2[1], PETSC_COMM_SELF, PETSC_ERR_PLIB, "Collective event %s not called collectively %" PetscInt64_FMT " != %" PetscInt64_FMT, event_info.name, b1[1], b2[1]);
6205aefd447SStefano Zampini     }
6215aefd447SStefano Zampini   }
62278f1b9b4SToby Isaac   if (def->petsc_logActions) {
62378f1b9b4SToby Isaac     PetscLogDouble curTime;
62478f1b9b4SToby Isaac     Action         new_action;
62578f1b9b4SToby Isaac 
62678f1b9b4SToby Isaac     PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
62778f1b9b4SToby Isaac     PetscCall(PetscTime(&curTime));
62878f1b9b4SToby Isaac     new_action.time    = curTime - petsc_BaseTime;
62978f1b9b4SToby Isaac     new_action.action  = PETSC_LOG_ACTION_END;
63078f1b9b4SToby Isaac     new_action.event   = event;
63178f1b9b4SToby Isaac     new_action.classid = event_info.classid;
63278f1b9b4SToby Isaac     new_action.id1     = o1 ? o1->id : -1;
63378f1b9b4SToby Isaac     new_action.id2     = o2 ? o2->id : -2;
63478f1b9b4SToby Isaac     new_action.id3     = o3 ? o3->id : -3;
63578f1b9b4SToby Isaac     new_action.flops   = petsc_TotalFlops;
63678f1b9b4SToby Isaac     PetscCall(PetscMallocGetCurrentUsage(&new_action.mem));
63778f1b9b4SToby Isaac     PetscCall(PetscMallocGetMaximumUsage(&new_action.maxmem));
63878f1b9b4SToby Isaac     PetscCall(PetscLogActionArrayPush(def->petsc_actions, new_action));
63978f1b9b4SToby Isaac   }
64078f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
64178f1b9b4SToby Isaac   if (def->pause_depth > 0) stage = 0; // all events run on the main stage in pause-mode
642461318ebSToby Isaac   if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) {
64378f1b9b4SToby Isaac     PetscCall(PetscLogGetStageEventPerfInfo_threaded(def, stage, event, &event_perf_info));
64478f1b9b4SToby Isaac   } else {
645dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info));
64678f1b9b4SToby Isaac   }
64778f1b9b4SToby Isaac   PetscCheck(event_perf_info->depth > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to end paused event, not allowed");
64878f1b9b4SToby Isaac   event_perf_info->depth--;
64978f1b9b4SToby Isaac   /* Check for double counting */
65078f1b9b4SToby Isaac   if (event_perf_info->depth > 0) PetscFunctionReturn(PETSC_SUCCESS);
65178f1b9b4SToby Isaac   else PetscCheck(event_perf_info->depth == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Logging event had unbalanced begin/end pairs");
65278f1b9b4SToby Isaac 
65378f1b9b4SToby Isaac   /* Log performance info */
65478f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
65578f1b9b4SToby Isaac   PetscCall(PetscEventPerfInfoToc(event_perf_info, time, PetscLogMemory, (int)event));
656461318ebSToby Isaac   if (PetscDefined(HAVE_THREADSAFETY) || def->use_threadsafe) {
65778f1b9b4SToby Isaac     PetscEventPerfInfo *event_perf_info_global;
65878f1b9b4SToby Isaac     PetscCall(PetscSpinlockLock(&def->lock));
659dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info_global));
66078f1b9b4SToby Isaac     PetscCall(PetscEventPerfInfoAdd_Internal(event_perf_info, event_perf_info_global));
66178f1b9b4SToby Isaac     PetscCall(PetscSpinlockUnlock(&def->lock));
66278f1b9b4SToby Isaac   }
66378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66478f1b9b4SToby Isaac }
66578f1b9b4SToby Isaac 
666dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventDeactivatePush_Default(PetscLogHandler h, PetscLogStage stage, PetscLogEvent event)
66778f1b9b4SToby Isaac {
66878f1b9b4SToby Isaac   PetscEventPerfInfo *event_perf_info;
66978f1b9b4SToby Isaac 
67078f1b9b4SToby Isaac   PetscFunctionBegin;
67178f1b9b4SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage));
672dff009beSToby Isaac   PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info));
67378f1b9b4SToby Isaac   event_perf_info->depth++;
67478f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
67578f1b9b4SToby Isaac }
67678f1b9b4SToby Isaac 
677dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventDeactivatePop_Default(PetscLogHandler h, PetscLogStage stage, PetscLogEvent event)
67878f1b9b4SToby Isaac {
67978f1b9b4SToby Isaac   PetscEventPerfInfo *event_perf_info;
68078f1b9b4SToby Isaac 
68178f1b9b4SToby Isaac   PetscFunctionBegin;
68278f1b9b4SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage));
683dff009beSToby Isaac   PetscCall(PetscLogHandlerGetEventPerfInfo_Default(h, stage, event, &event_perf_info));
68478f1b9b4SToby Isaac   event_perf_info->depth--;
68578f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
68678f1b9b4SToby Isaac }
68778f1b9b4SToby Isaac 
688dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventsPause_Default(PetscLogHandler h)
68978f1b9b4SToby Isaac {
69078f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
69178f1b9b4SToby Isaac   PetscLogDouble          time;
69278f1b9b4SToby Isaac   PetscInt                num_stages;
69378f1b9b4SToby Isaac 
69478f1b9b4SToby Isaac   PetscFunctionBegin;
69578f1b9b4SToby Isaac   if (def->pause_depth++ > 0) PetscFunctionReturn(PETSC_SUCCESS);
69678f1b9b4SToby Isaac   PetscCall(PetscLogStageInfoArrayGetSize(def->stages, &num_stages, NULL));
69778f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
69878f1b9b4SToby Isaac   for (PetscInt stage = 0; stage < num_stages; stage++) {
69978f1b9b4SToby Isaac     PetscStagePerf *stage_info = NULL;
70078f1b9b4SToby Isaac     PetscInt        num_events;
70178f1b9b4SToby Isaac 
70278f1b9b4SToby Isaac     PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info));
70378f1b9b4SToby Isaac     PetscCall(PetscLogEventPerfArrayGetSize(stage_info->eventLog, &num_events, NULL));
70478f1b9b4SToby Isaac     for (PetscInt event = 0; event < num_events; event++) {
70578f1b9b4SToby Isaac       PetscEventPerfInfo *event_info = NULL;
70678f1b9b4SToby Isaac       PetscCall(PetscLogEventPerfArrayGetRef(stage_info->eventLog, event, &event_info));
70778f1b9b4SToby Isaac       if (event_info->depth > 0) {
70878f1b9b4SToby Isaac         event_info->depth *= -1;
70978f1b9b4SToby Isaac         PetscCall(PetscEventPerfInfoPause(event_info, time, PetscLogMemory, event));
71078f1b9b4SToby Isaac       }
71178f1b9b4SToby Isaac     }
71278f1b9b4SToby Isaac     if (stage > 0 && stage_info->perfInfo.depth > 0) {
71378f1b9b4SToby Isaac       stage_info->perfInfo.depth *= -1;
71478f1b9b4SToby Isaac       PetscCall(PetscEventPerfInfoPause(&stage_info->perfInfo, time, PetscLogMemory, -(stage + 2)));
71578f1b9b4SToby Isaac     }
71678f1b9b4SToby Isaac   }
71778f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
71878f1b9b4SToby Isaac }
71978f1b9b4SToby Isaac 
720dff009beSToby Isaac static PetscErrorCode PetscLogHandlerEventsResume_Default(PetscLogHandler h)
72178f1b9b4SToby Isaac {
72278f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
72378f1b9b4SToby Isaac   PetscLogDouble          time;
72478f1b9b4SToby Isaac   PetscInt                num_stages;
72578f1b9b4SToby Isaac 
72678f1b9b4SToby Isaac   PetscFunctionBegin;
72778f1b9b4SToby Isaac   if (--def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS);
72878f1b9b4SToby Isaac   PetscCall(PetscLogStageInfoArrayGetSize(def->stages, &num_stages, NULL));
72978f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
73078f1b9b4SToby Isaac   for (PetscInt stage = 0; stage < num_stages; stage++) {
73178f1b9b4SToby Isaac     PetscStagePerf *stage_info = NULL;
73278f1b9b4SToby Isaac     PetscInt        num_events;
73378f1b9b4SToby Isaac 
73478f1b9b4SToby Isaac     PetscCall(PetscLogStageInfoArrayGetRef(def->stages, stage, &stage_info));
73578f1b9b4SToby Isaac     PetscCall(PetscLogEventPerfArrayGetSize(stage_info->eventLog, &num_events, NULL));
73678f1b9b4SToby Isaac     for (PetscInt event = 0; event < num_events; event++) {
73778f1b9b4SToby Isaac       PetscEventPerfInfo *event_info = NULL;
73878f1b9b4SToby Isaac       PetscCall(PetscLogEventPerfArrayGetRef(stage_info->eventLog, event, &event_info));
73978f1b9b4SToby Isaac       if (event_info->depth < 0) {
74078f1b9b4SToby Isaac         event_info->depth *= -1;
74178f1b9b4SToby Isaac         PetscCall(PetscEventPerfInfoResume(event_info, time, PetscLogMemory, event));
74278f1b9b4SToby Isaac       }
74378f1b9b4SToby Isaac     }
74478f1b9b4SToby Isaac     if (stage > 0 && stage_info->perfInfo.depth < 0) {
74578f1b9b4SToby Isaac       stage_info->perfInfo.depth *= -1;
74678f1b9b4SToby Isaac       PetscCall(PetscEventPerfInfoResume(&stage_info->perfInfo, time, PetscLogMemory, -(stage + 2)));
74778f1b9b4SToby Isaac     }
74878f1b9b4SToby Isaac   }
74978f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
75078f1b9b4SToby Isaac }
75178f1b9b4SToby Isaac 
75278f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerStagePush_Default(PetscLogHandler h, PetscLogStage new_stage)
75378f1b9b4SToby Isaac {
75478f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
75578f1b9b4SToby Isaac   PetscLogDouble          time;
75678f1b9b4SToby Isaac   PetscLogState           state;
75778f1b9b4SToby Isaac   PetscLogStage           current_stage;
75878f1b9b4SToby Isaac   PetscStagePerf         *new_stage_info;
75978f1b9b4SToby Isaac 
76078f1b9b4SToby Isaac   PetscFunctionBegin;
76178f1b9b4SToby Isaac   if (def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS);
76278f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
76378f1b9b4SToby Isaac   current_stage = state->current_stage;
76478f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(h, new_stage, &new_stage_info));
76578f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
76678f1b9b4SToby Isaac 
76778f1b9b4SToby Isaac   /* Record flops/time of previous stage */
76878f1b9b4SToby Isaac   if (current_stage >= 0) {
76978f1b9b4SToby Isaac     if (PetscBTLookup(state->active, current_stage)) {
77078f1b9b4SToby Isaac       PetscStagePerf *current_stage_info;
77178f1b9b4SToby Isaac       PetscCall(PetscLogHandlerDefaultGetStageInfo(h, current_stage, &current_stage_info));
77278f1b9b4SToby Isaac       PetscCall(PetscEventPerfInfoToc(&current_stage_info->perfInfo, time, PetscLogMemory, (int)-(current_stage + 2)));
77378f1b9b4SToby Isaac     }
77478f1b9b4SToby Isaac   }
77578f1b9b4SToby Isaac   new_stage_info->used = PETSC_TRUE;
77678f1b9b4SToby Isaac   new_stage_info->perfInfo.count++;
77778f1b9b4SToby Isaac   new_stage_info->perfInfo.depth++;
77878f1b9b4SToby Isaac   /* Subtract current quantities so that we obtain the difference when we pop */
77978f1b9b4SToby Isaac   if (PetscBTLookup(state->active, new_stage)) PetscCall(PetscEventPerfInfoTic(&new_stage_info->perfInfo, time, PetscLogMemory, (int)-(new_stage + 2)));
78078f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
78178f1b9b4SToby Isaac }
78278f1b9b4SToby Isaac 
78378f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerStagePop_Default(PetscLogHandler h, PetscLogStage old_stage)
78478f1b9b4SToby Isaac {
78578f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)h->data;
78678f1b9b4SToby Isaac   PetscLogStage           current_stage;
78778f1b9b4SToby Isaac   PetscStagePerf         *old_stage_info;
78878f1b9b4SToby Isaac   PetscLogState           state;
78978f1b9b4SToby Isaac   PetscLogDouble          time;
79078f1b9b4SToby Isaac 
79178f1b9b4SToby Isaac   PetscFunctionBegin;
79278f1b9b4SToby Isaac   if (def->pause_depth > 0) PetscFunctionReturn(PETSC_SUCCESS);
79378f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(h, &state));
79478f1b9b4SToby Isaac   current_stage = state->current_stage;
79578f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(h, old_stage, &old_stage_info));
79678f1b9b4SToby Isaac   PetscCall(PetscTime(&time));
79778f1b9b4SToby Isaac   old_stage_info->perfInfo.depth--;
79878f1b9b4SToby Isaac   if (PetscBTLookup(state->active, old_stage)) { PetscCall(PetscEventPerfInfoToc(&old_stage_info->perfInfo, time, PetscLogMemory, (int)-(old_stage + 2))); }
79978f1b9b4SToby Isaac   if (current_stage >= 0) {
80078f1b9b4SToby Isaac     if (PetscBTLookup(state->active, current_stage)) {
80178f1b9b4SToby Isaac       PetscStagePerf *current_stage_info;
80278f1b9b4SToby Isaac       PetscCall(PetscLogHandlerDefaultGetStageInfo(h, current_stage, &current_stage_info));
80378f1b9b4SToby Isaac       PetscCall(PetscEventPerfInfoTic(&current_stage_info->perfInfo, time, PetscLogMemory, (int)-(current_stage + 2)));
80478f1b9b4SToby Isaac     }
80578f1b9b4SToby Isaac   }
80678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
80778f1b9b4SToby Isaac }
80878f1b9b4SToby Isaac 
809dff009beSToby Isaac static PetscErrorCode PetscLogHandlerStageSetVisible_Default(PetscLogHandler h, PetscLogStage stage, PetscBool is_visible)
81078f1b9b4SToby Isaac {
81178f1b9b4SToby Isaac   PetscStagePerf *stage_info;
81278f1b9b4SToby Isaac 
81378f1b9b4SToby Isaac   PetscFunctionBegin;
81478f1b9b4SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage));
81578f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(h, stage, &stage_info));
81678f1b9b4SToby Isaac   stage_info->perfInfo.visible = is_visible;
81778f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
81878f1b9b4SToby Isaac }
81978f1b9b4SToby Isaac 
820dff009beSToby Isaac static PetscErrorCode PetscLogHandlerStageGetVisible_Default(PetscLogHandler h, PetscLogStage stage, PetscBool *is_visible)
82178f1b9b4SToby Isaac {
82278f1b9b4SToby Isaac   PetscStagePerf *stage_info;
82378f1b9b4SToby Isaac 
82478f1b9b4SToby Isaac   PetscFunctionBegin;
82578f1b9b4SToby Isaac   if (stage < 0) PetscCall(PetscLogStateGetCurrentStage(h->state, &stage));
82678f1b9b4SToby Isaac   PetscCall(PetscLogHandlerDefaultGetStageInfo(h, stage, &stage_info));
82778f1b9b4SToby Isaac   *is_visible = stage_info->perfInfo.visible;
82878f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
82978f1b9b4SToby Isaac }
83078f1b9b4SToby Isaac 
831dff009beSToby Isaac static PetscErrorCode PetscLogHandlerSetLogActions_Default(PetscLogHandler handler, PetscBool flag)
83278f1b9b4SToby Isaac {
83378f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
83478f1b9b4SToby Isaac 
83578f1b9b4SToby Isaac   PetscFunctionBegin;
83678f1b9b4SToby Isaac   def->petsc_logActions = flag;
83778f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
83878f1b9b4SToby Isaac }
83978f1b9b4SToby Isaac 
840dff009beSToby Isaac static PetscErrorCode PetscLogHandlerSetLogObjects_Default(PetscLogHandler handler, PetscBool flag)
84178f1b9b4SToby Isaac {
84278f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
84378f1b9b4SToby Isaac 
84478f1b9b4SToby Isaac   PetscFunctionBegin;
84578f1b9b4SToby Isaac   def->petsc_logObjects = flag;
84678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
84778f1b9b4SToby Isaac }
84878f1b9b4SToby Isaac 
849dff009beSToby Isaac static PetscErrorCode PetscLogHandlerLogObjectState_Default(PetscLogHandler handler, PetscObject obj, const char format[], va_list Argp)
85078f1b9b4SToby Isaac {
85178f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
85278f1b9b4SToby Isaac   size_t                  fullLength;
85378f1b9b4SToby Isaac 
85478f1b9b4SToby Isaac   PetscFunctionBegin;
85578f1b9b4SToby Isaac   if (def->petsc_logObjects) {
85678f1b9b4SToby Isaac     Object *obj_entry = NULL;
85778f1b9b4SToby Isaac 
85878f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, obj->id - 1, &obj_entry));
85978f1b9b4SToby Isaac     PetscCall(PetscVSNPrintf(obj_entry->info, 64, format, &fullLength, Argp));
86078f1b9b4SToby Isaac   }
86178f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
86278f1b9b4SToby Isaac }
86378f1b9b4SToby Isaac 
864dff009beSToby Isaac static PetscErrorCode PetscLogHandlerGetNumObjects_Default(PetscLogHandler handler, PetscInt *num_objects)
86578f1b9b4SToby Isaac {
86678f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
86778f1b9b4SToby Isaac 
86878f1b9b4SToby Isaac   PetscFunctionBegin;
86978f1b9b4SToby Isaac   PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, num_objects, NULL));
87078f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
87178f1b9b4SToby Isaac }
87278f1b9b4SToby Isaac 
873dff009beSToby Isaac static PetscErrorCode PetscLogHandlerDump_Default(PetscLogHandler handler, const char sname[])
87478f1b9b4SToby Isaac {
87578f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
87678f1b9b4SToby Isaac   FILE                   *fd;
87778f1b9b4SToby Isaac   char                    file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN];
87878f1b9b4SToby Isaac   PetscLogDouble          flops, _TotalTime;
87978f1b9b4SToby Isaac   PetscMPIInt             rank;
88078f1b9b4SToby Isaac   int                     curStage;
88178f1b9b4SToby Isaac   PetscLogState           state;
88278f1b9b4SToby Isaac   PetscInt                num_events;
88378f1b9b4SToby Isaac   PetscLogEvent           event;
88478f1b9b4SToby Isaac 
88578f1b9b4SToby Isaac   PetscFunctionBegin;
88678f1b9b4SToby Isaac   /* Calculate the total elapsed time */
88778f1b9b4SToby Isaac   PetscCall(PetscTime(&_TotalTime));
88878f1b9b4SToby Isaac   _TotalTime -= petsc_BaseTime;
88978f1b9b4SToby Isaac   /* Open log file */
89078f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)handler), &rank));
89178f1b9b4SToby Isaac   PetscCall(PetscSNPrintf(file, PETSC_STATIC_ARRAY_LENGTH(file), "%s.%d", sname && sname[0] ? sname : "Log", rank));
89278f1b9b4SToby Isaac   PetscCall(PetscFixFilename(file, fname));
89378f1b9b4SToby Isaac   PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, "w", &fd));
89478f1b9b4SToby Isaac   PetscCheck(!(rank == 0) || !(!fd), PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname);
89578f1b9b4SToby Isaac   /* Output totals */
89678f1b9b4SToby Isaac   PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Total Flop %14e %16.8e\n", petsc_TotalFlops, _TotalTime));
89778f1b9b4SToby Isaac   PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Clock Resolution %g\n", 0.0));
89878f1b9b4SToby Isaac   /* Output actions */
89978f1b9b4SToby Isaac   if (def->petsc_logActions) {
90078f1b9b4SToby Isaac     PetscInt num_actions;
90178f1b9b4SToby Isaac     PetscCall(PetscLogActionArrayGetSize(def->petsc_actions, &num_actions, NULL));
90278f1b9b4SToby Isaac     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Actions accomplished %d\n", (int)num_actions));
90378f1b9b4SToby Isaac     for (int a = 0; a < num_actions; a++) {
90478f1b9b4SToby Isaac       Action *action;
90578f1b9b4SToby Isaac 
90678f1b9b4SToby Isaac       PetscCall(PetscLogActionArrayGetRef(def->petsc_actions, a, &action));
90778f1b9b4SToby Isaac       PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "%g %d %d %d %d %d %d %g %g %g\n", action->time, action->action, (int)action->event, (int)action->classid, action->id1, action->id2, action->id3, action->flops, action->mem, action->maxmem));
90878f1b9b4SToby Isaac     }
90978f1b9b4SToby Isaac   }
91078f1b9b4SToby Isaac   /* Output objects */
91178f1b9b4SToby Isaac   if (def->petsc_logObjects) {
91278f1b9b4SToby Isaac     PetscInt num_objects;
91378f1b9b4SToby Isaac 
91478f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL));
91578f1b9b4SToby Isaac     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Objects created %d destroyed %d\n", def->petsc_numObjectsCreated, def->petsc_numObjectsDestroyed));
91678f1b9b4SToby Isaac     for (int o = 0; o < num_objects; o++) {
91778f1b9b4SToby Isaac       Object *object = NULL;
91878f1b9b4SToby Isaac 
91978f1b9b4SToby Isaac       PetscCall(PetscLogObjectArrayGetRef(def->petsc_objects, o, &object));
92078f1b9b4SToby Isaac       if (object->parent != -1) continue; // object with this id wasn't logged, probably a PetscLogHandler
92178f1b9b4SToby Isaac       PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Parent ID: %d Memory: %d\n", object->parent, (int)object->mem));
92278f1b9b4SToby Isaac       if (!object->name[0]) {
92378f1b9b4SToby Isaac         PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "No Name\n"));
92478f1b9b4SToby Isaac       } else {
92578f1b9b4SToby Isaac         PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Name: %s\n", object->name));
92678f1b9b4SToby Isaac       }
92778f1b9b4SToby Isaac       if (!object->info[0]) {
92878f1b9b4SToby Isaac         PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "No Info\n"));
92978f1b9b4SToby Isaac       } else {
93078f1b9b4SToby Isaac         PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Info: %s\n", object->info));
93178f1b9b4SToby Isaac       }
93278f1b9b4SToby Isaac     }
93378f1b9b4SToby Isaac   }
93478f1b9b4SToby Isaac   /* Output events */
93578f1b9b4SToby Isaac   PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Event log:\n"));
93678f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(handler, &state));
93778f1b9b4SToby Isaac   PetscCall(PetscLogStateGetNumEvents(state, &num_events));
93878f1b9b4SToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &curStage));
93978f1b9b4SToby Isaac   for (event = 0; event < num_events; event++) {
94078f1b9b4SToby Isaac     PetscEventPerfInfo *event_info;
94178f1b9b4SToby Isaac 
942dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, curStage, event, &event_info));
94378f1b9b4SToby Isaac     if (event_info->time != 0.0) flops = event_info->flops / event_info->time;
94478f1b9b4SToby Isaac     else flops = 0.0;
94578f1b9b4SToby Isaac     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "%d %16d %16g %16g %16g\n", event, event_info->count, event_info->flops, event_info->time, flops));
94678f1b9b4SToby Isaac   }
94778f1b9b4SToby Isaac   PetscCall(PetscFClose(PETSC_COMM_SELF, fd));
94878f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
94978f1b9b4SToby Isaac }
95078f1b9b4SToby Isaac 
95178f1b9b4SToby Isaac /*
95278f1b9b4SToby Isaac   PetscLogView_Detailed - Each process prints the times for its own events
95378f1b9b4SToby Isaac 
95478f1b9b4SToby Isaac */
95578f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_Detailed(PetscLogHandler handler, PetscViewer viewer)
95678f1b9b4SToby Isaac {
95778f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
95878f1b9b4SToby Isaac   PetscLogDouble          locTotalTime, numRed, maxMem;
95978f1b9b4SToby Isaac   PetscInt                numStages, numEvents;
96078f1b9b4SToby Isaac   MPI_Comm                comm = PetscObjectComm((PetscObject)viewer);
96178f1b9b4SToby Isaac   PetscMPIInt             rank, size;
96278f1b9b4SToby Isaac   PetscLogGlobalNames     global_stages, global_events;
96378f1b9b4SToby Isaac   PetscLogState           state;
96478f1b9b4SToby Isaac   PetscEventPerfInfo      zero_info;
96578f1b9b4SToby Isaac 
96678f1b9b4SToby Isaac   PetscFunctionBegin;
96778f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(handler, &state));
96878f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_size(comm, &size));
96978f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_rank(comm, &rank));
97078f1b9b4SToby Isaac   /* Must preserve reduction count before we go on */
97178f1b9b4SToby Isaac   numRed = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct;
97278f1b9b4SToby Isaac   /* Get the total elapsed time */
97378f1b9b4SToby Isaac   PetscCall(PetscTime(&locTotalTime));
97478f1b9b4SToby Isaac   locTotalTime -= petsc_BaseTime;
97578f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "size = %d\n", size));
97678f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalTimes = {}\n"));
97778f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMessages = {}\n"));
97878f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMessageLens = {}\n"));
97978f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalReductions = {}\n"));
98078f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalFlop = {}\n"));
98178f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalObjects = {}\n"));
98278f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "LocalMemory = {}\n"));
98378f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages));
98478f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events));
98578f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages));
98678f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents));
98778f1b9b4SToby Isaac   PetscCall(PetscMemzero(&zero_info, sizeof(zero_info)));
98878f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPrintf(viewer, "Stages = {}\n"));
98978f1b9b4SToby Isaac   for (PetscInt stage = 0; stage < numStages; stage++) {
99078f1b9b4SToby Isaac     PetscInt    stage_id;
99178f1b9b4SToby Isaac     const char *stage_name;
99278f1b9b4SToby Isaac 
99378f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
99478f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
99578f1b9b4SToby Isaac     PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"] = {}\n", stage_name));
99678f1b9b4SToby Isaac     PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"][\"summary\"] = {}\n", stage_name));
99778f1b9b4SToby Isaac     for (PetscInt event = 0; event < numEvents; event++) {
99878f1b9b4SToby Isaac       PetscEventPerfInfo *eventInfo = &zero_info;
99978f1b9b4SToby Isaac       PetscBool           is_zero   = PETSC_FALSE;
100078f1b9b4SToby Isaac       PetscInt            event_id;
100178f1b9b4SToby Isaac       const char         *event_name;
100278f1b9b4SToby Isaac 
100378f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id));
100478f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name));
1005dff009beSToby Isaac       if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo));
100678f1b9b4SToby Isaac       is_zero = eventInfo->count == 0 ? PETSC_TRUE : PETSC_FALSE;
100778f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPIU_BOOL, MPI_LAND, comm));
100878f1b9b4SToby Isaac       if (!is_zero) { PetscCall(PetscViewerASCIIPrintf(viewer, "Stages[\"%s\"][\"%s\"] = {}\n", stage_name, event_name)); }
100978f1b9b4SToby Isaac     }
101078f1b9b4SToby Isaac   }
101178f1b9b4SToby Isaac   PetscCall(PetscMallocGetMaximumUsage(&maxMem));
101278f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
101378f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalTimes[%d] = %g\n", rank, locTotalTime));
101478f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMessages[%d] = %g\n", rank, (petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct)));
101578f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMessageLens[%d] = %g\n", rank, (petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len)));
101678f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalReductions[%d] = %g\n", rank, numRed));
101778f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalFlop[%d] = %g\n", rank, petsc_TotalFlops));
101878f1b9b4SToby Isaac   {
101978f1b9b4SToby Isaac     PetscInt num_objects;
102078f1b9b4SToby Isaac 
102178f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL));
102278f1b9b4SToby Isaac     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalObjects[%d] = %d\n", rank, (int)num_objects));
102378f1b9b4SToby Isaac   }
102478f1b9b4SToby Isaac   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "LocalMemory[%d] = %g\n", rank, maxMem));
102578f1b9b4SToby Isaac   PetscCall(PetscViewerFlush(viewer));
102678f1b9b4SToby Isaac   for (PetscInt stage = 0; stage < numStages; stage++) {
102778f1b9b4SToby Isaac     PetscEventPerfInfo *stage_perf_info = &zero_info;
102878f1b9b4SToby Isaac     PetscInt            stage_id;
102978f1b9b4SToby Isaac     const char         *stage_name;
103078f1b9b4SToby Isaac 
103178f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
103278f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
103378f1b9b4SToby Isaac     if (stage_id >= 0) {
103478f1b9b4SToby Isaac       PetscStagePerf *stage_info;
103578f1b9b4SToby Isaac       PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_info));
103678f1b9b4SToby Isaac       stage_perf_info = &stage_info->perfInfo;
103778f1b9b4SToby Isaac     }
103878f1b9b4SToby 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,
103978f1b9b4SToby Isaac                                                  stage_perf_info->numMessages, stage_perf_info->messageLength, stage_perf_info->numReductions, stage_perf_info->flops));
104078f1b9b4SToby Isaac     for (PetscInt event = 0; event < numEvents; event++) {
104178f1b9b4SToby Isaac       PetscEventPerfInfo *eventInfo = &zero_info;
104278f1b9b4SToby Isaac       PetscBool           is_zero   = PETSC_FALSE;
104378f1b9b4SToby Isaac       PetscInt            event_id;
104478f1b9b4SToby Isaac       const char         *event_name;
104578f1b9b4SToby Isaac 
104678f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id));
104778f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name));
1048dff009beSToby Isaac       if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo));
104978f1b9b4SToby Isaac       is_zero = eventInfo->count == 0 ? PETSC_TRUE : PETSC_FALSE;
105078f1b9b4SToby Isaac       PetscCall(PetscMemcmp(eventInfo, &zero_info, sizeof(zero_info), &is_zero));
105178f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPIU_BOOL, MPI_LAND, comm));
105278f1b9b4SToby Isaac       if (!is_zero) {
105378f1b9b4SToby 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,
105478f1b9b4SToby Isaac                                                      eventInfo->count, eventInfo->time, eventInfo->syncTime, eventInfo->numMessages, eventInfo->messageLength, eventInfo->numReductions, eventInfo->flops));
105578f1b9b4SToby Isaac         if (eventInfo->dof[0] >= 0.) {
105678f1b9b4SToby Isaac           PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", \"dof\" : ["));
105778f1b9b4SToby Isaac           for (PetscInt d = 0; d < 8; ++d) {
105878f1b9b4SToby Isaac             if (d > 0) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", "));
105978f1b9b4SToby Isaac             PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%g", eventInfo->dof[d]));
106078f1b9b4SToby Isaac           }
106178f1b9b4SToby Isaac           PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "]"));
106278f1b9b4SToby Isaac           PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", \"error\" : ["));
106378f1b9b4SToby Isaac           for (PetscInt e = 0; e < 8; ++e) {
106478f1b9b4SToby Isaac             if (e > 0) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ", "));
106578f1b9b4SToby Isaac             PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "%g", eventInfo->errors[e]));
106678f1b9b4SToby Isaac           }
106778f1b9b4SToby Isaac           PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "]"));
106878f1b9b4SToby Isaac         }
106978f1b9b4SToby Isaac       }
107078f1b9b4SToby Isaac       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "}\n"));
107178f1b9b4SToby Isaac     }
107278f1b9b4SToby Isaac   }
107378f1b9b4SToby Isaac   PetscCall(PetscViewerFlush(viewer));
107478f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPopSynchronized(viewer));
107578f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_events));
107678f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_stages));
107778f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
107878f1b9b4SToby Isaac }
107978f1b9b4SToby Isaac 
108078f1b9b4SToby Isaac /*
108178f1b9b4SToby Isaac   PetscLogView_CSV - Each process prints the times for its own events in Comma-Separated Value Format
108278f1b9b4SToby Isaac */
108378f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_CSV(PetscLogHandler handler, PetscViewer viewer)
108478f1b9b4SToby Isaac {
108578f1b9b4SToby Isaac   PetscLogDouble      locTotalTime, maxMem;
108678f1b9b4SToby Isaac   PetscInt            numStages, numEvents, stage, event;
108778f1b9b4SToby Isaac   MPI_Comm            comm = PetscObjectComm((PetscObject)viewer);
108878f1b9b4SToby Isaac   PetscMPIInt         rank, size;
108978f1b9b4SToby Isaac   PetscLogGlobalNames global_stages, global_events;
109078f1b9b4SToby Isaac   PetscLogState       state;
109178f1b9b4SToby Isaac   PetscEventPerfInfo  zero_info;
109278f1b9b4SToby Isaac 
109378f1b9b4SToby Isaac   PetscFunctionBegin;
109478f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(handler, &state));
109578f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_size(comm, &size));
109678f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_rank(comm, &rank));
109778f1b9b4SToby Isaac   /* Must preserve reduction count before we go on */
109878f1b9b4SToby Isaac   /* Get the total elapsed time */
109978f1b9b4SToby Isaac   PetscCall(PetscTime(&locTotalTime));
110078f1b9b4SToby Isaac   locTotalTime -= petsc_BaseTime;
110178f1b9b4SToby Isaac   PetscCall(PetscMallocGetMaximumUsage(&maxMem));
110278f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages));
110378f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events));
110478f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages));
110578f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents));
110678f1b9b4SToby Isaac   PetscCall(PetscMemzero(&zero_info, sizeof(zero_info)));
110778f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
110878f1b9b4SToby 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));
110978f1b9b4SToby Isaac   PetscCall(PetscViewerFlush(viewer));
111078f1b9b4SToby Isaac   for (stage = 0; stage < numStages; stage++) {
111178f1b9b4SToby Isaac     PetscEventPerfInfo *stage_perf_info;
111278f1b9b4SToby Isaac     PetscInt            stage_id;
111378f1b9b4SToby Isaac     const char         *stage_name;
111478f1b9b4SToby Isaac 
111578f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
111678f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
111778f1b9b4SToby Isaac     stage_perf_info = &zero_info;
111878f1b9b4SToby Isaac     if (stage_id >= 0) {
111978f1b9b4SToby Isaac       PetscStagePerf *stage_info;
112078f1b9b4SToby Isaac       PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_info));
112178f1b9b4SToby Isaac       stage_perf_info = &stage_info->perfInfo;
112278f1b9b4SToby Isaac     }
112378f1b9b4SToby 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));
112478f1b9b4SToby Isaac     for (event = 0; event < numEvents; event++) {
112578f1b9b4SToby Isaac       PetscEventPerfInfo *eventInfo = &zero_info;
112678f1b9b4SToby Isaac       PetscBool           is_zero   = PETSC_FALSE;
112778f1b9b4SToby Isaac       PetscInt            event_id;
112878f1b9b4SToby Isaac       const char         *event_name;
112978f1b9b4SToby Isaac 
113078f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id));
113178f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name));
1132dff009beSToby Isaac       if (event_id >= 0 && stage_id >= 0) PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &eventInfo));
113378f1b9b4SToby Isaac       PetscCall(PetscMemcmp(eventInfo, &zero_info, sizeof(zero_info), &is_zero));
113478f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPIU_BOOL, MPI_LAND, comm));
113578f1b9b4SToby Isaac       if (!is_zero) {
113678f1b9b4SToby 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));
113778f1b9b4SToby Isaac         if (eventInfo->dof[0] >= 0.) {
113878f1b9b4SToby Isaac           for (PetscInt d = 0; d < 8; ++d) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ",%g", eventInfo->dof[d]));
113978f1b9b4SToby Isaac           for (PetscInt e = 0; e < 8; ++e) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, ",%g", eventInfo->errors[e]));
114078f1b9b4SToby Isaac         }
114178f1b9b4SToby Isaac       }
114278f1b9b4SToby Isaac       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "\n"));
114378f1b9b4SToby Isaac     }
114478f1b9b4SToby Isaac   }
114578f1b9b4SToby Isaac   PetscCall(PetscViewerFlush(viewer));
114678f1b9b4SToby Isaac   PetscCall(PetscViewerASCIIPopSynchronized(viewer));
114778f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_stages));
114878f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_events));
114978f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
115078f1b9b4SToby Isaac }
115178f1b9b4SToby Isaac 
11521d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnSync(PetscViewer viewer)
115378f1b9b4SToby Isaac {
115478f1b9b4SToby Isaac   PetscFunctionBegin;
115578f1b9b4SToby Isaac   if (!PetscLogSyncOn) PetscFunctionReturn(PETSC_SUCCESS);
11561d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n"));
11571d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n"));
11581d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11591d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                       WARNING!!!                       #\n"));
11601d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11611d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This program was run with logging synchronization.   #\n"));
11621d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This option provides more meaningful imbalance       #\n"));
11631d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   figures at the expense of slowing things down and    #\n"));
11641d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   providing a distorted view of the overall runtime.   #\n"));
11651d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11661d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n\n\n"));
116778f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
116878f1b9b4SToby Isaac }
116978f1b9b4SToby Isaac 
11701d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnDebugging(PetscViewer viewer)
117178f1b9b4SToby Isaac {
117278f1b9b4SToby Isaac   PetscFunctionBegin;
117378f1b9b4SToby Isaac   if (PetscDefined(USE_DEBUG)) {
11741d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n"));
11751d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n"));
11761d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11771d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #                       WARNING!!!                       #\n"));
11781d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11791d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This code was compiled with a debugging option.      #\n"));
11801d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #   To get timing results run ./configure                #\n"));
11811d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #   using --with-debugging=no, the performance will      #\n"));
11821d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #   be generally two or three times faster.              #\n"));
11831d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
11841d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n\n\n"));
118578f1b9b4SToby Isaac   }
118678f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
118778f1b9b4SToby Isaac }
118878f1b9b4SToby Isaac 
11891d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnNoGpuAwareMpi(PetscViewer viewer)
119078f1b9b4SToby Isaac {
119178f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
119278f1b9b4SToby Isaac   PetscMPIInt size;
119378f1b9b4SToby Isaac   PetscBool   deviceInitialized = PETSC_FALSE;
119478f1b9b4SToby Isaac 
119578f1b9b4SToby Isaac   PetscFunctionBegin;
1196c621c6acSBarry Smith   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)viewer), &size));
119778f1b9b4SToby Isaac   for (int i = PETSC_DEVICE_HOST + 1; i < PETSC_DEVICE_MAX; ++i) {
119878f1b9b4SToby Isaac     const PetscDeviceType dtype = PetscDeviceTypeCast(i);
119978f1b9b4SToby Isaac     if (PetscDeviceInitialized(dtype)) { /* a non-host device was initialized */
120078f1b9b4SToby Isaac       deviceInitialized = PETSC_TRUE;
120178f1b9b4SToby Isaac       break;
120278f1b9b4SToby Isaac     }
120378f1b9b4SToby Isaac   }
120478f1b9b4SToby Isaac   /* the last condition says petsc is configured with device but it is a pure CPU run, so don't print misleading warnings */
120578f1b9b4SToby Isaac   if (use_gpu_aware_mpi || size == 1 || !deviceInitialized) PetscFunctionReturn(PETSC_SUCCESS);
12061d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n"));
12071d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n"));
12081d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12091d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                       WARNING!!!                       #\n"));
12101d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12111d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This code was compiled with GPU support and you've   #\n"));
12121d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   created PETSc/GPU objects, but you intentionally     #\n"));
12131d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   used -use_gpu_aware_mpi 0, requiring PETSc to copy   #\n"));
12141d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   additional data between the GPU and CPU. To obtain   #\n"));
12151d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   meaningful timing results on multi-rank runs, use    #\n"));
12161d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   GPU-aware MPI instead.                               #\n"));
12171d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12181d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n\n\n"));
121978f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
122078f1b9b4SToby Isaac #else
122178f1b9b4SToby Isaac   return PETSC_SUCCESS;
122278f1b9b4SToby Isaac #endif
122378f1b9b4SToby Isaac }
122478f1b9b4SToby Isaac 
12251d031f67SBarry Smith static PetscErrorCode PetscLogViewWarnGpuTime(PetscViewer viewer)
122678f1b9b4SToby Isaac {
1227*7d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
122878f1b9b4SToby Isaac 
122978f1b9b4SToby Isaac   PetscFunctionBegin;
123078f1b9b4SToby Isaac   if (!PetscLogGpuTimeFlag || petsc_gflops == 0) PetscFunctionReturn(PETSC_SUCCESS);
12311d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n\n"));
12321d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n"));
12331d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12341d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                       WARNING!!!                       #\n"));
12351d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12361d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This code was run with -log_view_gpu_time            #\n"));
12371d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   This provides accurate timing within the GPU kernels #\n"));
12381d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   but can slow down the entire computation by a        #\n"));
12391d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   measurable amount. For fastest runs we recommend     #\n"));
12401d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #   not using this option.                               #\n"));
12411d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      #                                                        #\n"));
12421d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      ##########################################################\n\n\n"));
124378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
124478f1b9b4SToby Isaac #else
124578f1b9b4SToby Isaac   return PETSC_SUCCESS;
124678f1b9b4SToby Isaac #endif
124778f1b9b4SToby Isaac }
124878f1b9b4SToby Isaac 
124978f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default_Info(PetscLogHandler handler, PetscViewer viewer)
125078f1b9b4SToby Isaac {
125178f1b9b4SToby Isaac   PetscLogHandler_Default def = (PetscLogHandler_Default)handler->data;
125278f1b9b4SToby Isaac   char                    arch[128], hostname[128], username[128], pname[PETSC_MAX_PATH_LEN], date[128];
125378f1b9b4SToby Isaac   PetscLogDouble          locTotalTime, TotalTime, TotalFlops;
125478f1b9b4SToby Isaac   PetscLogDouble          numMessages, messageLength, avgMessLen, numReductions;
125578f1b9b4SToby Isaac   PetscLogDouble          stageTime, flops, flopr, mem, mess, messLen, red;
125678f1b9b4SToby Isaac   PetscLogDouble          fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed;
125778f1b9b4SToby Isaac   PetscLogDouble          fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed;
125878f1b9b4SToby Isaac   PetscLogDouble          min, max, tot, ratio, avg, x, y;
125978f1b9b4SToby Isaac   PetscLogDouble          minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratC, totm, totml, totr, mal, malmax, emalmax;
126078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
126178f1b9b4SToby Isaac   PetscLogEvent  KSP_Solve, SNES_Solve, TS_Step, TAO_Solve; /* These need to be fixed to be some events registered with certain objects */
126278f1b9b4SToby Isaac   PetscLogDouble cct, gct, csz, gsz, gmaxt, gflops, gflopr, fracgflops;
126378f1b9b4SToby Isaac #endif
126478f1b9b4SToby Isaac   PetscMPIInt   minC, maxC;
126578f1b9b4SToby Isaac   PetscMPIInt   size, rank;
126678f1b9b4SToby Isaac   PetscBool    *localStageUsed, *stageUsed;
126778f1b9b4SToby Isaac   PetscBool    *localStageVisible, *stageVisible;
126878f1b9b4SToby Isaac   PetscInt      numStages, numEvents;
126978f1b9b4SToby Isaac   int           stage, oclass;
127078f1b9b4SToby Isaac   PetscLogEvent event;
127178f1b9b4SToby Isaac   char          version[256];
127278f1b9b4SToby Isaac   MPI_Comm      comm;
1273*7d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
127478f1b9b4SToby Isaac   PetscInt64 nas = 0x7FF0000000000002;
127578f1b9b4SToby Isaac #endif
127678f1b9b4SToby Isaac   PetscLogGlobalNames global_stages, global_events;
127778f1b9b4SToby Isaac   PetscEventPerfInfo  zero_info;
127878f1b9b4SToby Isaac   PetscLogState       state;
127978f1b9b4SToby Isaac 
128078f1b9b4SToby Isaac   PetscFunctionBegin;
128178f1b9b4SToby Isaac   PetscCall(PetscLogHandlerGetState(handler, &state));
128278f1b9b4SToby Isaac   PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
128378f1b9b4SToby Isaac   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
128478f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_size(comm, &size));
128578f1b9b4SToby Isaac   PetscCallMPI(MPI_Comm_rank(comm, &rank));
128678f1b9b4SToby Isaac   /* Get the total elapsed time */
128778f1b9b4SToby Isaac   PetscCall(PetscTime(&locTotalTime));
128878f1b9b4SToby Isaac   locTotalTime -= petsc_BaseTime;
128978f1b9b4SToby Isaac 
12901d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "****************************************************************************************************************************************************************\n"));
12911d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "***                                WIDEN YOUR WINDOW TO 160 CHARACTERS.  Use 'enscript -r -fCourier9' to print this document                                 ***\n"));
12921d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "****************************************************************************************************************************************************************\n"));
12931d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n------------------------------------------------------------------ PETSc Performance Summary: ------------------------------------------------------------------\n\n"));
12941d031f67SBarry Smith   PetscCall(PetscLogViewWarnSync(viewer));
12951d031f67SBarry Smith   PetscCall(PetscLogViewWarnDebugging(viewer));
12961d031f67SBarry Smith   PetscCall(PetscLogViewWarnNoGpuAwareMpi(viewer));
12971d031f67SBarry Smith   PetscCall(PetscLogViewWarnGpuTime(viewer));
129878f1b9b4SToby Isaac   PetscCall(PetscGetArchType(arch, sizeof(arch)));
129978f1b9b4SToby Isaac   PetscCall(PetscGetHostName(hostname, sizeof(hostname)));
130078f1b9b4SToby Isaac   PetscCall(PetscGetUserName(username, sizeof(username)));
130178f1b9b4SToby Isaac   PetscCall(PetscGetProgramName(pname, sizeof(pname)));
130278f1b9b4SToby Isaac   PetscCall(PetscGetDate(date, sizeof(date)));
130378f1b9b4SToby Isaac   PetscCall(PetscGetVersion(version, sizeof(version)));
1304456dbbcdSJunchao Zhang 
1305456dbbcdSJunchao Zhang #if defined(PETSC_HAVE_CUPM)
1306456dbbcdSJunchao Zhang   const char *cupm = PetscDefined(HAVE_CUDA) ? "CUDA" : "HIP";
13075c78b439SPierre Jolivet   if (PetscDeviceCUPMRuntimeArch)
13085c78b439SPierre 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));
1309456dbbcdSJunchao Zhang   else
1310456dbbcdSJunchao Zhang #endif
13115c78b439SPierre 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));
1312456dbbcdSJunchao Zhang 
131378f1b9b4SToby Isaac #if defined(PETSC_HAVE_OPENMP)
13141d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Using %" PetscInt_FMT " OpenMP threads\n", PetscNumOMPThreads));
131578f1b9b4SToby Isaac #endif
13161d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Using %s\n", version));
131778f1b9b4SToby Isaac 
131878f1b9b4SToby Isaac   /* Must preserve reduction count before we go on */
131978f1b9b4SToby Isaac   red = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct;
132078f1b9b4SToby Isaac 
132178f1b9b4SToby Isaac   /* Calculate summary information */
13221d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n                         Max       Max/Min     Avg       Total\n"));
132378f1b9b4SToby Isaac   /*   Time */
132478f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
132578f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
132678f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
132778f1b9b4SToby Isaac   avg = tot / ((PetscLogDouble)size);
132878f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
132978f1b9b4SToby Isaac   else ratio = 0.0;
13301d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Time (sec):           %5.3e   %7.3f   %5.3e\n", max, ratio, avg));
133178f1b9b4SToby Isaac   TotalTime = tot;
133278f1b9b4SToby Isaac   /*   Objects */
133378f1b9b4SToby Isaac   {
133478f1b9b4SToby Isaac     PetscInt num_objects;
133578f1b9b4SToby Isaac 
133678f1b9b4SToby Isaac     PetscCall(PetscLogObjectArrayGetSize(def->petsc_objects, &num_objects, NULL));
133778f1b9b4SToby Isaac     avg = (PetscLogDouble)num_objects;
133878f1b9b4SToby Isaac   }
133978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&avg, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
134078f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&avg, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
134178f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&avg, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
134278f1b9b4SToby Isaac   avg = tot / ((PetscLogDouble)size);
134378f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
134478f1b9b4SToby Isaac   else ratio = 0.0;
13451d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Objects:              %5.3e   %7.3f   %5.3e\n", max, ratio, avg));
134678f1b9b4SToby Isaac   /*   Flops */
134778f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&petsc_TotalFlops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
134878f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&petsc_TotalFlops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
134978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&petsc_TotalFlops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
135078f1b9b4SToby Isaac   avg = tot / ((PetscLogDouble)size);
135178f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
135278f1b9b4SToby Isaac   else ratio = 0.0;
13531d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Flops:                %5.3e   %7.3f   %5.3e  %5.3e\n", max, ratio, avg, tot));
135478f1b9b4SToby Isaac   TotalFlops = tot;
135578f1b9b4SToby Isaac   /*   Flops/sec -- Must talk to Barry here */
135678f1b9b4SToby Isaac   if (locTotalTime != 0.0) flops = petsc_TotalFlops / locTotalTime;
135778f1b9b4SToby Isaac   else flops = 0.0;
135878f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&flops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
135978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&flops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
136078f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&flops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
136178f1b9b4SToby Isaac   avg = tot / ((PetscLogDouble)size);
136278f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
136378f1b9b4SToby Isaac   else ratio = 0.0;
13641d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Flops/sec:            %5.3e   %7.3f   %5.3e  %5.3e\n", max, ratio, avg, tot));
136578f1b9b4SToby Isaac   /*   Memory */
136678f1b9b4SToby Isaac   PetscCall(PetscMallocGetMaximumUsage(&mem));
136778f1b9b4SToby Isaac   if (mem > 0.0) {
136878f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&mem, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
136978f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&mem, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
137078f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&mem, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
137178f1b9b4SToby Isaac     avg = tot / ((PetscLogDouble)size);
137278f1b9b4SToby Isaac     if (min != 0.0) ratio = max / min;
137378f1b9b4SToby Isaac     else ratio = 0.0;
13741d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Memory (bytes):       %5.3e   %7.3f   %5.3e  %5.3e\n", max, ratio, avg, tot));
137578f1b9b4SToby Isaac   }
137678f1b9b4SToby Isaac   /*   Messages */
137778f1b9b4SToby Isaac   mess = 0.5 * (petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct);
137878f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
137978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
138078f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &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, "MPI Msg Count:        %5.3e   %7.3f   %5.3e  %5.3e\n", max, ratio, avg, tot));
138578f1b9b4SToby Isaac   numMessages = tot;
138678f1b9b4SToby Isaac   /*   Message Lengths */
138778f1b9b4SToby Isaac   mess = 0.5 * (petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len);
138878f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
138978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
139078f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
139178f1b9b4SToby Isaac   if (numMessages != 0) avg = tot / numMessages;
139278f1b9b4SToby Isaac   else avg = 0.0;
139378f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
139478f1b9b4SToby Isaac   else ratio = 0.0;
13951d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "MPI Msg Len (bytes):  %5.3e   %7.3f   %5.3e  %5.3e\n", max, ratio, avg, tot));
139678f1b9b4SToby Isaac   messageLength = tot;
139778f1b9b4SToby Isaac   /*   Reductions */
139878f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&red, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
139978f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&red, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
140078f1b9b4SToby Isaac   PetscCall(MPIU_Allreduce(&red, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
140178f1b9b4SToby Isaac   if (min != 0.0) ratio = max / min;
140278f1b9b4SToby Isaac   else ratio = 0.0;
14031d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "MPI Reductions:       %5.3e   %7.3f\n", max, ratio));
140478f1b9b4SToby Isaac   numReductions = red; /* wrong because uses count from process zero */
14051d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n"));
14061d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "                            e.g., VecAXPY() for real vectors of length N --> 2N flops\n"));
14071d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "                            and VecAXPY() for complex vectors of length N --> 8N flops\n"));
140878f1b9b4SToby Isaac 
140978f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalStageNames(comm, state->registry, &global_stages));
141078f1b9b4SToby Isaac   PetscCall(PetscLogRegistryCreateGlobalEventNames(comm, state->registry, &global_events));
141178f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_stages, NULL, &numStages));
141278f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesGetSize(global_events, NULL, &numEvents));
141378f1b9b4SToby Isaac   PetscCall(PetscMemzero(&zero_info, sizeof(zero_info)));
141478f1b9b4SToby Isaac   PetscCall(PetscMalloc1(numStages, &localStageUsed));
141578f1b9b4SToby Isaac   PetscCall(PetscMalloc1(numStages, &stageUsed));
141678f1b9b4SToby Isaac   PetscCall(PetscMalloc1(numStages, &localStageVisible));
141778f1b9b4SToby Isaac   PetscCall(PetscMalloc1(numStages, &stageVisible));
141878f1b9b4SToby Isaac   if (numStages > 0) {
141978f1b9b4SToby Isaac     for (stage = 0; stage < numStages; stage++) {
142078f1b9b4SToby Isaac       PetscInt stage_id;
142178f1b9b4SToby Isaac 
142278f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
142378f1b9b4SToby Isaac       if (stage_id >= 0) {
142478f1b9b4SToby Isaac         PetscStagePerf *stage_info;
142578f1b9b4SToby Isaac 
142678f1b9b4SToby Isaac         PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_info));
142778f1b9b4SToby Isaac         localStageUsed[stage]    = stage_info->used;
142878f1b9b4SToby Isaac         localStageVisible[stage] = stage_info->perfInfo.visible;
142978f1b9b4SToby Isaac       } else {
143078f1b9b4SToby Isaac         localStageUsed[stage]    = PETSC_FALSE;
143178f1b9b4SToby Isaac         localStageVisible[stage] = PETSC_TRUE;
143278f1b9b4SToby Isaac       }
143378f1b9b4SToby Isaac     }
143478f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(localStageUsed, stageUsed, numStages, MPIU_BOOL, MPI_LOR, comm));
143578f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(localStageVisible, stageVisible, numStages, MPIU_BOOL, MPI_LAND, comm));
143678f1b9b4SToby Isaac     for (stage = 0; stage < numStages; stage++) {
143778f1b9b4SToby Isaac       if (stageUsed[stage] && stageVisible[stage]) {
14381d031f67SBarry Smith         PetscCall(PetscViewerASCIIPrintf(viewer, "\nSummary of Stages:   ----- Time ------  ----- Flop ------  --- Messages ---  -- Message Lengths --  -- Reductions --\n"));
14391d031f67SBarry Smith         PetscCall(PetscViewerASCIIPrintf(viewer, "                        Avg     %%Total     Avg     %%Total    Count   %%Total     Avg         %%Total    Count   %%Total\n"));
144078f1b9b4SToby Isaac         break;
144178f1b9b4SToby Isaac       }
144278f1b9b4SToby Isaac     }
144378f1b9b4SToby Isaac     for (stage = 0; stage < numStages; stage++) {
144478f1b9b4SToby Isaac       PetscInt            stage_id;
144578f1b9b4SToby Isaac       PetscEventPerfInfo *stage_info;
144678f1b9b4SToby Isaac       const char         *stage_name;
144778f1b9b4SToby Isaac 
144878f1b9b4SToby Isaac       if (!(stageUsed[stage] && stageVisible[stage])) continue;
144978f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
145078f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
145178f1b9b4SToby Isaac       stage_info = &zero_info;
145278f1b9b4SToby Isaac       if (localStageUsed[stage]) {
145378f1b9b4SToby Isaac         PetscStagePerf *stage_perf_info;
145478f1b9b4SToby Isaac 
145578f1b9b4SToby Isaac         PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage, &stage_perf_info));
145678f1b9b4SToby Isaac         stage_info = &stage_perf_info->perfInfo;
145778f1b9b4SToby Isaac       }
145878f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(&stage_info->time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
145978f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(&stage_info->flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
146078f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(&stage_info->numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
146178f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(&stage_info->messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
146278f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(&stage_info->numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
146378f1b9b4SToby Isaac       mess *= 0.5;
146478f1b9b4SToby Isaac       messLen *= 0.5;
146578f1b9b4SToby Isaac       red /= size;
146678f1b9b4SToby Isaac       if (TotalTime != 0.0) fracTime = stageTime / TotalTime;
146778f1b9b4SToby Isaac       else fracTime = 0.0;
146878f1b9b4SToby Isaac       if (TotalFlops != 0.0) fracFlops = flops / TotalFlops;
146978f1b9b4SToby Isaac       else fracFlops = 0.0;
147078f1b9b4SToby Isaac       /* Talk to Barry if (stageTime     != 0.0) flops          = (size*flops)/stageTime; else flops          = 0.0; */
147178f1b9b4SToby Isaac       if (numMessages != 0.0) fracMessages = mess / numMessages;
147278f1b9b4SToby Isaac       else fracMessages = 0.0;
147378f1b9b4SToby Isaac       if (mess != 0.0) avgMessLen = messLen / mess;
147478f1b9b4SToby Isaac       else avgMessLen = 0.0;
147578f1b9b4SToby Isaac       if (messageLength != 0.0) fracLength = messLen / messageLength;
147678f1b9b4SToby Isaac       else fracLength = 0.0;
147778f1b9b4SToby Isaac       if (numReductions != 0.0) fracReductions = red / numReductions;
147878f1b9b4SToby Isaac       else fracReductions = 0.0;
14791d031f67SBarry 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));
148078f1b9b4SToby Isaac     }
148178f1b9b4SToby Isaac   }
148278f1b9b4SToby Isaac 
14831d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n------------------------------------------------------------------------------------------------------------------------\n"));
14841d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n"));
14851d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Phase summary info:\n"));
14861d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Count: number of times phase was executed\n"));
14871d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Time and Flop: Max - maximum over all processors\n"));
14881d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "                  Ratio - ratio of maximum to minimum over all processors\n"));
14891d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Mess: number of messages sent\n"));
14901d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   AvgLen: average message length (bytes)\n"));
14911d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Reduct: number of global reductions\n"));
14921d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Global: entire computation\n"));
14931d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n"));
14941d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      %%T - percent time in this phase         %%F - percent flop in this phase\n"));
14951d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      %%M - percent messages in this phase     %%L - percent message lengths in this phase\n"));
14961d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "      %%R - percent reductions in this phase\n"));
14971d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   Total Mflop/s: 10e-6 * (sum of flop over all processors)/(max time over all processors)\n"));
149878f1b9b4SToby Isaac   if (PetscLogMemory) {
14991d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "   Memory usage is summed over all MPI processes, it is given in mega-bytes\n"));
15001d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "   Malloc Mbytes: Memory allocated and kept during event (sum over all calls to event). May be negative\n"));
15011d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "   EMalloc Mbytes: extra memory allocated during event and then freed (maximum over all calls to events). Never negative\n"));
15021d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "   MMalloc Mbytes: Increase in high water mark of allocated memory (sum over all calls to event). Never negative\n"));
15031d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "   RMI Mbytes: Increase in resident memory (sum over all calls to event)\n"));
150478f1b9b4SToby Isaac   }
150578f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
15061d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   GPU Mflop/s: 10e-6 * (sum of flop on GPU over all processors)/(max GPU time over all processors)\n"));
15071d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   CpuToGpu Count: total number of CPU to GPU copies per processor\n"));
15081d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   CpuToGpu Size (Mbytes): 10e-6 * (total size of CPU to GPU copies per processor)\n"));
15091d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   GpuToCpu Count: total number of GPU to CPU copies per processor\n"));
15101d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   GpuToCpu Size (Mbytes): 10e-6 * (total size of GPU to CPU copies per processor)\n"));
15111d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   GPU %%F: percent flops on GPU in this event\n"));
151278f1b9b4SToby Isaac #endif
15131d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------\n"));
151478f1b9b4SToby Isaac 
15151d031f67SBarry Smith   PetscCall(PetscLogViewWarnDebugging(viewer));
151678f1b9b4SToby Isaac 
151778f1b9b4SToby Isaac   /* Report events */
15181d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Event                Count      Time (sec)     Flop                              --- Global ---  --- Stage ----  Total"));
15191d031f67SBarry Smith   if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, "  Malloc EMalloc MMalloc RMI"));
152078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
15211d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "   GPU    - CpuToGpu -   - GpuToCpu - GPU"));
152278f1b9b4SToby Isaac #endif
15231d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
15241d031f67SBarry 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"));
15251d031f67SBarry Smith   if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, " Mbytes Mbytes Mbytes Mbytes"));
152678f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
15271d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, " Mflop/s Count   Size   Count   Size  %%F"));
152878f1b9b4SToby Isaac #endif
15291d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
15301d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------"));
15311d031f67SBarry Smith   if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, "-----------------------------"));
153278f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
15331d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "---------------------------------------"));
153478f1b9b4SToby Isaac #endif
15351d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
153678f1b9b4SToby Isaac 
153778f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
153878f1b9b4SToby Isaac   /* this indirect way of accessing these values is needed when PETSc is build with multiple libraries since the symbols are not in libpetscsys */
15398025bc25SToby Isaac   PetscCall(PetscLogStateGetEventFromName(state, "TaoSolve", &TAO_Solve));
154078f1b9b4SToby Isaac   PetscCall(PetscLogStateGetEventFromName(state, "TSStep", &TS_Step));
154178f1b9b4SToby Isaac   PetscCall(PetscLogStateGetEventFromName(state, "SNESSolve", &SNES_Solve));
154278f1b9b4SToby Isaac   PetscCall(PetscLogStateGetEventFromName(state, "KSPSolve", &KSP_Solve));
154378f1b9b4SToby Isaac #endif
154478f1b9b4SToby Isaac 
154578f1b9b4SToby Isaac   for (stage = 0; stage < numStages; stage++) {
154678f1b9b4SToby Isaac     PetscInt            stage_id;
154778f1b9b4SToby Isaac     PetscEventPerfInfo *stage_info;
154878f1b9b4SToby Isaac     const char         *stage_name;
154978f1b9b4SToby Isaac 
155078f1b9b4SToby Isaac     if (!(stageVisible[stage] && stageUsed[stage])) continue;
155178f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_stages, stage, &stage_id));
155278f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
15531d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "\n--- Event Stage %d: %s\n\n", stage, stage_name));
155478f1b9b4SToby Isaac     stage_info = &zero_info;
155578f1b9b4SToby Isaac     if (localStageUsed[stage]) {
155678f1b9b4SToby Isaac       PetscStagePerf *stage_perf_info;
155778f1b9b4SToby Isaac 
155878f1b9b4SToby Isaac       PetscCall(PetscLogHandlerDefaultGetStageInfo(handler, stage_id, &stage_perf_info));
155978f1b9b4SToby Isaac       stage_info = &stage_perf_info->perfInfo;
156078f1b9b4SToby Isaac     }
156178f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&stage_info->time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
156278f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&stage_info->flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
156378f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&stage_info->numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
156478f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&stage_info->messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
156578f1b9b4SToby Isaac     PetscCall(MPIU_Allreduce(&stage_info->numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
156678f1b9b4SToby Isaac     mess *= 0.5;
156778f1b9b4SToby Isaac     messLen *= 0.5;
156878f1b9b4SToby Isaac     red /= size;
156978f1b9b4SToby Isaac 
157078f1b9b4SToby Isaac     for (event = 0; event < numEvents; event++) {
157178f1b9b4SToby Isaac       PetscInt            event_id;
157278f1b9b4SToby Isaac       PetscEventPerfInfo *event_info = &zero_info;
157378f1b9b4SToby Isaac       PetscBool           is_zero    = PETSC_FALSE;
157478f1b9b4SToby Isaac       const char         *event_name;
157578f1b9b4SToby Isaac 
157678f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetLocal(global_events, event, &event_id));
157778f1b9b4SToby Isaac       PetscCall(PetscLogGlobalNamesGlobalGetName(global_events, event, &event_name));
1578dff009beSToby Isaac       if (event_id >= 0 && stage_id >= 0) { PetscCall(PetscLogHandlerGetEventPerfInfo_Default(handler, stage_id, event_id, &event_info)); }
157978f1b9b4SToby Isaac       PetscCall(PetscMemcmp(event_info, &zero_info, sizeof(zero_info), &is_zero));
158078f1b9b4SToby Isaac       PetscCall(MPIU_Allreduce(MPI_IN_PLACE, &is_zero, 1, MPIU_BOOL, MPI_LAND, comm));
158178f1b9b4SToby Isaac       if (!is_zero) {
158278f1b9b4SToby Isaac         flopr = event_info->flops;
158378f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
158478f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
158578f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->flops, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
158678f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->time, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm));
158778f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->time, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
158878f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->time, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
158978f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->numMessages, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159078f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159178f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->numReductions, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159278f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->count, &minC, 1, MPI_INT, MPI_MIN, comm));
159378f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->count, &maxC, 1, MPI_INT, MPI_MAX, comm));
159478f1b9b4SToby Isaac         if (PetscLogMemory) {
159578f1b9b4SToby Isaac           PetscCall(MPIU_Allreduce(&event_info->memIncrease, &mem, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159678f1b9b4SToby Isaac           PetscCall(MPIU_Allreduce(&event_info->mallocSpace, &mal, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159778f1b9b4SToby Isaac           PetscCall(MPIU_Allreduce(&event_info->mallocIncrease, &malmax, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159878f1b9b4SToby Isaac           PetscCall(MPIU_Allreduce(&event_info->mallocIncreaseEvent, &emalmax, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
159978f1b9b4SToby Isaac         }
160078f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
160178f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->CpuToGpuCount, &cct, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
160278f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->GpuToCpuCount, &gct, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
160378f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->CpuToGpuSize, &csz, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
160478f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->GpuToCpuSize, &gsz, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
160578f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->GpuFlops, &gflops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm));
160678f1b9b4SToby Isaac         PetscCall(MPIU_Allreduce(&event_info->GpuTime, &gmaxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm));
160778f1b9b4SToby Isaac #endif
160878f1b9b4SToby Isaac         if (mint < 0.0) {
16091d031f67SBarry Smith           PetscCall(PetscViewerASCIIPrintf(viewer, "WARNING!!! Minimum time %g over all processors for %s is negative! This happens\n on some machines whose times cannot handle too rapid calls.!\n artificially changing minimum to zero.\n", mint, event_name));
161078f1b9b4SToby Isaac           mint = 0;
161178f1b9b4SToby Isaac         }
161278f1b9b4SToby Isaac         PetscCheck(minf >= 0.0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Minimum flop %g over all processors for %s is negative! Not possible!", minf, event_name);
1613*7d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
161478f1b9b4SToby Isaac         /* Put NaN into the time for all events that may not be time accurately since they may happen asynchronously on the GPU */
161578f1b9b4SToby Isaac         if (!PetscLogGpuTimeFlag && petsc_gflops > 0) {
161678f1b9b4SToby Isaac           memcpy(&gmaxt, &nas, sizeof(PetscLogDouble));
161778f1b9b4SToby Isaac           if (event_id != SNES_Solve && event_id != KSP_Solve && event_id != TS_Step && event_id != TAO_Solve) {
161878f1b9b4SToby Isaac             memcpy(&mint, &nas, sizeof(PetscLogDouble));
161978f1b9b4SToby Isaac             memcpy(&maxt, &nas, sizeof(PetscLogDouble));
162078f1b9b4SToby Isaac           }
162178f1b9b4SToby Isaac         }
162278f1b9b4SToby Isaac #endif
162378f1b9b4SToby Isaac         totm *= 0.5;
162478f1b9b4SToby Isaac         totml *= 0.5;
162578f1b9b4SToby Isaac         totr /= size;
162678f1b9b4SToby Isaac 
162778f1b9b4SToby Isaac         if (maxC != 0) {
162878f1b9b4SToby Isaac           if (minC != 0) ratC = ((PetscLogDouble)maxC) / minC;
162978f1b9b4SToby Isaac           else ratC = 0.0;
163078f1b9b4SToby Isaac           if (mint != 0.0) ratt = maxt / mint;
163178f1b9b4SToby Isaac           else ratt = 0.0;
163278f1b9b4SToby Isaac           if (minf != 0.0) ratf = maxf / minf;
163378f1b9b4SToby Isaac           else ratf = 0.0;
163478f1b9b4SToby Isaac           if (TotalTime != 0.0) fracTime = tott / TotalTime;
163578f1b9b4SToby Isaac           else fracTime = 0.0;
163678f1b9b4SToby Isaac           if (TotalFlops != 0.0) fracFlops = totf / TotalFlops;
163778f1b9b4SToby Isaac           else fracFlops = 0.0;
163878f1b9b4SToby Isaac           if (stageTime != 0.0) fracStageTime = tott / stageTime;
163978f1b9b4SToby Isaac           else fracStageTime = 0.0;
164078f1b9b4SToby Isaac           if (flops != 0.0) fracStageFlops = totf / flops;
164178f1b9b4SToby Isaac           else fracStageFlops = 0.0;
164278f1b9b4SToby Isaac           if (numMessages != 0.0) fracMess = totm / numMessages;
164378f1b9b4SToby Isaac           else fracMess = 0.0;
164478f1b9b4SToby Isaac           if (messageLength != 0.0) fracMessLen = totml / messageLength;
164578f1b9b4SToby Isaac           else fracMessLen = 0.0;
164678f1b9b4SToby Isaac           if (numReductions != 0.0) fracRed = totr / numReductions;
164778f1b9b4SToby Isaac           else fracRed = 0.0;
164878f1b9b4SToby Isaac           if (mess != 0.0) fracStageMess = totm / mess;
164978f1b9b4SToby Isaac           else fracStageMess = 0.0;
165078f1b9b4SToby Isaac           if (messLen != 0.0) fracStageMessLen = totml / messLen;
165178f1b9b4SToby Isaac           else fracStageMessLen = 0.0;
165278f1b9b4SToby Isaac           if (red != 0.0) fracStageRed = totr / red;
165378f1b9b4SToby Isaac           else fracStageRed = 0.0;
165478f1b9b4SToby Isaac           if (totm != 0.0) totml /= totm;
165578f1b9b4SToby Isaac           else totml = 0.0;
165678f1b9b4SToby Isaac           if (maxt != 0.0) flopr = totf / maxt;
165778f1b9b4SToby Isaac           else flopr = 0.0;
165878f1b9b4SToby Isaac           if (fracStageTime > 1.0 || fracStageFlops > 1.0 || fracStageMess > 1.0 || fracStageMessLen > 1.0 || fracStageRed > 1.0)
16591d031f67SBarry 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));
16603141c872SJunchao Zhang           else {
16613141c872SJunchao Zhang             if (PetscIsNanReal((PetscReal)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"
16621d031f67SBarry 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));
16633141c872SJunchao Zhang             } else {
16641d031f67SBarry 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));
16653141c872SJunchao Zhang             }
16663141c872SJunchao Zhang           }
16671d031f67SBarry 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));
166878f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
166978f1b9b4SToby Isaac           if (totf != 0.0) fracgflops = gflops / totf;
167078f1b9b4SToby Isaac           else fracgflops = 0.0;
167178f1b9b4SToby Isaac           if (gmaxt != 0.0) gflopr = gflops / gmaxt;
167278f1b9b4SToby Isaac           else gflopr = 0.0;
16733141c872SJunchao Zhang           if (PetscIsNanReal((PetscReal)gflopr)) {
16741d031f67SBarry 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));
16753141c872SJunchao Zhang           } else {
16761d031f67SBarry 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));
16773141c872SJunchao Zhang           }
167878f1b9b4SToby Isaac #endif
16791d031f67SBarry Smith           PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
168078f1b9b4SToby Isaac         }
168178f1b9b4SToby Isaac       }
168278f1b9b4SToby Isaac     }
168378f1b9b4SToby Isaac   }
168478f1b9b4SToby Isaac 
168578f1b9b4SToby Isaac   /* Memory usage and object creation */
16861d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "------------------------------------------------------------------------------------------------------------------------"));
16871d031f67SBarry Smith   if (PetscLogMemory) PetscCall(PetscViewerASCIIPrintf(viewer, "-----------------------------"));
168878f1b9b4SToby Isaac #if defined(PETSC_HAVE_DEVICE)
16891d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "---------------------------------------"));
169078f1b9b4SToby Isaac #endif
16911d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
16921d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
169378f1b9b4SToby Isaac 
169478f1b9b4SToby Isaac   /* Right now, only stages on the first processor are reported here, meaning only objects associated with
169578f1b9b4SToby Isaac      the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then
169678f1b9b4SToby Isaac      stats for stages local to processor sets.
169778f1b9b4SToby Isaac   */
169878f1b9b4SToby Isaac   /* We should figure out the longest object name here (now 20 characters) */
16991d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Object Type          Creations   Destructions. Reports information only for process 0.\n"));
170078f1b9b4SToby Isaac   for (stage = 0; stage < numStages; stage++) {
170178f1b9b4SToby Isaac     const char *stage_name;
170278f1b9b4SToby Isaac 
170378f1b9b4SToby Isaac     PetscCall(PetscLogGlobalNamesGlobalGetName(global_stages, stage, &stage_name));
17041d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "\n--- Event Stage %d: %s\n\n", stage, stage_name));
170578f1b9b4SToby Isaac     if (localStageUsed[stage]) {
170678f1b9b4SToby Isaac       PetscInt num_classes;
170778f1b9b4SToby Isaac 
170878f1b9b4SToby Isaac       PetscCall(PetscLogStateGetNumClasses(state, &num_classes));
170978f1b9b4SToby Isaac       for (oclass = 0; oclass < num_classes; oclass++) {
171078f1b9b4SToby Isaac         PetscClassPerf *class_perf_info;
171178f1b9b4SToby Isaac 
171278f1b9b4SToby Isaac         PetscCall(PetscLogHandlerDefaultGetClassPerf(handler, stage, oclass, &class_perf_info));
171378f1b9b4SToby Isaac         if ((class_perf_info->creations > 0) || (class_perf_info->destructions > 0)) {
171478f1b9b4SToby Isaac           PetscLogClassInfo class_reg_info;
171507e942bbSPierre Jolivet           PetscBool         flg;
171678f1b9b4SToby Isaac 
171778f1b9b4SToby Isaac           PetscCall(PetscLogStateClassGetInfo(state, oclass, &class_reg_info));
171807e942bbSPierre Jolivet           if (stage == 0 && oclass == num_classes - 1) {
171907e942bbSPierre Jolivet             PetscCall(PetscStrcmp(class_reg_info.name, "Viewer", &flg));
172007e942bbSPierre Jolivet             PetscCheck(flg && class_perf_info->creations == 1 && class_perf_info->destructions == 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "The last PetscObject type of the main PetscLogStage should be PetscViewer with a single creation and no destruction");
17211d031f67SBarry Smith           } else PetscCall(PetscViewerASCIIPrintf(viewer, "%20s %5d          %5d\n", class_reg_info.name, class_perf_info->creations, class_perf_info->destructions));
172278f1b9b4SToby Isaac         }
172378f1b9b4SToby Isaac       }
172478f1b9b4SToby Isaac     }
172578f1b9b4SToby Isaac   }
172678f1b9b4SToby Isaac 
172778f1b9b4SToby Isaac   PetscCall(PetscFree(localStageUsed));
172878f1b9b4SToby Isaac   PetscCall(PetscFree(stageUsed));
172978f1b9b4SToby Isaac   PetscCall(PetscFree(localStageVisible));
173078f1b9b4SToby Isaac   PetscCall(PetscFree(stageVisible));
173178f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_stages));
173278f1b9b4SToby Isaac   PetscCall(PetscLogGlobalNamesDestroy(&global_events));
173378f1b9b4SToby Isaac 
173478f1b9b4SToby Isaac   /* Information unrelated to this particular run */
17351d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "========================================================================================================================\n"));
173678f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
173778f1b9b4SToby Isaac   PetscCall(PetscTime(&x));
173878f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
173978f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174078f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174178f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174278f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174378f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174478f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174578f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174678f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
174778f1b9b4SToby Isaac   PetscCall(PetscTime(&y));
17481d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Average time to get PetscTime(): %g\n", (y - x) / 10.0));
174978f1b9b4SToby Isaac   /* MPI information */
175078f1b9b4SToby Isaac   if (size > 1) {
175178f1b9b4SToby Isaac     MPI_Status  status;
175278f1b9b4SToby Isaac     PetscMPIInt tag;
175378f1b9b4SToby Isaac     MPI_Comm    newcomm;
175478f1b9b4SToby Isaac 
175578f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
175678f1b9b4SToby Isaac     PetscCall(PetscTime(&x));
175778f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
175878f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
175978f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
176078f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
176178f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
176278f1b9b4SToby Isaac     PetscCall(PetscTime(&y));
17631d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Average time for MPI_Barrier(): %g\n", (y - x) / 5.0));
176478f1b9b4SToby Isaac     PetscCall(PetscCommDuplicate(comm, &newcomm, &tag));
176578f1b9b4SToby Isaac     PetscCallMPI(MPI_Barrier(comm));
176678f1b9b4SToby Isaac     if (rank) {
176778f1b9b4SToby Isaac       PetscCallMPI(MPI_Recv(NULL, 0, MPI_INT, rank - 1, tag, newcomm, &status));
176878f1b9b4SToby Isaac       PetscCallMPI(MPI_Send(NULL, 0, MPI_INT, (rank + 1) % size, tag, newcomm));
176978f1b9b4SToby Isaac     } else {
177078f1b9b4SToby Isaac       PetscCall(PetscTime(&x));
177178f1b9b4SToby Isaac       PetscCallMPI(MPI_Send(NULL, 0, MPI_INT, 1, tag, newcomm));
177278f1b9b4SToby Isaac       PetscCallMPI(MPI_Recv(NULL, 0, MPI_INT, size - 1, tag, newcomm, &status));
177378f1b9b4SToby Isaac       PetscCall(PetscTime(&y));
17741d031f67SBarry Smith       PetscCall(PetscViewerASCIIPrintf(viewer, "Average time for zero size MPI_Send(): %g\n", (y - x) / size));
177578f1b9b4SToby Isaac     }
177678f1b9b4SToby Isaac     PetscCall(PetscCommDestroy(&newcomm));
177778f1b9b4SToby Isaac   }
177878f1b9b4SToby Isaac   PetscCall(PetscOptionsView(NULL, viewer));
177978f1b9b4SToby Isaac 
178078f1b9b4SToby Isaac   /* Machine and compile information */
178178f1b9b4SToby Isaac   if (PetscDefined(USE_FORTRAN_KERNELS)) {
17821d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with FORTRAN kernels\n"));
178378f1b9b4SToby Isaac   } else {
17841d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled without FORTRAN kernels\n"));
178578f1b9b4SToby Isaac   }
178678f1b9b4SToby Isaac   if (PetscDefined(USE_64BIT_INDICES)) {
17871d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 64-bit PetscInt\n"));
178878f1b9b4SToby Isaac   } else if (PetscDefined(USE___FLOAT128)) {
17891d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 32-bit PetscInt\n"));
179078f1b9b4SToby Isaac   }
179178f1b9b4SToby Isaac   if (PetscDefined(USE_REAL_SINGLE)) {
17921d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with single precision PetscScalar and PetscReal\n"));
179378f1b9b4SToby Isaac   } else if (PetscDefined(USE___FLOAT128)) {
17941d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with 128 bit precision PetscScalar and PetscReal\n"));
179578f1b9b4SToby Isaac   }
179678f1b9b4SToby Isaac   if (PetscDefined(USE_REAL_MAT_SINGLE)) {
17971d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with single precision matrices\n"));
179878f1b9b4SToby Isaac   } else {
17991d031f67SBarry Smith     PetscCall(PetscViewerASCIIPrintf(viewer, "Compiled with full precision matrices (default)\n"));
180078f1b9b4SToby Isaac   }
18011d031f67SBarry 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)));
180278f1b9b4SToby Isaac 
18031d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "Configure options: %s", petscconfigureoptions));
18041d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petscmachineinfo));
18051d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsccompilerinfo));
18061d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsccompilerflagsinfo));
18071d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "%s", petsclinkerinfo));
180878f1b9b4SToby Isaac 
180978f1b9b4SToby Isaac   /* Cleanup */
18101d031f67SBarry Smith   PetscCall(PetscViewerASCIIPrintf(viewer, "\n"));
18111d031f67SBarry Smith   PetscCall(PetscLogViewWarnNoGpuAwareMpi(viewer));
18121d031f67SBarry Smith   PetscCall(PetscLogViewWarnDebugging(viewer));
181378f1b9b4SToby Isaac   PetscCall(PetscFPTrapPop());
181478f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
181578f1b9b4SToby Isaac }
181678f1b9b4SToby Isaac 
181778f1b9b4SToby Isaac static PetscErrorCode PetscLogHandlerView_Default(PetscLogHandler handler, PetscViewer viewer)
181878f1b9b4SToby Isaac {
181978f1b9b4SToby Isaac   PetscViewerFormat format;
18204d86920dSPierre Jolivet 
182178f1b9b4SToby Isaac   PetscFunctionBegin;
182278f1b9b4SToby Isaac   PetscCall(PetscViewerGetFormat(viewer, &format));
182378f1b9b4SToby Isaac   if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO) {
182478f1b9b4SToby Isaac     PetscCall(PetscLogHandlerView_Default_Info(handler, viewer));
182578f1b9b4SToby Isaac   } else if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
182678f1b9b4SToby Isaac     PetscCall(PetscLogHandlerView_Default_Detailed(handler, viewer));
182778f1b9b4SToby Isaac   } else if (format == PETSC_VIEWER_ASCII_CSV) {
182878f1b9b4SToby Isaac     PetscCall(PetscLogHandlerView_Default_CSV(handler, viewer));
182978f1b9b4SToby Isaac   }
183078f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
183178f1b9b4SToby Isaac }
183278f1b9b4SToby Isaac 
183378f1b9b4SToby Isaac /*MC
1834294de794SToby Isaac   PETSCLOGHANDLERDEFAULT - PETSCLOGHANDLERDEFAULT = "default" -  A `PetscLogHandler` that collects data for PETSc
1835b665b14eSToby Isaac   default profiling log viewers (`PetscLogView()` and `PetscLogDump()`).  A log handler of this type is
1836b665b14eSToby Isaac   created and started (`PetscLogHandlerStart()`) by `PetscLogDefaultBegin()`.
183778f1b9b4SToby Isaac 
183878f1b9b4SToby Isaac   Options Database Keys:
183978f1b9b4SToby Isaac + -log_include_actions - include a growing list of actions (event beginnings and endings, object creations and destructions) in `PetscLogDump()` (`PetscLogActions()`).
184078f1b9b4SToby Isaac - -log_include_objects - include a growing list of object creations and destructions in `PetscLogDump()` (`PetscLogObjects()`).
184178f1b9b4SToby Isaac 
184278f1b9b4SToby Isaac   Level: developer
184378f1b9b4SToby Isaac 
184478f1b9b4SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`
184578f1b9b4SToby Isaac M*/
184678f1b9b4SToby Isaac 
184778f1b9b4SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler handler)
184878f1b9b4SToby Isaac {
184978f1b9b4SToby Isaac   PetscFunctionBegin;
185078f1b9b4SToby Isaac   PetscCall(PetscLogHandlerContextCreate_Default((PetscLogHandler_Default *)&handler->data));
185178f1b9b4SToby Isaac   handler->ops->destroy       = PetscLogHandlerDestroy_Default;
185278f1b9b4SToby Isaac   handler->ops->eventbegin    = PetscLogHandlerEventBegin_Default;
185378f1b9b4SToby Isaac   handler->ops->eventend      = PetscLogHandlerEventEnd_Default;
185478f1b9b4SToby Isaac   handler->ops->eventsync     = PetscLogHandlerEventSync_Default;
185578f1b9b4SToby Isaac   handler->ops->objectcreate  = PetscLogHandlerObjectCreate_Default;
185678f1b9b4SToby Isaac   handler->ops->objectdestroy = PetscLogHandlerObjectDestroy_Default;
185778f1b9b4SToby Isaac   handler->ops->stagepush     = PetscLogHandlerStagePush_Default;
185878f1b9b4SToby Isaac   handler->ops->stagepop      = PetscLogHandlerStagePop_Default;
185978f1b9b4SToby Isaac   handler->ops->view          = PetscLogHandlerView_Default;
1860dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetEventPerfInfo_C", PetscLogHandlerGetEventPerfInfo_Default));
18618b08f494SToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetStagePerfInfo_C", PetscLogHandlerGetStagePerfInfo_Default));
1862dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerSetLogActions_C", PetscLogHandlerSetLogActions_Default));
1863dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerSetLogObjects_C", PetscLogHandlerSetLogObjects_Default));
1864dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerLogObjectState_C", PetscLogHandlerLogObjectState_Default));
1865dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerGetNumObjects_C", PetscLogHandlerGetNumObjects_Default));
1866dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventDeactivatePush_C", PetscLogHandlerEventDeactivatePush_Default));
1867dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventDeactivatePop_C", PetscLogHandlerEventDeactivatePop_Default));
1868dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsPause_C", PetscLogHandlerEventsPause_Default));
1869dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsResume_C", PetscLogHandlerEventsResume_Default));
1870dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerDump_C", PetscLogHandlerDump_Default));
1871dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerStageSetVisible_C", PetscLogHandlerStageSetVisible_Default));
1872dff009beSToby Isaac   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerStageGetVisible_C", PetscLogHandlerStageGetVisible_Default));
187378f1b9b4SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
187478f1b9b4SToby Isaac }
1875