Actual source code: logimpl.h

  1: #ifndef PETSC_LOGIMPL_H
  2: #define PETSC_LOGIMPL_H

  4: #include <petsc/private/petscimpl.h>
  5: #include <petsctime.h>

  7: /* A simple stack */
  8: struct _n_PetscIntStack {
  9:   int  top;   /* The top of the stack */
 10:   int  max;   /* The maximum stack size */
 11:   int *stack; /* The storage */
 12: };

 14: /* The structure for action logging */
 15: #define CREATE      0
 16: #define DESTROY     1
 17: #define ACTIONBEGIN 2
 18: #define ACTIONEND   3
 19: typedef struct _Action {
 20:   int            action;        /* The type of execution */
 21:   PetscLogEvent  event;         /* The event number */
 22:   PetscClassId   classid;       /* The event class id */
 23:   PetscLogDouble time;          /* The time of occurrence */
 24:   PetscLogDouble flops;         /* The cumulative flops */
 25:   PetscLogDouble mem;           /* The current memory usage */
 26:   PetscLogDouble maxmem;        /* The maximum memory usage */
 27:   int            id1, id2, id3; /* The ids of associated objects */
 28: } Action;

 30: /* The structure for object logging */
 31: typedef struct _Object {
 32:   PetscObject    obj;      /* The associated PetscObject */
 33:   int            parent;   /* The parent id */
 34:   PetscLogDouble mem;      /* The memory associated with the object */
 35:   char           name[64]; /* The object name */
 36:   char           info[64]; /* The information string */
 37: } Object;

 39: /* Action and object logging variables */
 40: PETSC_EXTERN Action   *petsc_actions;
 41: PETSC_EXTERN Object   *petsc_objects;
 42: PETSC_EXTERN PetscBool petsc_logActions;
 43: PETSC_EXTERN PetscBool petsc_logObjects;
 44: PETSC_EXTERN int       petsc_numActions;
 45: PETSC_EXTERN int       petsc_maxActions;
 46: PETSC_EXTERN int       petsc_numObjects;
 47: PETSC_EXTERN int       petsc_maxObjects;
 48: PETSC_EXTERN int       petsc_numObjectsDestroyed;

 50: PETSC_EXTERN FILE          *petsc_tracefile;
 51: PETSC_EXTERN int            petsc_tracelevel;
 52: PETSC_EXTERN const char    *petsc_traceblanks;
 53: PETSC_EXTERN char           petsc_tracespace[128];
 54: PETSC_EXTERN PetscLogDouble petsc_tracetime;

 56: /* Thread-safety internals */

 58: /* SpinLock for shared Log variables */
 59: PETSC_INTERN PetscSpinlock PetscLogSpinLock;

 61: #if defined(PETSC_HAVE_THREADSAFETY)
 62:   #if defined(__cplusplus)
 63:     #define PETSC_TLS thread_local
 64:   #else
 65:     #define PETSC_TLS _Thread_local
 66:   #endif
 67:   #define PETSC_INTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_INTERNAL

 69: /* Access PETSc internal thread id */
 70: PETSC_INTERN PetscInt PetscLogGetTid(void);

 72:   /* Map from (threadid,stage,event) to perfInfo data struct */
 73: #include <petsc/private/hashmap.h>

 75: typedef struct _PetscHashIJKKey {
 76:   PetscInt i, j, k;
 77: } PetscHashIJKKey;

 79:   #define PetscHashIJKKeyHash(key)     PetscHashCombine(PetscHashInt((key).i), PetscHashCombine(PetscHashInt((key).j), PetscHashInt((key).k)))
 80:   #define PetscHashIJKKeyEqual(k1, k2) (((k1).i == (k2).i) ? (((k1).j == (k2).j) ? ((k1).k == (k2).k) : 0) : 0)

 82: PETSC_HASH_MAP(HMapEvent, PetscHashIJKKey, PetscEventPerfInfo *, PetscHashIJKKeyHash, PetscHashIJKKeyEqual, NULL)

 84: PETSC_INTERN PetscHMapEvent eventInfoMap_th;

 86: #else
 87:   #define PETSC_TLS
 88:   #define PETSC_INTERN_TLS
 89: #endif

 91: #ifdef PETSC_USE_LOG

 93: PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *);
 94: PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack);
 95: PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int);
 96: PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *);
 97: PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *);
 98: PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool *);

100: /* Creation and destruction functions */
101: PETSC_EXTERN PetscErrorCode PetscEventRegLogCreate(PetscEventRegLog *);
102: PETSC_EXTERN PetscErrorCode PetscEventRegLogDestroy(PetscEventRegLog);
103: PETSC_EXTERN PetscErrorCode PetscEventPerfLogCreate(PetscEventPerfLog *);
104: PETSC_EXTERN PetscErrorCode PetscEventPerfLogDestroy(PetscEventPerfLog);
105: /* General functions */
106: PETSC_EXTERN PetscErrorCode PetscEventPerfLogEnsureSize(PetscEventPerfLog, int);
107: PETSC_EXTERN PetscErrorCode PetscEventPerfInfoClear(PetscEventPerfInfo *);
108: PETSC_EXTERN PetscErrorCode PetscEventPerfInfoCopy(const PetscEventPerfInfo *, PetscEventPerfInfo *);
109: /* Registration functions */
110: PETSC_EXTERN PetscErrorCode PetscEventRegLogRegister(PetscEventRegLog, const char[], PetscClassId, PetscLogEvent *);
111: /* Query functions */
112: PETSC_EXTERN PetscErrorCode PetscEventPerfLogSetVisible(PetscEventPerfLog, PetscLogEvent, PetscBool);
113: PETSC_EXTERN PetscErrorCode PetscEventPerfLogGetVisible(PetscEventPerfLog, PetscLogEvent, PetscBool *);
114: /* Activaton functions */
115: PETSC_EXTERN PetscErrorCode PetscEventPerfLogActivate(PetscEventPerfLog, PetscLogEvent);
116: PETSC_EXTERN PetscErrorCode PetscEventPerfLogDeactivate(PetscEventPerfLog, PetscLogEvent);
117: PETSC_EXTERN PetscErrorCode PetscEventPerfLogDeactivatePush(PetscEventPerfLog, PetscLogEvent);
118: PETSC_EXTERN PetscErrorCode PetscEventPerfLogDeactivatePop(PetscEventPerfLog, PetscLogEvent);
119: PETSC_EXTERN PetscErrorCode PetscEventPerfLogActivateClass(PetscEventPerfLog, PetscEventRegLog, PetscClassId);
120: PETSC_EXTERN PetscErrorCode PetscEventPerfLogDeactivateClass(PetscEventPerfLog, PetscEventRegLog, PetscClassId);

122: /* Logging functions */
123: PETSC_EXTERN PetscErrorCode PetscLogEventBeginDefault(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
124: PETSC_EXTERN PetscErrorCode PetscLogEventEndDefault(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
125: PETSC_EXTERN PetscErrorCode PetscLogEventBeginComplete(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
126: PETSC_EXTERN PetscErrorCode PetscLogEventEndComplete(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
127: PETSC_EXTERN PetscErrorCode PetscLogEventBeginTrace(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
128: PETSC_EXTERN PetscErrorCode PetscLogEventEndTrace(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);

130: /* Creation and destruction functions */
131: PETSC_EXTERN PetscErrorCode PetscClassRegLogCreate(PetscClassRegLog *);
132: PETSC_EXTERN PetscErrorCode PetscClassRegLogDestroy(PetscClassRegLog);
133: PETSC_EXTERN PetscErrorCode PetscClassPerfLogCreate(PetscClassPerfLog *);
134: PETSC_EXTERN PetscErrorCode PetscClassPerfLogDestroy(PetscClassPerfLog);
135: PETSC_EXTERN PetscErrorCode PetscClassRegInfoDestroy(PetscClassRegInfo *);
136: /* General functions */
137: PETSC_EXTERN PetscErrorCode PetscClassPerfLogEnsureSize(PetscClassPerfLog, int);
138: PETSC_EXTERN PetscErrorCode PetscClassPerfInfoClear(PetscClassPerfInfo *);
139: /* Registration functions */
140: PETSC_EXTERN PetscErrorCode PetscClassRegLogRegister(PetscClassRegLog, const char[], PetscClassId);
141: /* Query functions */
142: PETSC_EXTERN PetscErrorCode PetscClassRegLogGetClass(PetscClassRegLog, PetscClassId, int *);
143: /* Logging functions */
144: PETSC_EXTERN PetscErrorCode PetscLogObjCreateDefault(PetscObject);
145: PETSC_EXTERN PetscErrorCode PetscLogObjDestroyDefault(PetscObject);

147: /* Creation and destruction functions */
148: PETSC_EXTERN PetscErrorCode PetscStageLogCreate(PetscStageLog *);
149: PETSC_EXTERN PetscErrorCode PetscStageLogDestroy(PetscStageLog);
150: /* Registration functions */
151: PETSC_EXTERN PetscErrorCode PetscStageLogRegister(PetscStageLog, const char[], int *);
152: /* Runtime functions */
153: PETSC_EXTERN PetscErrorCode PetscStageLogPush(PetscStageLog, int);
154: PETSC_EXTERN PetscErrorCode PetscStageLogPop(PetscStageLog);
155: PETSC_EXTERN PetscErrorCode PetscStageLogSetActive(PetscStageLog, int, PetscBool);
156: PETSC_EXTERN PetscErrorCode PetscStageLogGetActive(PetscStageLog, int, PetscBool *);
157: PETSC_EXTERN PetscErrorCode PetscStageLogSetVisible(PetscStageLog, int, PetscBool);
158: PETSC_EXTERN PetscErrorCode PetscStageLogGetVisible(PetscStageLog, int, PetscBool *);
159: PETSC_EXTERN PetscErrorCode PetscStageLogGetStage(PetscStageLog, const char[], PetscLogStage *);
160: PETSC_EXTERN PetscErrorCode PetscStageLogGetClassRegLog(PetscStageLog, PetscClassRegLog *);
161: PETSC_EXTERN PetscErrorCode PetscStageLogGetEventRegLog(PetscStageLog, PetscEventRegLog *);
162: PETSC_EXTERN PetscErrorCode PetscStageLogGetClassPerfLog(PetscStageLog, int, PetscClassPerfLog *);

164: PETSC_EXTERN PetscErrorCode PetscEventRegLogGetEvent(PetscEventRegLog, const char[], PetscLogEvent *);

166: PETSC_INTERN PetscErrorCode PetscLogView_Nested(PetscViewer);
167: PETSC_INTERN PetscErrorCode PetscLogNestedEnd(void);
168: PETSC_INTERN PetscErrorCode PetscLogView_Flamegraph(PetscViewer);

170: PETSC_INTERN PetscErrorCode PetscLogGetCurrentEvent_Internal(PetscLogEvent *);
171: PETSC_INTERN PetscErrorCode PetscLogEventPause_Internal(PetscLogEvent);
172: PETSC_INTERN PetscErrorCode PetscLogEventResume_Internal(PetscLogEvent);

174:   #if defined(PETSC_HAVE_DEVICE)
175: PETSC_EXTERN PetscBool PetscLogGpuTimeFlag;
176:   #endif
177: #else /* PETSC_USE_LOG */
178:   #define PetscLogGetCurrentEvent_Internal(event) ((*(event) = PETSC_DECIDE), PETSC_SUCCESS)
179:   #define PetscLogEventPause_Internal(event)      PETSC_SUCCESS
180:   #define PetscLogEventResume_Internal(event)     PETSC_SUCCESS
181: #endif /* PETSC_USE_LOG */
182: static inline PetscErrorCode PetscLogPauseCurrentEvent_Internal(PetscLogEvent *event)
183: {
184:   PetscFunctionBegin;
186:   PetscCall(PetscLogGetCurrentEvent_Internal(event));
187:   PetscCall(PetscLogEventPause_Internal(*event));
188:   PetscFunctionReturn(PETSC_SUCCESS);
189: }
190: #endif /* PETSC_LOGIMPL_H */