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