xref: /petsc/include/petsclog.h (revision d5bc873c4c50cf35d1ca30386e6d1f3a41b84f33)
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
177d3de750SJacob Faibussowitsch   #define PetscInfo(A, ...) 0
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 
338b86dd2eSJacob Faibussowitsch   Used as an input for `PetscInfoSetFilterCommSelf()`
34e94e781bSJacob Faibussowitsch 
35d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on
368b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators)
37d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
38d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1
39e94e781bSJacob Faibussowitsch 
40e94e781bSJacob Faibussowitsch   Level: intermediate
41e94e781bSJacob Faibussowitsch 
42db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()`
43e94e781bSJacob Faibussowitsch E*/
44e94e781bSJacob Faibussowitsch typedef enum {
45e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL       = -1,
46e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF   = 0,
47e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
48e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
49e94e781bSJacob Faibussowitsch 
50e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[];
51fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoDeactivateClass(PetscClassId);
52fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoActivateClass(PetscClassId);
53e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoEnabled(PetscClassId, PetscBool *);
54e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoAllow(PetscBool);
55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFile(const char[], const char[]);
56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetFile(char **, FILE **);
57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetClasses(PetscBool, PetscInt, const char *const *);
58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetClass(const char *, PetscBool *);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *);
608b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFromOptions(PetscOptions);
63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoDestroy(void);
64fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool         PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */
65fa2bb9feSLisandro Dalcin 
66b859824cSBarry Smith /*MC
67b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
68b859824cSBarry Smith      code.
69b859824cSBarry Smith 
70b859824cSBarry Smith     Level: intermediate
71b859824cSBarry Smith 
72d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStage`
73b859824cSBarry Smith M*/
74b859824cSBarry Smith typedef int PetscLogEvent;
75b859824cSBarry Smith 
76b859824cSBarry Smith /*MC
77b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
78b859824cSBarry Smith 
79b859824cSBarry Smith     Level: intermediate
80b859824cSBarry Smith 
81d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEvent`
82b859824cSBarry Smith M*/
83b859824cSBarry Smith typedef int PetscLogStage;
84b859824cSBarry Smith 
858ba1e511SMatthew Knepley #define PETSC_EVENT 1311311
86014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
8797bb86f7SLois Curfman McInnes 
88c708d6e3SStefano Zampini /* Handle multithreading */
89c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
90c708d6e3SStefano Zampini   #if defined(__cplusplus)
91c708d6e3SStefano Zampini     #define PETSC_TLS thread_local
92c708d6e3SStefano Zampini   #else
93c708d6e3SStefano Zampini     #define PETSC_TLS _Thread_local
94c708d6e3SStefano Zampini   #endif
95c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC
96c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
97c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
98c708d6e3SStefano Zampini #else
99c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS PETSC_EXTERN
100c708d6e3SStefano Zampini   #define PETSC_TLS
101c708d6e3SStefano Zampini   #define PetscAddLogDouble(a, b, c)          (*(a) += c, 0) || (*(b) += c, 0)
102c708d6e3SStefano Zampini   #define PetscAddLogDoubleCnt(a, b, c, d, e) PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e)
103c708d6e3SStefano Zampini #endif
10419b02663SBarry Smith 
10531d06abdSBarry Smith /* We must make the following structures available to access the event
10631d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
10731d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
108d49d4b11SBarry Smith 
109fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
11031d06abdSBarry Smith */
111aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
1126a6a9b46SSatish Balay 
113217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
114c60ec953SBarry Smith /*
115aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
116c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
117c60ec953SBarry Smith        how much memory they use, etc.
118c60ec953SBarry Smith 
119aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
120c60ec953SBarry Smith */
1216a6a9b46SSatish Balay typedef struct {
122c60ec953SBarry Smith   char        *name;    /* The class name */
123c60ec953SBarry Smith   PetscClassId classid; /* The integer identifying this class */
124aa213bdcSJed Brown } PetscClassRegInfo;
1256a6a9b46SSatish Balay 
1266a6a9b46SSatish Balay typedef struct {
1270700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1286a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1296a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1304851f57dSBarry Smith   PetscLogDouble mem;          /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */
1314851f57dSBarry Smith   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */
132aa213bdcSJed Brown } PetscClassPerfInfo;
1336a6a9b46SSatish Balay 
134aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
135aa213bdcSJed Brown struct _n_PetscClassRegLog {
136c60ec953SBarry Smith   int                numClasses; /* The number of classes registered */
137c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
138aa213bdcSJed Brown   PetscClassRegInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
139c60ec953SBarry Smith };
1406a6a9b46SSatish Balay 
141aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
142aa213bdcSJed Brown struct _n_PetscClassPerfLog {
143c60ec953SBarry Smith   int                 numClasses; /* The number of logging classes */
144c60ec953SBarry Smith   int                 maxClasses; /* The maximum number of classes */
145aa213bdcSJed Brown   PetscClassPerfInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
146c60ec953SBarry Smith };
147c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
148c60ec953SBarry Smith /*
149aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
150c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
151c60ec953SBarry Smith        much time it takes, etc.
152c60ec953SBarry Smith 
153aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
154c60ec953SBarry Smith       of these for each stage.
155c60ec953SBarry Smith 
156c60ec953SBarry Smith */
1576a6a9b46SSatish Balay typedef struct {
1586a6a9b46SSatish Balay   char        *name;       /* The name of this event */
159c60ec953SBarry Smith   PetscClassId classid;    /* The class the event is associated with */
160217044c2SLisandro Dalcin   PetscBool    collective; /* Flag this event as collective */
161a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
162a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this event */
163a0c7f9aaSSamuel Khuvis #endif
1646a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE)
1656a6a9b46SSatish Balay   int mpe_id_begin; /* MPE IDs that define the event */
1666a6a9b46SSatish Balay   int mpe_id_end;
1676a6a9b46SSatish Balay #endif
168aa213bdcSJed Brown } PetscEventRegInfo;
1696a6a9b46SSatish Balay 
170c60ec953SBarry Smith typedef struct {
171c60ec953SBarry Smith   int            id;                  /* The integer identifying this event */
172ace3abfcSBarry Smith   PetscBool      active;              /* The flag to activate logging */
173ace3abfcSBarry Smith   PetscBool      visible;             /* The flag to print info in summary */
174c60ec953SBarry Smith   int            depth;               /* The nesting depth of the event call */
175c60ec953SBarry Smith   int            count;               /* The number of times this event was executed */
176c708d6e3SStefano Zampini   PetscLogDouble flops;               /* The flops used in this event */
177c708d6e3SStefano Zampini   PetscLogDouble flops2;              /* The square of flops used in this event */
178c708d6e3SStefano Zampini   PetscLogDouble flopsTmp;            /* The accumulator for flops used in this event */
179c708d6e3SStefano Zampini   PetscLogDouble time;                /* The time taken for this event */
180c708d6e3SStefano Zampini   PetscLogDouble time2;               /* The square of time taken for this event */
181c708d6e3SStefano Zampini   PetscLogDouble timeTmp;             /* The accumulator for time taken for this event */
182217044c2SLisandro Dalcin   PetscLogDouble syncTime;            /* The synchronization barrier time */
183891e75beSMatthew G. Knepley   PetscLogDouble dof[8];              /* The number of degrees of freedom associated with this event */
1845d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];           /* The errors (user-defined) associated with this event */
185c60ec953SBarry Smith   PetscLogDouble numMessages;         /* The number of messages in this event */
186c60ec953SBarry Smith   PetscLogDouble messageLength;       /* The total message lengths in this event */
187c60ec953SBarry Smith   PetscLogDouble numReductions;       /* The number of reductions in this event */
188e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;         /* How much the resident memory has increased in this event */
189e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;      /* How much the maximum malloced space has increased in this event */
190e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;         /* How much the space was malloced and kept during this event */
191e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */
192091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
193bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
194bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
195bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
196bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
197958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
198958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
199bec0b493Shannah_mairs #endif
200aa213bdcSJed Brown } PetscEventPerfInfo;
201c60ec953SBarry Smith 
202aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
203aa213bdcSJed Brown struct _n_PetscEventRegLog {
2046a6a9b46SSatish Balay   int                numEvents; /* The number of registered events */
2056a6a9b46SSatish Balay   int                maxEvents; /* The maximum number of events */
206aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
2076a6a9b46SSatish Balay };
2086a6a9b46SSatish Balay 
209aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
210aa213bdcSJed Brown struct _n_PetscEventPerfLog {
2116a6a9b46SSatish Balay   int                 numEvents; /* The number of logging events */
2126a6a9b46SSatish Balay   int                 maxEvents; /* The maximum number of events */
213aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
2146a6a9b46SSatish Balay };
215c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
216c60ec953SBarry Smith /*
217aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
2186a6a9b46SSatish Balay 
219aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
220c60ec953SBarry Smith */
221aa213bdcSJed Brown typedef struct _PetscStageInfo {
2226a6a9b46SSatish Balay   char              *name;     /* The stage name */
223ace3abfcSBarry Smith   PetscBool          used;     /* The stage was pushed on this processor */
224aa213bdcSJed Brown   PetscEventPerfInfo perfInfo; /* The stage performance information */
225aa213bdcSJed Brown   PetscEventPerfLog  eventLog; /* The event information for this stage */
226aa213bdcSJed Brown   PetscClassPerfLog  classLog; /* The class information for this stage */
227a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
228a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this stage */
229a0c7f9aaSSamuel Khuvis #endif
230aa213bdcSJed Brown } PetscStageInfo;
2316a6a9b46SSatish Balay 
232aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
233aa213bdcSJed Brown struct _n_PetscStageLog {
2346a6a9b46SSatish Balay   int              numStages; /* The number of registered stages */
2356a6a9b46SSatish Balay   int              maxStages; /* The maximum number of stages */
236aa213bdcSJed Brown   PetscIntStack    stack;     /* The stack for active stages */
237aa213bdcSJed Brown   int              curStage;  /* The current stage (only used in macros so we don't call PetscIntStackTop) */
238aa213bdcSJed Brown   PetscStageInfo  *stageInfo; /* The information for each stage */
239aa213bdcSJed Brown   PetscEventRegLog eventLog;  /* The registered events */
240aa213bdcSJed Brown   PetscClassRegLog classLog;  /* The registered classes */
2416a6a9b46SSatish Balay };
242217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
243fee518ebSJed Brown 
244d71ae5a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectParent() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p)
245d71ae5a4SJacob Faibussowitsch {
2464f839811SJacob Faibussowitsch   (void)o;
2474f839811SJacob Faibussowitsch   (void)p;
2484dfa11a4SJacob Faibussowitsch   return 0;
2494dfa11a4SJacob Faibussowitsch }
2504dfa11a4SJacob Faibussowitsch 
251d71ae5a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectMemory() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m)
252d71ae5a4SJacob Faibussowitsch {
2534f839811SJacob Faibussowitsch   (void)o;
2544f839811SJacob Faibussowitsch   (void)m;
2554dfa11a4SJacob Faibussowitsch   return 0;
2564dfa11a4SJacob Faibussowitsch }
2573bb1ff40SBarry Smith 
258aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/
259aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog  petsc_stageLog;
260f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *);
261f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *);
262f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *);
263614700edSBarry Smith 
264fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
26577c4ece6SBarry Smith 
266aa482453SBarry Smith   #if defined(PETSC_HAVE_MPE)
267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
26977c4ece6SBarry Smith   #endif
27077c4ece6SBarry Smith 
271014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
272014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
273014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
274014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
27577c4ece6SBarry Smith 
2769566063dSJacob Faibussowitsch   #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));)
277fa2bb9feSLisandro Dalcin   #define PetscLogObjectCreate(h)        ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
278fa2bb9feSLisandro Dalcin   #define PetscLogObjectDestroy(h)       ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
2793ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
280fa2bb9feSLisandro Dalcin 
2818ba1e511SMatthew Knepley /* Initialization functions */
282bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
283014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
284bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
285014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
286014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
287014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
288fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *);
2899371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
290fa2bb9feSLisandro Dalcin 
2918ba1e511SMatthew Knepley /* Output functions */
292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
293f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
29531d06abdSBarry Smith 
2964dd65854SConnor Ward /* Status checking functions */
2974dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *);
2984dd65854SConnor Ward 
299fa2bb9feSLisandro Dalcin /* Stage functions */
300014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *);
301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
302014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool);
304014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *);
305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool);
306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *);
307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *);
308f5d6ab90SLisandro Dalcin 
3098ba1e511SMatthew Knepley /* Event functions */
310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *);
311217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool);
312fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
313fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
316c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
317c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool);
319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
3218c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *);
32213230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *);
323891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
3245d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
3257a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent);
3267a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void);
3278ba1e511SMatthew Knepley 
328e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory;
329e3ed9ee7SBarry Smith 
330fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogSyncOn; /* true if logging synchronization is enabled */
33162872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
33262872c28SLisandro Dalcin 
33362872c28SLisandro Dalcin   #define PetscLogEventSync(e, comm) \
3349371c9d4SSatish Balay     (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? PetscLogEventSynchronize((e), (comm)) : 0))
33577c4ece6SBarry Smith 
33652e6d16bSBarry Smith   #define PetscLogEventBegin(e, o1, o2, o3, o4) \
3379371c9d4SSatish Balay     ((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (((*PetscLogPLB)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPushCurrentEvent_Internal(e)) : 0)
338043328b6SSatish Balay 
33952e6d16bSBarry Smith   #define PetscLogEventEnd(e, o1, o2, o3, o4) \
3409371c9d4SSatish Balay     ((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (((*PetscLogPLE)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPopCurrentEvent_Internal()) : 0)
34177c4ece6SBarry Smith 
342014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *);
343014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
344003131ecSBarry Smith 
345c708d6e3SStefano Zampini /* Global flop counter */
346c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
347c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
348c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_ct;
349c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_ct;
350c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_ct;
351c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_len;
352c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_len;
353c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_len;
354c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_len;
355c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
356c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gather_ct;
357c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
358c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_ct;
359c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
360c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
361c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
362c708d6e3SStefano Zampini 
363c708d6e3SStefano Zampini /* Thread local storage */
364c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th;
365c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th;
366c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th;
367c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th;
368c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th;
369c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th;
370c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th;
371c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th;
372c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th;
373c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th;
374c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th;
375c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th;
376c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th;
377c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th;
378c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th;
379c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th;
380c708d6e3SStefano Zampini 
381c708d6e3SStefano Zampini   /*
382c708d6e3SStefano Zampini    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
383c708d6e3SStefano Zampini 
384c708d6e3SStefano Zampini    For the complex numbers version, note that
385c708d6e3SStefano Zampini        1 complex addition = 2 flops
386c708d6e3SStefano Zampini        1 complex multiplication = 6 flops,
387c708d6e3SStefano Zampini    where we define 1 flop as that for a double precision scalar.  We roughly approximate
388c708d6e3SStefano Zampini    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
389c708d6e3SStefano Zampini    to the assumption that we're counting mostly additions and multiplications -- and
390c708d6e3SStefano Zampini    roughly the same number of each.  More accurate counting could be done by distinguishing
391c708d6e3SStefano Zampini    among the various arithmetic operations.
392c708d6e3SStefano Zampini  */
393c708d6e3SStefano Zampini 
394c708d6e3SStefano Zampini   #if defined(PETSC_USE_COMPLEX)
395c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 4.0
396c708d6e3SStefano Zampini   #else
397c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 1.0
398c708d6e3SStefano Zampini   #endif
399c708d6e3SStefano Zampini 
400c708d6e3SStefano Zampini /*@C
401c708d6e3SStefano Zampini        PetscLogFlops - Log how many flops are performed in a calculation
402c708d6e3SStefano Zampini 
403c708d6e3SStefano Zampini    Input Parameter:
404c708d6e3SStefano Zampini .   flops - the number of flops
405c708d6e3SStefano Zampini 
406c708d6e3SStefano Zampini    Level: intermediate
407c708d6e3SStefano Zampini 
408c200f75eSSatish Balay    Note:
409c200f75eSSatish Balay      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
410c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
411c200f75eSSatish Balay 
412c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`
413c708d6e3SStefano Zampini @*/
414c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n)
415c708d6e3SStefano Zampini {
416c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
417c708d6e3SStefano Zampini   return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n);
418c708d6e3SStefano Zampini }
419c708d6e3SStefano Zampini 
420ce85283eSBarry Smith   /*
421f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
422f621e05eSBarry Smith    their sizes.
423f621e05eSBarry Smith 
424af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
425ce85283eSBarry Smith    uses macros to defined the MPI operations.
42615308354SBarry Smith 
42715308354SBarry Smith      It does not work correctly from HP-UX because it processes the
428bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
429b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
4307c1e34a4SSatish Balay 
431f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
432ce85283eSBarry Smith */
433*d5bc873cSPierre Jolivet   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
43477a39924SBarry Smith /*
43577a39924SBarry Smith    Logging of MPI activities
43677a39924SBarry Smith */
437c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
438d71ae5a4SJacob Faibussowitsch {
439f12d10ccSJunchao Zhang   PetscMPIInt typesize;
4405f80ce2aSJacob Faibussowitsch 
4417d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
4429566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
443c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize));
444f95db71bSBarry Smith }
44577a39924SBarry Smith 
446c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
447d71ae5a4SJacob Faibussowitsch {
448f12d10ccSJunchao Zhang   PetscMPIInt    typesize, size, p;
449c708d6e3SStefano Zampini   PetscLogDouble l;
4503b9284c0SMatthew G Knepley 
4517d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
4529566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
4539566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
454c708d6e3SStefano Zampini   for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize);
455c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, l);
4563b9284c0SMatthew G Knepley }
4573b9284c0SMatthew G Knepley 
45872b11a25SBarry Smith /*
45972b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
46072b11a25SBarry Smith */
461d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm)
462d71ae5a4SJacob Faibussowitsch {
4639371c9d4SSatish Balay   PetscMPIInt size;
4649371c9d4SSatish Balay   MPI_Comm_size(comm, &size);
4659371c9d4SSatish Balay   return size > 1;
46672b11a25SBarry Smith }
46772b11a25SBarry Smith 
468c708d6e3SStefano Zampini     #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \
469c708d6e3SStefano 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)))
47015308354SBarry Smith 
471c708d6e3SStefano Zampini     #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \
472c708d6e3SStefano 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)))
473c87b50c4SJunchao Zhang 
474c708d6e3SStefano Zampini     #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \
475c708d6e3SStefano 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)))
47615308354SBarry Smith 
477c708d6e3SStefano Zampini     #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \
478c708d6e3SStefano 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)))
479c87b50c4SJunchao Zhang 
480c708d6e3SStefano Zampini     #define MPI_Startall_irecv(count, datatype, number, requests) \
481c708d6e3SStefano 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))))
4820d4b0b6cSBarry Smith 
483c708d6e3SStefano Zampini     #define MPI_Startall_isend(count, datatype, number, requests) \
484c708d6e3SStefano 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))))
4850d4b0b6cSBarry Smith 
486c708d6e3SStefano 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)))
4870d4b0b6cSBarry Smith 
488c708d6e3SStefano Zampini     #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \
489c708d6e3SStefano 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)))
49015308354SBarry Smith 
491c708d6e3SStefano Zampini     #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \
492c708d6e3SStefano 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)))
493c87b50c4SJunchao Zhang 
494c708d6e3SStefano Zampini     #define MPI_Send(buf, count, datatype, dest, tag, comm) \
495c708d6e3SStefano 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)))
49677a39924SBarry Smith 
497c708d6e3SStefano Zampini     #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \
498c708d6e3SStefano 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)))
499c87b50c4SJunchao Zhang 
500c708d6e3SStefano 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)))
50177a39924SBarry Smith 
502c708d6e3SStefano 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)))
50377a39924SBarry Smith 
504c708d6e3SStefano Zampini     #define MPI_Waitall(count, array_of_requests, array_of_statuses) \
505c708d6e3SStefano 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)))
50677a39924SBarry Smith 
507c708d6e3SStefano 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)))
5083914022bSBarry Smith 
509c708d6e3SStefano 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)))
51054fe5c21SBarry Smith 
511c708d6e3SStefano Zampini     #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \
512c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm)))
513d6e4c47cSJed Brown 
5143b9284c0SMatthew G Knepley     #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
515c708d6e3SStefano 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)))
5163b9284c0SMatthew G Knepley 
5173b9284c0SMatthew G Knepley     #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \
518c708d6e3SStefano 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)))
5193b9284c0SMatthew G Knepley 
520c708d6e3SStefano Zampini     #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
521c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm)))
52201faf4e4SMatthew Knepley 
52301faf4e4SMatthew Knepley     #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \
524c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm)))
52501faf4e4SMatthew Knepley 
52601faf4e4SMatthew Knepley     #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
527c708d6e3SStefano 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)))
52801faf4e4SMatthew Knepley 
52901faf4e4SMatthew Knepley     #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \
530c708d6e3SStefano 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)))
53101faf4e4SMatthew Knepley 
53201faf4e4SMatthew Knepley     #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
533c708d6e3SStefano 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)))
53401faf4e4SMatthew Knepley 
53501faf4e4SMatthew Knepley     #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \
536c708d6e3SStefano 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)))
537f12d10ccSJunchao Zhang 
538f12d10ccSJunchao Zhang     #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
539c708d6e3SStefano 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)))
540f12d10ccSJunchao Zhang 
541f12d10ccSJunchao Zhang     #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \
542c708d6e3SStefano 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)))
543f12d10ccSJunchao Zhang 
544f12d10ccSJunchao Zhang     #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
545c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request)))
546f12d10ccSJunchao Zhang 
547f12d10ccSJunchao Zhang     #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \
548c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request)))
549f12d10ccSJunchao Zhang 
550f12d10ccSJunchao Zhang     #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
551c708d6e3SStefano 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)))
552f12d10ccSJunchao Zhang 
553f12d10ccSJunchao Zhang     #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \
554c708d6e3SStefano 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)))
555f12d10ccSJunchao Zhang 
556f12d10ccSJunchao Zhang     #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
557c708d6e3SStefano 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)))
558f12d10ccSJunchao Zhang 
559f12d10ccSJunchao Zhang     #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
560c708d6e3SStefano 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)))
561f12d10ccSJunchao Zhang 
5620d4b0b6cSBarry Smith   #else
5630d4b0b6cSBarry Smith 
5649371c9d4SSatish Balay     #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5650d4b0b6cSBarry Smith 
5669371c9d4SSatish Balay     #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5670d4b0b6cSBarry Smith 
5689371c9d4SSatish Balay     #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests)))
5690d4b0b6cSBarry Smith 
570c9b973beSBarry Smith   #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
571614700edSBarry Smith 
572df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/
573614700edSBarry Smith 
574e3ed9ee7SBarry Smith   #define PetscLogMemory PETSC_FALSE
575e3ed9ee7SBarry Smith 
576b0a32e0cSBarry Smith   #define PetscLogFlops(n) 0
577fa2bb9feSLisandro Dalcin   #define PetscGetFlops(a) (*(a) = 0.0, 0)
578614700edSBarry Smith 
579fa2bb9feSLisandro Dalcin   #define PetscLogStageRegister(a, b)   0
580fa2bb9feSLisandro Dalcin   #define PetscLogStagePush(a)          0
581fa2bb9feSLisandro Dalcin   #define PetscLogStagePop()            0
582f5d6ab90SLisandro Dalcin   #define PetscLogStageSetActive(a, b)  0
583f5d6ab90SLisandro Dalcin   #define PetscLogStageGetActive(a, b)  0
584f5d6ab90SLisandro Dalcin   #define PetscLogStageGetVisible(a, b) 0
585f5d6ab90SLisandro Dalcin   #define PetscLogStageSetVisible(a, b) 0
586f5d6ab90SLisandro Dalcin   #define PetscLogStageGetId(a, b)      (*(b) = 0, 0)
587f5d6ab90SLisandro Dalcin 
588fa2bb9feSLisandro Dalcin   #define PetscLogEventRegister(a, b, c)    0
589fa2bb9feSLisandro Dalcin   #define PetscLogEventSetCollective(a, b)  0
590fa2bb9feSLisandro Dalcin   #define PetscLogEventIncludeClass(a)      0
591fa2bb9feSLisandro Dalcin   #define PetscLogEventExcludeClass(a)      0
592b0a32e0cSBarry Smith   #define PetscLogEventActivate(a)          0
593b0a32e0cSBarry Smith   #define PetscLogEventDeactivate(a)        0
594c00cb57fSBarry Smith   #define PetscLogEventDeactivatePush(a)    0
595c00cb57fSBarry Smith   #define PetscLogEventDeactivatePop(a)     0
596b0a32e0cSBarry Smith   #define PetscLogEventActivateClass(a)     0
597b0a32e0cSBarry Smith   #define PetscLogEventDeactivateClass(a)   0
598e8e7597cSSatish Balay   #define PetscLogEventSetActiveAll(a, b)   0
59946eb3cd7SSatish Balay   #define PetscLogEventGetId(a, b)          (*(b) = 0, 0)
600561b2a67SSatish Balay   #define PetscLogEventGetPerfInfo(a, b, c) 0
6019c702cfcSMatthew G. Knepley   #define PetscLogEventSetDof(a, b, c)      0
6029c702cfcSMatthew G. Knepley   #define PetscLogEventSetError(a, b, c)    0
60377c4ece6SBarry Smith 
6048b5db460SBarry Smith   #define PetscLogPLB 0
6058b5db460SBarry Smith   #define PetscLogPLE 0
6068b5db460SBarry Smith   #define PetscLogPHC 0
6078b5db460SBarry Smith   #define PetscLogPHD 0
608f5d6ab90SLisandro Dalcin 
609efee365bSSatish Balay   #define PetscLogObjectParents(p, n, c) 0
61052e6d16bSBarry Smith   #define PetscLogObjectCreate(h)        0
61152e6d16bSBarry Smith   #define PetscLogObjectDestroy(h)       0
6123ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
613fa2bb9feSLisandro Dalcin 
614bb1d7374SBarry Smith   #define PetscLogDefaultBegin()     0
615b0a32e0cSBarry Smith   #define PetscLogAllBegin()         0
616bb1d7374SBarry Smith   #define PetscLogNestedBegin()      0
617fa2bb9feSLisandro Dalcin   #define PetscLogTraceBegin(file)   0
61873fda44aSBarry Smith   #define PetscLogActions(a)         0
619fa2bb9feSLisandro Dalcin   #define PetscLogObjects(a)         0
620fa2bb9feSLisandro Dalcin   #define PetscLogSetThreshold(a, b) 0
621fa2bb9feSLisandro Dalcin   #define PetscLogSet(lb, le)        0
622340002ceSLawrence Mitchell   #define PetscLogIsActive(flag)     (*(flag) = PETSC_FALSE, 0)
623fa2bb9feSLisandro Dalcin 
624fa2bb9feSLisandro Dalcin   #define PetscLogView(viewer)      0
625fa2bb9feSLisandro Dalcin   #define PetscLogViewFromOptions() 0
626fa2bb9feSLisandro Dalcin   #define PetscLogDump(c)           0
627fa2bb9feSLisandro Dalcin 
62862872c28SLisandro Dalcin   #define PetscLogEventSync(e, comm)                            0
629fa2bb9feSLisandro Dalcin   #define PetscLogEventBegin(e, o1, o2, o3, o4)                 0
630fa2bb9feSLisandro Dalcin   #define PetscLogEventEnd(e, o1, o2, o3, o4)                   0
631ce6058e1SBarry Smith 
63223c86b1bSSatish Balay   /* If PETSC_USE_LOG is NOT defined, these still need to be! */
63323c86b1bSSatish Balay   #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
63423c86b1bSSatish Balay   #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
63523c86b1bSSatish Balay   #define MPI_Start_isend(count, datatype, requests)            MPI_Start(requests)
63623c86b1bSSatish Balay 
63723c86b1bSSatish Balay #endif /* PETSC_USE_LOG */
63823c86b1bSSatish Balay 
639204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \
640204a6943SJed Brown   do { \
641204a6943SJed Brown     PetscBool     PetscPreLoading = flag; \
642204a6943SJed Brown     int           PetscPreLoadMax, PetscPreLoadIt; \
643166c7f25SBarry Smith     PetscLogStage _stageNum; \
6449566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \
645204a6943SJed Brown     PetscPreLoadMax     = (int)(PetscPreLoading); \
646204a6943SJed Brown     PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \
647204a6943SJed Brown     for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \
648204a6943SJed Brown       PetscPreLoadingOn = PetscPreLoading; \
6499566063dSJacob Faibussowitsch       PetscCall(PetscBarrier(NULL)); \
6509566063dSJacob Faibussowitsch       if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6519566063dSJacob Faibussowitsch       else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6529566063dSJacob Faibussowitsch       PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
6539566063dSJacob Faibussowitsch       PetscCall(PetscLogStagePush(_stageNum));
6548e58c17dSMatthew Knepley 
655204a6943SJed Brown #define PetscPreLoadEnd() \
6569566063dSJacob Faibussowitsch   PetscCall(PetscLogStagePop()); \
657204a6943SJed Brown   PetscPreLoading = PETSC_FALSE; \
658043328b6SSatish Balay   } \
6599371c9d4SSatish Balay   } \
6609371c9d4SSatish Balay   while (0)
6618e58c17dSMatthew Knepley 
6629371c9d4SSatish Balay #define PetscPreLoadStage(name) \
6639371c9d4SSatish Balay   do { \
6649566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePop()); \
6659566063dSJacob Faibussowitsch     if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6669566063dSJacob Faibussowitsch     else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6679566063dSJacob Faibussowitsch     PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
6689566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePush(_stageNum)); \
669204a6943SJed Brown   } while (0)
670e9fa29b7SSatish Balay 
671ad14c47eSJed Brown /* some vars for logging */
672ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */
673ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;   /* true if we are currently in a preloading calculation */
674ad14c47eSJed Brown 
675c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE)
676c708d6e3SStefano Zampini 
677c708d6e3SStefano Zampini /* Global GPU counters */
678c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
679c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
680c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
681c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
682c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar;
683c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar;
684c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar;
685c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar;
686c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gflops;
687c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtime;
688c708d6e3SStefano Zampini 
689c708d6e3SStefano Zampini /* Thread local storage */
690c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th;
691c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th;
692c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th;
693c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th;
694c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th;
695c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th;
696c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th;
697c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th;
698c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th;
699c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th;
700c708d6e3SStefano Zampini 
701c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void);
702c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void);
703c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void);
704c708d6e3SStefano Zampini 
705c708d6e3SStefano Zampini /*@C
706c708d6e3SStefano Zampini        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
707c708d6e3SStefano Zampini 
708c708d6e3SStefano Zampini    Input Parameter:
709c708d6e3SStefano Zampini .   flops - the number of flops
710c708d6e3SStefano Zampini 
711c200f75eSSatish Balay    Level: intermediate
712c200f75eSSatish Balay 
713c708d6e3SStefano Zampini    Notes:
714c708d6e3SStefano Zampini      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
715c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
716c708d6e3SStefano Zampini 
717c708d6e3SStefano 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
718c708d6e3SStefano Zampini      just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()`
719c708d6e3SStefano Zampini 
720c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()`
721c708d6e3SStefano Zampini @*/
722c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
723c708d6e3SStefano Zampini {
724c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
725c708d6e3SStefano Zampini   PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n);
726c708d6e3SStefano Zampini   PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n);
727c708d6e3SStefano Zampini   return 0;
728c708d6e3SStefano Zampini }
729c708d6e3SStefano Zampini 
730c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
731c708d6e3SStefano Zampini {
732c708d6e3SStefano Zampini   PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t);
733c708d6e3SStefano Zampini   return 0;
734c708d6e3SStefano Zampini }
735c708d6e3SStefano Zampini 
736c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
737c708d6e3SStefano Zampini {
738c708d6e3SStefano Zampini   PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size);
739c708d6e3SStefano Zampini   return 0;
740c708d6e3SStefano Zampini }
741c708d6e3SStefano Zampini 
742c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
743c708d6e3SStefano Zampini {
744c708d6e3SStefano Zampini   PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size);
745c708d6e3SStefano Zampini   return 0;
746c708d6e3SStefano Zampini }
747c708d6e3SStefano Zampini 
748c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size)
749c708d6e3SStefano Zampini {
750c708d6e3SStefano Zampini   PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size);
751c708d6e3SStefano Zampini   return 0;
752c708d6e3SStefano Zampini }
753c708d6e3SStefano Zampini 
754c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size)
755c708d6e3SStefano Zampini {
756c708d6e3SStefano Zampini   PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size);
757c708d6e3SStefano Zampini   return 0;
758c708d6e3SStefano Zampini }
759c708d6e3SStefano Zampini #else
760c708d6e3SStefano Zampini 
761c708d6e3SStefano Zampini   #define PetscLogCpuToGpu(a)       0
762c708d6e3SStefano Zampini   #define PetscLogGpuToCpu(a)       0
763c708d6e3SStefano Zampini   #define PetscLogCpuToGpuScalar(a) 0
764c708d6e3SStefano Zampini   #define PetscLogGpuToCpuScalar(a) 0
765c708d6e3SStefano Zampini   #define PetscLogGpuFlops(a)       0
766c708d6e3SStefano Zampini   #define PetscLogGpuTime()         0
767c708d6e3SStefano Zampini   #define PetscLogGpuTimeAdd(a)     0
768c708d6e3SStefano Zampini   #define PetscLogGpuTimeBegin()    0
769c708d6e3SStefano Zampini   #define PetscLogGpuTimeEnd()      0
770c708d6e3SStefano Zampini 
771c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */
772c708d6e3SStefano Zampini 
773c708d6e3SStefano Zampini /* remove TLS defines */
774c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS
775c708d6e3SStefano Zampini #undef PETSC_TLS
776c708d6e3SStefano Zampini 
77797bb86f7SLois Curfman McInnes #endif
778