xref: /petsc/include/petsclog.h (revision 715b587b72f1b9001a0161919794b78e0f0f306b)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
46524c165SJacob Faibussowitsch #ifndef PETSCLOG_H
526bd1501SBarry Smith #define PETSCLOG_H
6ac09b921SBarry Smith 
7aaa7dc30SBarry Smith #include <petscsys.h>
8958c4211Shannah_mairs #include <petsctime.h>
9c8d78d4dSSatish Balay 
10ac09b921SBarry Smith /* SUBMANSEC = Sys */
11ac09b921SBarry Smith 
12fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */
133ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4);
14fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
157d3de750SJacob Faibussowitsch   #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__)
16fa2bb9feSLisandro Dalcin #else
173ba16761SJacob Faibussowitsch   #define PetscInfo(A, ...) PETSC_SUCCESS
18fa2bb9feSLisandro Dalcin #endif
19e94e781bSJacob Faibussowitsch 
207d3de750SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
217d3de750SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
225899db6dSLisandro Dalcin #define PetscInfo3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
237d3de750SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
247d3de750SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
257d3de750SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
267d3de750SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
277d3de750SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
287d3de750SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
297d3de750SJacob Faibussowitsch 
30e94e781bSJacob Faibussowitsch /*E
3187497f52SBarry Smith   PetscInfoCommFlag - Describes the method by which to filter `PetscInfo()` by communicator size
32e94e781bSJacob Faibussowitsch 
33667f096bSBarry Smith   Values:
34d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on
358b86dd2eSJacob Faibussowitsch                           communicator size (i.e. will print for all communicators)
36d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
37d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1
38e94e781bSJacob Faibussowitsch 
39e94e781bSJacob Faibussowitsch   Level: intermediate
40e94e781bSJacob Faibussowitsch 
41667f096bSBarry Smith   Note:
42667f096bSBarry Smith   Used as an input for `PetscInfoSetFilterCommSelf()`
43667f096bSBarry Smith 
44db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()`
45e94e781bSJacob Faibussowitsch E*/
46e94e781bSJacob Faibussowitsch typedef enum {
47e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL       = -1,
48e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF   = 0,
49e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
50e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
51e94e781bSJacob Faibussowitsch 
52e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[];
53fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoDeactivateClass(PetscClassId);
54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoActivateClass(PetscClassId);
55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoEnabled(PetscClassId, PetscBool *);
56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoAllow(PetscBool);
57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFile(const char[], const char[]);
58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetFile(char **, FILE **);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetClasses(PetscBool, PetscInt, const char *const *);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetClass(const char *, PetscBool *);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *);
628b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]);
63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFromOptions(PetscOptions);
65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoDestroy(void);
66fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool         PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */
67fa2bb9feSLisandro Dalcin 
68b859824cSBarry Smith /*MC
69b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
70b859824cSBarry Smith      code.
71b859824cSBarry Smith 
72b859824cSBarry Smith     Level: intermediate
73b859824cSBarry Smith 
74d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStage`
75b859824cSBarry Smith M*/
76b859824cSBarry Smith typedef int PetscLogEvent;
77b859824cSBarry Smith 
78b859824cSBarry Smith /*MC
79b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
80b859824cSBarry Smith 
81b859824cSBarry Smith     Level: intermediate
82b859824cSBarry Smith 
83d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEvent`
84b859824cSBarry Smith M*/
85b859824cSBarry Smith typedef int PetscLogStage;
86b859824cSBarry Smith 
878ba1e511SMatthew Knepley #define PETSC_EVENT 1311311
88014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
8997bb86f7SLois Curfman McInnes 
90c708d6e3SStefano Zampini /* Handle multithreading */
91c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
92c708d6e3SStefano Zampini   #if defined(__cplusplus)
93c708d6e3SStefano Zampini     #define PETSC_TLS thread_local
94c708d6e3SStefano Zampini   #else
95c708d6e3SStefano Zampini     #define PETSC_TLS _Thread_local
96c708d6e3SStefano Zampini   #endif
97c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC
98c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
99c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
100c708d6e3SStefano Zampini #else
101c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS PETSC_EXTERN
102c708d6e3SStefano Zampini   #define PETSC_TLS
1033ba16761SJacob Faibussowitsch   #define PetscAddLogDouble(a, b, c)          ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS)))
1043ba16761SJacob Faibussowitsch   #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e)))
105c708d6e3SStefano Zampini #endif
10619b02663SBarry Smith 
10731d06abdSBarry Smith /* We must make the following structures available to access the event
10831d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
10931d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
110d49d4b11SBarry Smith 
111fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
11231d06abdSBarry Smith */
113aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
1146a6a9b46SSatish Balay 
115217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
116c60ec953SBarry Smith /*
117aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
118c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
119c60ec953SBarry Smith        how much memory they use, etc.
120c60ec953SBarry Smith 
121aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
122c60ec953SBarry Smith */
1236a6a9b46SSatish Balay typedef struct {
124c60ec953SBarry Smith   char        *name;    /* The class name */
125c60ec953SBarry Smith   PetscClassId classid; /* The integer identifying this class */
126aa213bdcSJed Brown } PetscClassRegInfo;
1276a6a9b46SSatish Balay 
1286a6a9b46SSatish Balay typedef struct {
1290700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1306a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1316a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1324851f57dSBarry Smith   PetscLogDouble mem;          /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */
1334851f57dSBarry Smith   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */
134aa213bdcSJed Brown } PetscClassPerfInfo;
1356a6a9b46SSatish Balay 
136aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
137aa213bdcSJed Brown struct _n_PetscClassRegLog {
138c60ec953SBarry Smith   int                numClasses; /* The number of classes registered */
139c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
140aa213bdcSJed Brown   PetscClassRegInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
141c60ec953SBarry Smith };
1426a6a9b46SSatish Balay 
143aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
144aa213bdcSJed Brown struct _n_PetscClassPerfLog {
145c60ec953SBarry Smith   int                 numClasses; /* The number of logging classes */
146c60ec953SBarry Smith   int                 maxClasses; /* The maximum number of classes */
147aa213bdcSJed Brown   PetscClassPerfInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
148c60ec953SBarry Smith };
149c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
150c60ec953SBarry Smith /*
151aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
152c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
153c60ec953SBarry Smith        much time it takes, etc.
154c60ec953SBarry Smith 
155aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
156c60ec953SBarry Smith       of these for each stage.
157c60ec953SBarry Smith 
158c60ec953SBarry Smith */
1596a6a9b46SSatish Balay typedef struct {
1606a6a9b46SSatish Balay   char        *name;       /* The name of this event */
161c60ec953SBarry Smith   PetscClassId classid;    /* The class the event is associated with */
162217044c2SLisandro Dalcin   PetscBool    collective; /* Flag this event as collective */
163a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
164a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this event */
165a0c7f9aaSSamuel Khuvis #endif
1666a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE)
1676a6a9b46SSatish Balay   int mpe_id_begin; /* MPE IDs that define the event */
1686a6a9b46SSatish Balay   int mpe_id_end;
1696a6a9b46SSatish Balay #endif
170aa213bdcSJed Brown } PetscEventRegInfo;
1716a6a9b46SSatish Balay 
172c60ec953SBarry Smith typedef struct {
173c60ec953SBarry Smith   int            id;                  /* The integer identifying this event */
174ace3abfcSBarry Smith   PetscBool      active;              /* The flag to activate logging */
175ace3abfcSBarry Smith   PetscBool      visible;             /* The flag to print info in summary */
176c60ec953SBarry Smith   int            depth;               /* The nesting depth of the event call */
177c60ec953SBarry Smith   int            count;               /* The number of times this event was executed */
178c708d6e3SStefano Zampini   PetscLogDouble flops;               /* The flops used in this event */
179c708d6e3SStefano Zampini   PetscLogDouble flops2;              /* The square of flops used in this event */
180c708d6e3SStefano Zampini   PetscLogDouble flopsTmp;            /* The accumulator for flops used in this event */
181c708d6e3SStefano Zampini   PetscLogDouble time;                /* The time taken for this event */
182c708d6e3SStefano Zampini   PetscLogDouble time2;               /* The square of time taken for this event */
183c708d6e3SStefano Zampini   PetscLogDouble timeTmp;             /* The accumulator for time taken for this event */
184217044c2SLisandro Dalcin   PetscLogDouble syncTime;            /* The synchronization barrier time */
185891e75beSMatthew G. Knepley   PetscLogDouble dof[8];              /* The number of degrees of freedom associated with this event */
1865d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];           /* The errors (user-defined) associated with this event */
187c60ec953SBarry Smith   PetscLogDouble numMessages;         /* The number of messages in this event */
188c60ec953SBarry Smith   PetscLogDouble messageLength;       /* The total message lengths in this event */
189c60ec953SBarry Smith   PetscLogDouble numReductions;       /* The number of reductions in this event */
190e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;         /* How much the resident memory has increased in this event */
191e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;      /* How much the maximum malloced space has increased in this event */
192e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;         /* How much the space was malloced and kept during this event */
193e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */
194091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
195bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
196bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
197bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
198bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
199958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
200958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
201bec0b493Shannah_mairs #endif
202aa213bdcSJed Brown } PetscEventPerfInfo;
203c60ec953SBarry Smith 
204aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
205aa213bdcSJed Brown struct _n_PetscEventRegLog {
2066a6a9b46SSatish Balay   int                numEvents; /* The number of registered events */
2076a6a9b46SSatish Balay   int                maxEvents; /* The maximum number of events */
208aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
2096a6a9b46SSatish Balay };
2106a6a9b46SSatish Balay 
211aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
212aa213bdcSJed Brown struct _n_PetscEventPerfLog {
2136a6a9b46SSatish Balay   int                 numEvents; /* The number of logging events */
2146a6a9b46SSatish Balay   int                 maxEvents; /* The maximum number of events */
215aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
2166a6a9b46SSatish Balay };
217c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
218c60ec953SBarry Smith /*
219aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
2206a6a9b46SSatish Balay 
221aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
222c60ec953SBarry Smith */
223aa213bdcSJed Brown typedef struct _PetscStageInfo {
2246a6a9b46SSatish Balay   char              *name;     /* The stage name */
225ace3abfcSBarry Smith   PetscBool          used;     /* The stage was pushed on this processor */
226aa213bdcSJed Brown   PetscEventPerfInfo perfInfo; /* The stage performance information */
227aa213bdcSJed Brown   PetscEventPerfLog  eventLog; /* The event information for this stage */
228aa213bdcSJed Brown   PetscClassPerfLog  classLog; /* The class information for this stage */
229a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
230a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this stage */
231a0c7f9aaSSamuel Khuvis #endif
232aa213bdcSJed Brown } PetscStageInfo;
2336a6a9b46SSatish Balay 
234aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
235aa213bdcSJed Brown struct _n_PetscStageLog {
2366a6a9b46SSatish Balay   int              numStages; /* The number of registered stages */
2376a6a9b46SSatish Balay   int              maxStages; /* The maximum number of stages */
238aa213bdcSJed Brown   PetscIntStack    stack;     /* The stack for active stages */
239aa213bdcSJed Brown   int              curStage;  /* The current stage (only used in macros so we don't call PetscIntStackTop) */
240aa213bdcSJed Brown   PetscStageInfo  *stageInfo; /* The information for each stage */
241aa213bdcSJed Brown   PetscEventRegLog eventLog;  /* The registered events */
242aa213bdcSJed Brown   PetscClassRegLog classLog;  /* The registered classes */
2436a6a9b46SSatish Balay };
244217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
245fee518ebSJed Brown 
246d71ae5a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectParent() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p)
247d71ae5a4SJacob Faibussowitsch {
2484f839811SJacob Faibussowitsch   (void)o;
2494f839811SJacob Faibussowitsch   (void)p;
2503ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
2514dfa11a4SJacob Faibussowitsch }
2524dfa11a4SJacob Faibussowitsch 
253d71ae5a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectMemory() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m)
254d71ae5a4SJacob Faibussowitsch {
2554f839811SJacob Faibussowitsch   (void)o;
2564f839811SJacob Faibussowitsch   (void)m;
2573ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
2584dfa11a4SJacob Faibussowitsch }
2593bb1ff40SBarry Smith 
260aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/
261aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog  petsc_stageLog;
262f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *);
263f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *);
264f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *);
265614700edSBarry Smith 
266fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
26777c4ece6SBarry Smith 
268aa482453SBarry Smith   #if defined(PETSC_HAVE_MPE)
269014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
270014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
27177c4ece6SBarry Smith   #endif
27277c4ece6SBarry Smith 
273014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
274014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
275014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
276014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
27777c4ece6SBarry Smith 
2789566063dSJacob Faibussowitsch   #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));)
2793ba16761SJacob Faibussowitsch   #define PetscLogObjectCreate(h)        ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : PETSC_SUCCESS)
2803ba16761SJacob Faibussowitsch   #define PetscLogObjectDestroy(h)       ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : PETSC_SUCCESS)
2813ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
282fa2bb9feSLisandro Dalcin 
2838ba1e511SMatthew Knepley /* Initialization functions */
284bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
285014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
286bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
287014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
288014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
289014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
290fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *);
2919371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
292fa2bb9feSLisandro Dalcin 
2938ba1e511SMatthew Knepley /* Output functions */
294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
295f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
29731d06abdSBarry Smith 
2984dd65854SConnor Ward /* Status checking functions */
2994dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *);
3004dd65854SConnor Ward 
301fa2bb9feSLisandro Dalcin /* Stage functions */
302014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *);
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
304014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool);
306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *);
307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool);
308014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *);
309014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *);
310f5d6ab90SLisandro Dalcin 
3118ba1e511SMatthew Knepley /* Event functions */
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *);
313217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool);
314fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
315fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
318c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
319c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool);
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
322014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
3238c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *);
32413230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *);
325891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
3265d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
3277a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent);
3287a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void);
3298ba1e511SMatthew Knepley 
330e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory;
331e3ed9ee7SBarry Smith 
332fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogSyncOn; /* true if logging synchronization is enabled */
33362872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
33462872c28SLisandro Dalcin 
33562872c28SLisandro Dalcin   #define PetscLogEventSync(e, comm) \
3363ba16761SJacob Faibussowitsch     ((PetscErrorCode)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? PetscLogEventSynchronize((e), (comm)) : PETSC_SUCCESS)))
33777c4ece6SBarry Smith 
33852e6d16bSBarry Smith   #define PetscLogEventBegin(e, o1, o2, o3, o4) \
3393ba16761SJacob Faibussowitsch     ((PetscErrorCode)((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (PetscErrorCode)(((*PetscLogPLB)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPushCurrentEvent_Internal(e)) : PETSC_SUCCESS))
340043328b6SSatish Balay 
34152e6d16bSBarry Smith   #define PetscLogEventEnd(e, o1, o2, o3, o4) \
3423ba16761SJacob Faibussowitsch     ((PetscErrorCode)((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (PetscErrorCode)(((*PetscLogPLE)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPopCurrentEvent_Internal()) : PETSC_SUCCESS))
34377c4ece6SBarry Smith 
344014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *);
345014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
346003131ecSBarry Smith 
347c708d6e3SStefano Zampini /* Global flop counter */
348c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
349c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
350c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_ct;
351c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_ct;
352c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_ct;
353c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_len;
354c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_len;
355c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_len;
356c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_len;
357c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
358c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gather_ct;
359c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
360c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_ct;
361c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
362c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
363c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
364c708d6e3SStefano Zampini 
365c708d6e3SStefano Zampini /* Thread local storage */
366c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th;
367c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th;
368c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th;
369c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th;
370c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th;
371c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th;
372c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th;
373c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th;
374c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th;
375c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th;
376c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th;
377c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th;
378c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th;
379c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th;
380c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th;
381c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th;
382c708d6e3SStefano Zampini 
383c708d6e3SStefano Zampini   /*
384c708d6e3SStefano Zampini    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
385c708d6e3SStefano Zampini 
386c708d6e3SStefano Zampini    For the complex numbers version, note that
387c708d6e3SStefano Zampini        1 complex addition = 2 flops
388c708d6e3SStefano Zampini        1 complex multiplication = 6 flops,
389c708d6e3SStefano Zampini    where we define 1 flop as that for a double precision scalar.  We roughly approximate
390c708d6e3SStefano Zampini    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
391c708d6e3SStefano Zampini    to the assumption that we're counting mostly additions and multiplications -- and
392c708d6e3SStefano Zampini    roughly the same number of each.  More accurate counting could be done by distinguishing
393c708d6e3SStefano Zampini    among the various arithmetic operations.
394c708d6e3SStefano Zampini  */
395c708d6e3SStefano Zampini 
396c708d6e3SStefano Zampini   #if defined(PETSC_USE_COMPLEX)
397c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 4.0
398c708d6e3SStefano Zampini   #else
399c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 1.0
400c708d6e3SStefano Zampini   #endif
401c708d6e3SStefano Zampini 
402c708d6e3SStefano Zampini /*@C
403c708d6e3SStefano Zampini        PetscLogFlops - Log how many flops are performed in a calculation
404c708d6e3SStefano Zampini 
405c708d6e3SStefano Zampini    Input Parameter:
406c708d6e3SStefano Zampini .   flops - the number of flops
407c708d6e3SStefano Zampini 
408c708d6e3SStefano Zampini    Level: intermediate
409c708d6e3SStefano Zampini 
410c200f75eSSatish Balay    Note:
411c200f75eSSatish Balay      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
412c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
413c200f75eSSatish Balay 
414c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`
415c708d6e3SStefano Zampini @*/
416c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n)
417c708d6e3SStefano Zampini {
418c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
419c708d6e3SStefano Zampini   return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n);
420c708d6e3SStefano Zampini }
421c708d6e3SStefano Zampini 
422ce85283eSBarry Smith   /*
423f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
424f621e05eSBarry Smith    their sizes.
425f621e05eSBarry Smith 
426af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
427ce85283eSBarry Smith    uses macros to defined the MPI operations.
42815308354SBarry Smith 
42915308354SBarry Smith      It does not work correctly from HP-UX because it processes the
430bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
431b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
4327c1e34a4SSatish Balay 
433f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
434ce85283eSBarry Smith */
435d5bc873cSPierre Jolivet   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
43677a39924SBarry Smith /*
43777a39924SBarry Smith    Logging of MPI activities
43877a39924SBarry Smith */
439c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
440d71ae5a4SJacob Faibussowitsch {
441f12d10ccSJunchao Zhang   PetscMPIInt typesize;
4425f80ce2aSJacob Faibussowitsch 
4433ba16761SJacob Faibussowitsch   if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS;
4449566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
445c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize));
446f95db71bSBarry Smith }
44777a39924SBarry Smith 
448c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
449d71ae5a4SJacob Faibussowitsch {
450f12d10ccSJunchao Zhang   PetscMPIInt    typesize, size, p;
451c708d6e3SStefano Zampini   PetscLogDouble l;
4523b9284c0SMatthew G Knepley 
4533ba16761SJacob Faibussowitsch   if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS;
4549566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
4559566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
456c708d6e3SStefano Zampini   for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize);
457c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, l);
4583b9284c0SMatthew G Knepley }
4593b9284c0SMatthew G Knepley 
46072b11a25SBarry Smith /*
46172b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
46272b11a25SBarry Smith */
463d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm)
464d71ae5a4SJacob Faibussowitsch {
4659371c9d4SSatish Balay   PetscMPIInt size;
4669371c9d4SSatish Balay   MPI_Comm_size(comm, &size);
4679371c9d4SSatish Balay   return size > 1;
46872b11a25SBarry Smith }
46972b11a25SBarry Smith 
470c708d6e3SStefano Zampini     #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \
471c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPI_Irecv((buf), (count), (datatype), (source), (tag), (comm), (request)))
47215308354SBarry Smith 
473c708d6e3SStefano Zampini     #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \
474c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPI_Irecv_c((buf), (count), (datatype), (source), (tag), (comm), (request)))
475c87b50c4SJunchao Zhang 
476c708d6e3SStefano Zampini     #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \
477c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPI_Isend((buf), (count), (datatype), (dest), (tag), (comm), (request)))
47815308354SBarry Smith 
479c708d6e3SStefano Zampini     #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \
480c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPI_Isend_c((buf), (count), (datatype), (dest), (tag), (comm), (request)))
481c87b50c4SJunchao Zhang 
482c708d6e3SStefano Zampini     #define MPI_Startall_irecv(count, datatype, number, requests) \
483c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, number) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || ((number) && MPI_Startall((number), (requests))))
4840d4b0b6cSBarry Smith 
485c708d6e3SStefano Zampini     #define MPI_Startall_isend(count, datatype, number, requests) \
486c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, number) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || ((number) && MPI_Startall((number), (requests))))
4870d4b0b6cSBarry Smith 
488c708d6e3SStefano Zampini     #define MPI_Start_isend(count, datatype, requests) (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_isend_len), (&petsc_isend_len_th)) || MPI_Start((requests)))
4890d4b0b6cSBarry Smith 
490c708d6e3SStefano Zampini     #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \
491c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Recv((buf), (count), (datatype), (source), (tag), (comm), (status)))
49215308354SBarry Smith 
493c708d6e3SStefano Zampini     #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \
494c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Recv_c((buf), (count), (datatype), (source), (tag), (comm), (status)))
495c87b50c4SJunchao Zhang 
496c708d6e3SStefano Zampini     #define MPI_Send(buf, count, datatype, dest, tag, comm) \
497c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Send((buf), (count), (datatype), (dest), (tag), (comm)))
49877a39924SBarry Smith 
499c708d6e3SStefano Zampini     #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \
500c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Send_c((buf), (count), (datatype), (dest), (tag), (comm)))
501c87b50c4SJunchao Zhang 
502c708d6e3SStefano Zampini     #define MPI_Wait(request, status) (PetscAddLogDouble(&petsc_wait_ct, &petsc_wait_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPI_Wait((request), (status)))
50377a39924SBarry Smith 
504c708d6e3SStefano Zampini     #define MPI_Waitany(a, b, c, d) (PetscAddLogDouble(&petsc_wait_any_ct, &petsc_wait_any_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPI_Waitany((a), (b), (c), (d)))
50577a39924SBarry Smith 
506c708d6e3SStefano Zampini     #define MPI_Waitall(count, array_of_requests, array_of_statuses) \
507c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_wait_all_ct, &petsc_wait_all_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, count) || MPI_Waitall((count), (array_of_requests), (array_of_statuses)))
50877a39924SBarry Smith 
509c708d6e3SStefano Zampini     #define MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm) (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Allreduce((sendbuf), (recvbuf), (count), (datatype), (op), (comm)))
5103914022bSBarry Smith 
511c708d6e3SStefano Zampini     #define MPI_Bcast(buffer, count, datatype, root, comm) (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Bcast((buffer), (count), (datatype), (root), (comm)))
51254fe5c21SBarry Smith 
513c708d6e3SStefano Zampini     #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \
514c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm)))
515d6e4c47cSJed Brown 
5163b9284c0SMatthew G Knepley     #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
517c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Alltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm)))
5183b9284c0SMatthew G Knepley 
5193b9284c0SMatthew G Knepley     #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \
520c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Alltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm)))
5213b9284c0SMatthew G Knepley 
522c708d6e3SStefano Zampini     #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
523c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm)))
52401faf4e4SMatthew Knepley 
52501faf4e4SMatthew Knepley     #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \
526c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm)))
52701faf4e4SMatthew Knepley 
52801faf4e4SMatthew Knepley     #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
529c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Gather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm)))
53001faf4e4SMatthew Knepley 
53101faf4e4SMatthew Knepley     #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \
532c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Gatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm)))
53301faf4e4SMatthew Knepley 
53401faf4e4SMatthew Knepley     #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
535c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Scatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm)))
53601faf4e4SMatthew Knepley 
53701faf4e4SMatthew Knepley     #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \
538c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Scatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm)))
539f12d10ccSJunchao Zhang 
540f12d10ccSJunchao Zhang     #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
541c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Ialltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request)))
542f12d10ccSJunchao Zhang 
543f12d10ccSJunchao Zhang     #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \
544c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Ialltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm), (request)))
545f12d10ccSJunchao Zhang 
546f12d10ccSJunchao Zhang     #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
547c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request)))
548f12d10ccSJunchao Zhang 
549f12d10ccSJunchao Zhang     #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \
550c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request)))
551f12d10ccSJunchao Zhang 
552f12d10ccSJunchao Zhang     #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
553c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Igather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request)))
554f12d10ccSJunchao Zhang 
555f12d10ccSJunchao Zhang     #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \
556c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Igatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm), (request)))
557f12d10ccSJunchao Zhang 
558f12d10ccSJunchao Zhang     #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
559c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Iscatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request)))
560f12d10ccSJunchao Zhang 
561f12d10ccSJunchao Zhang     #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
562c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Iscatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request)))
563f12d10ccSJunchao Zhang 
564*715b587bSJunchao Zhang     #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \
565*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPIX_Send_enqueue((buf), (count), (datatype), (dest), (tag), (comm)))
566*715b587bSJunchao Zhang 
567*715b587bSJunchao Zhang     #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \
568*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPIX_Recv_enqueue((buf), (count), (datatype), (source), (tag), (comm), (status)))
569*715b587bSJunchao Zhang 
570*715b587bSJunchao Zhang     #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \
571*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPIX_Isend_enqueue((buf), (count), (datatype), (dest), (tag), (comm), (request)))
572*715b587bSJunchao Zhang 
573*715b587bSJunchao Zhang     #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \
574*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPIX_Irecv_enqueue((buf), (count), (datatype), (source), (tag), (comm), (request)))
575*715b587bSJunchao Zhang 
576*715b587bSJunchao Zhang     #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \
577*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm)))
578*715b587bSJunchao Zhang 
579*715b587bSJunchao Zhang     #define MPIX_Wait_enqueue(request, status) (PetscAddLogDouble(&petsc_wait_ct, &petsc_wait_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPIX_Wait_enqueue((request), (status)))
580*715b587bSJunchao Zhang 
581*715b587bSJunchao Zhang     #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \
582*715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_wait_all_ct, &petsc_wait_all_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, count) || MPIX_Waitall_enqueue((count), (array_of_requests), (array_of_statuses)))
5830d4b0b6cSBarry Smith   #else
5840d4b0b6cSBarry Smith 
5859371c9d4SSatish Balay     #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5860d4b0b6cSBarry Smith 
5879371c9d4SSatish Balay     #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5880d4b0b6cSBarry Smith 
5899371c9d4SSatish Balay     #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests)))
5900d4b0b6cSBarry Smith 
591c9b973beSBarry Smith   #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
592614700edSBarry Smith 
593df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/
594614700edSBarry Smith 
595e3ed9ee7SBarry Smith   #define PetscLogMemory PETSC_FALSE
596e3ed9ee7SBarry Smith 
5973ba16761SJacob Faibussowitsch   #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS)
5983ba16761SJacob Faibussowitsch   #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS)
599614700edSBarry Smith 
6003ba16761SJacob Faibussowitsch   #define PetscLogStageRegister(a, b)   PETSC_SUCCESS
6013ba16761SJacob Faibussowitsch   #define PetscLogStagePush(a)          PETSC_SUCCESS
6023ba16761SJacob Faibussowitsch   #define PetscLogStagePop()            PETSC_SUCCESS
6033ba16761SJacob Faibussowitsch   #define PetscLogStageSetActive(a, b)  PETSC_SUCCESS
6043ba16761SJacob Faibussowitsch   #define PetscLogStageGetActive(a, b)  PETSC_SUCCESS
6053ba16761SJacob Faibussowitsch   #define PetscLogStageGetVisible(a, b) PETSC_SUCCESS
6063ba16761SJacob Faibussowitsch   #define PetscLogStageSetVisible(a, b) PETSC_SUCCESS
6073ba16761SJacob Faibussowitsch   #define PetscLogStageGetId(a, b)      (*(b) = 0, PETSC_SUCCESS)
608f5d6ab90SLisandro Dalcin 
6093ba16761SJacob Faibussowitsch   #define PetscLogEventRegister(a, b, c)    PETSC_SUCCESS
6103ba16761SJacob Faibussowitsch   #define PetscLogEventSetCollective(a, b)  PETSC_SUCCESS
6113ba16761SJacob Faibussowitsch   #define PetscLogEventIncludeClass(a)      PETSC_SUCCESS
6123ba16761SJacob Faibussowitsch   #define PetscLogEventExcludeClass(a)      PETSC_SUCCESS
6133ba16761SJacob Faibussowitsch   #define PetscLogEventActivate(a)          PETSC_SUCCESS
6143ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivate(a)        PETSC_SUCCESS
6153ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivatePush(a)    PETSC_SUCCESS
6163ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivatePop(a)     PETSC_SUCCESS
6173ba16761SJacob Faibussowitsch   #define PetscLogEventActivateClass(a)     PETSC_SUCCESS
6183ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivateClass(a)   PETSC_SUCCESS
6193ba16761SJacob Faibussowitsch   #define PetscLogEventSetActiveAll(a, b)   PETSC_SUCCESS
6203ba16761SJacob Faibussowitsch   #define PetscLogEventGetId(a, b)          (*(b) = 0, PETSC_SUCCESS)
6213ba16761SJacob Faibussowitsch   #define PetscLogEventGetPerfInfo(a, b, c) PETSC_SUCCESS
6223ba16761SJacob Faibussowitsch   #define PetscLogEventSetDof(a, b, c)      PETSC_SUCCESS
6233ba16761SJacob Faibussowitsch   #define PetscLogEventSetError(a, b, c)    PETSC_SUCCESS
62477c4ece6SBarry Smith 
6253ba16761SJacob Faibussowitsch   #define PetscLogPLB PETSC_SUCCESS
6263ba16761SJacob Faibussowitsch   #define PetscLogPLE PETSC_SUCCESS
6273ba16761SJacob Faibussowitsch   #define PetscLogPHC PETSC_SUCCESS
6283ba16761SJacob Faibussowitsch   #define PetscLogPHD PETSC_SUCCESS
629f5d6ab90SLisandro Dalcin 
6303ba16761SJacob Faibussowitsch   #define PetscLogObjectParents(p, n, c) PETSC_SUCCESS
6313ba16761SJacob Faibussowitsch   #define PetscLogObjectCreate(h)        PETSC_SUCCESS
6323ba16761SJacob Faibussowitsch   #define PetscLogObjectDestroy(h)       PETSC_SUCCESS
6333ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
634fa2bb9feSLisandro Dalcin 
6353ba16761SJacob Faibussowitsch   #define PetscLogDefaultBegin()     PETSC_SUCCESS
6363ba16761SJacob Faibussowitsch   #define PetscLogAllBegin()         PETSC_SUCCESS
6373ba16761SJacob Faibussowitsch   #define PetscLogNestedBegin()      PETSC_SUCCESS
6383ba16761SJacob Faibussowitsch   #define PetscLogTraceBegin(file)   PETSC_SUCCESS
6393ba16761SJacob Faibussowitsch   #define PetscLogActions(a)         PETSC_SUCCESS
6403ba16761SJacob Faibussowitsch   #define PetscLogObjects(a)         PETSC_SUCCESS
6413ba16761SJacob Faibussowitsch   #define PetscLogSetThreshold(a, b) PETSC_SUCCESS
6423ba16761SJacob Faibussowitsch   #define PetscLogSet(lb, le)        PETSC_SUCCESS
6433ba16761SJacob Faibussowitsch   #define PetscLogIsActive(flag)     (*(flag) = PETSC_FALSE, PETSC_SUCCESS)
644fa2bb9feSLisandro Dalcin 
6453ba16761SJacob Faibussowitsch   #define PetscLogView(viewer)      PETSC_SUCCESS
6463ba16761SJacob Faibussowitsch   #define PetscLogViewFromOptions() PETSC_SUCCESS
6473ba16761SJacob Faibussowitsch   #define PetscLogDump(c)           PETSC_SUCCESS
648fa2bb9feSLisandro Dalcin 
6493ba16761SJacob Faibussowitsch   #define PetscLogEventSync(e, comm)                            PETSC_SUCCESS
6503ba16761SJacob Faibussowitsch   #define PetscLogEventBegin(e, o1, o2, o3, o4)                 PETSC_SUCCESS
6513ba16761SJacob Faibussowitsch   #define PetscLogEventEnd(e, o1, o2, o3, o4)                   PETSC_SUCCESS
652ce6058e1SBarry Smith 
65323c86b1bSSatish Balay   /* If PETSC_USE_LOG is NOT defined, these still need to be! */
65423c86b1bSSatish Balay   #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
65523c86b1bSSatish Balay   #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
65623c86b1bSSatish Balay   #define MPI_Start_isend(count, datatype, requests)            MPI_Start(requests)
65723c86b1bSSatish Balay 
65823c86b1bSSatish Balay #endif /* PETSC_USE_LOG */
65923c86b1bSSatish Balay 
660204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \
661204a6943SJed Brown   do { \
662204a6943SJed Brown     PetscBool     PetscPreLoading = flag; \
663204a6943SJed Brown     int           PetscPreLoadMax, PetscPreLoadIt; \
664166c7f25SBarry Smith     PetscLogStage _stageNum; \
6659566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \
666204a6943SJed Brown     PetscPreLoadMax     = (int)(PetscPreLoading); \
667204a6943SJed Brown     PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \
668204a6943SJed Brown     for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \
669204a6943SJed Brown       PetscPreLoadingOn = PetscPreLoading; \
6709566063dSJacob Faibussowitsch       PetscCall(PetscBarrier(NULL)); \
6719566063dSJacob Faibussowitsch       if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6729566063dSJacob Faibussowitsch       else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6739566063dSJacob Faibussowitsch       PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
6749566063dSJacob Faibussowitsch       PetscCall(PetscLogStagePush(_stageNum));
6758e58c17dSMatthew Knepley 
676204a6943SJed Brown #define PetscPreLoadEnd() \
6779566063dSJacob Faibussowitsch   PetscCall(PetscLogStagePop()); \
678204a6943SJed Brown   PetscPreLoading = PETSC_FALSE; \
679043328b6SSatish Balay   } \
6809371c9d4SSatish Balay   } \
6819371c9d4SSatish Balay   while (0)
6828e58c17dSMatthew Knepley 
6839371c9d4SSatish Balay #define PetscPreLoadStage(name) \
6849371c9d4SSatish Balay   do { \
6859566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePop()); \
6869566063dSJacob Faibussowitsch     if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6879566063dSJacob Faibussowitsch     else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6889566063dSJacob Faibussowitsch     PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
6899566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePush(_stageNum)); \
690204a6943SJed Brown   } while (0)
691e9fa29b7SSatish Balay 
692ad14c47eSJed Brown /* some vars for logging */
693ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */
694ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;   /* true if we are currently in a preloading calculation */
695ad14c47eSJed Brown 
696c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE)
697c708d6e3SStefano Zampini 
698c708d6e3SStefano Zampini /* Global GPU counters */
699c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
700c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
701c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
702c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
703c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar;
704c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar;
705c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar;
706c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar;
707c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gflops;
708c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtime;
709c708d6e3SStefano Zampini 
710c708d6e3SStefano Zampini /* Thread local storage */
711c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th;
712c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th;
713c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th;
714c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th;
715c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th;
716c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th;
717c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th;
718c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th;
719c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th;
720c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th;
721c708d6e3SStefano Zampini 
722c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void);
723c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void);
724c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void);
725c708d6e3SStefano Zampini 
726c708d6e3SStefano Zampini /*@C
727c708d6e3SStefano Zampini        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
728c708d6e3SStefano Zampini 
729c708d6e3SStefano Zampini    Input Parameter:
730c708d6e3SStefano Zampini .   flops - the number of flops
731c708d6e3SStefano Zampini 
732c200f75eSSatish Balay    Level: intermediate
733c200f75eSSatish Balay 
734c708d6e3SStefano Zampini    Notes:
735c708d6e3SStefano Zampini      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
736c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
737c708d6e3SStefano Zampini 
738c708d6e3SStefano Zampini      The values are also added to the total flop count for the MPI rank that is set with `PetscLogFlops()`; hence the number of flops
739c708d6e3SStefano Zampini      just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()`
740c708d6e3SStefano Zampini 
741c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()`
742c708d6e3SStefano Zampini @*/
743c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
744c708d6e3SStefano Zampini {
745c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
7463ba16761SJacob Faibussowitsch   PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n));
7473ba16761SJacob Faibussowitsch   PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n));
7483ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
749c708d6e3SStefano Zampini }
750c708d6e3SStefano Zampini 
751c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
752c708d6e3SStefano Zampini {
7533ba16761SJacob Faibussowitsch   return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t);
754c708d6e3SStefano Zampini }
755c708d6e3SStefano Zampini 
756c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
757c708d6e3SStefano Zampini {
7583ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size);
759c708d6e3SStefano Zampini }
760c708d6e3SStefano Zampini 
761c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
762c708d6e3SStefano Zampini {
7633ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size);
764c708d6e3SStefano Zampini }
765c708d6e3SStefano Zampini 
766c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size)
767c708d6e3SStefano Zampini {
7683ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size);
769c708d6e3SStefano Zampini }
770c708d6e3SStefano Zampini 
771c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size)
772c708d6e3SStefano Zampini {
7733ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size);
774c708d6e3SStefano Zampini }
775c708d6e3SStefano Zampini #else
776c708d6e3SStefano Zampini 
7773ba16761SJacob Faibussowitsch   #define PetscLogCpuToGpu(a)       PETSC_SUCCESS
7783ba16761SJacob Faibussowitsch   #define PetscLogGpuToCpu(a)       PETSC_SUCCESS
7793ba16761SJacob Faibussowitsch   #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS
7803ba16761SJacob Faibussowitsch   #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS
7813ba16761SJacob Faibussowitsch   #define PetscLogGpuFlops(a)       PETSC_SUCCESS
7823ba16761SJacob Faibussowitsch   #define PetscLogGpuTime()         PETSC_SUCCESS
7833ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeAdd(a)     PETSC_SUCCESS
7843ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeBegin()    PETSC_SUCCESS
7853ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeEnd()      PETSC_SUCCESS
786c708d6e3SStefano Zampini 
787c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */
788c708d6e3SStefano Zampini 
789c708d6e3SStefano Zampini /* remove TLS defines */
790c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS
791c708d6e3SStefano Zampini #undef PETSC_TLS
792c708d6e3SStefano Zampini 
79397bb86f7SLois Curfman McInnes #endif
794