xref: /petsc/include/petsclog.h (revision 1c1ad86e71981700dcc8fd0d1cc1167892fbe263)
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>
9*1c1ad86eSToby Isaac #include <petsclogtypes.h>
10c8d78d4dSSatish Balay 
11*1c1ad86eSToby Isaac /* SUBMANSEC = Profiling */
12ac09b921SBarry Smith 
13fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */
143ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4);
15fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
167d3de750SJacob Faibussowitsch   #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__)
17fa2bb9feSLisandro Dalcin #else
183ba16761SJacob Faibussowitsch   #define PetscInfo(A, ...) PETSC_SUCCESS
19fa2bb9feSLisandro Dalcin #endif
20e94e781bSJacob Faibussowitsch 
21edd03b47SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
22edd03b47SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
23edd03b47SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
24edd03b47SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
25edd03b47SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
26edd03b47SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
27edd03b47SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
28edd03b47SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
29edd03b47SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__)
307d3de750SJacob Faibussowitsch 
31e94e781bSJacob Faibussowitsch /*E
3216a05f60SBarry Smith   PetscInfoCommFlag - Describes the method by which to filter information displayed by `PetscInfo()` by communicator size
33e94e781bSJacob Faibussowitsch 
34667f096bSBarry Smith   Values:
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 
42667f096bSBarry Smith   Note:
43667f096bSBarry Smith   Used as an input for `PetscInfoSetFilterCommSelf()`
44667f096bSBarry Smith 
45db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()`
46e94e781bSJacob Faibussowitsch E*/
47e94e781bSJacob Faibussowitsch typedef enum {
48e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL       = -1,
49e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF   = 0,
50e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
51e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
52e94e781bSJacob Faibussowitsch 
53e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[];
54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoDeactivateClass(PetscClassId);
55fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode    PetscInfoActivateClass(PetscClassId);
56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoEnabled(PetscClassId, PetscBool *);
57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoAllow(PetscBool);
58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFile(const char[], const char[]);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetFile(char **, FILE **);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetClasses(PetscBool, PetscInt, const char *const *);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetClass(const char *, PetscBool *);
62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *);
638b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]);
64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoSetFromOptions(PetscOptions);
66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode    PetscInfoDestroy(void);
67fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool         PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */
68fa2bb9feSLisandro Dalcin 
698ba1e511SMatthew Knepley #define PETSC_EVENT 1311311
70014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
7197bb86f7SLois Curfman McInnes 
72*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *);
73*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack);
74*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int);
75*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *);
76*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *);
77*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool *);
78*1c1ad86eSToby Isaac 
79c708d6e3SStefano Zampini /* Handle multithreading */
80c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
81c708d6e3SStefano Zampini   #if defined(__cplusplus)
82c708d6e3SStefano Zampini     #define PETSC_TLS thread_local
83c708d6e3SStefano Zampini   #else
84c708d6e3SStefano Zampini     #define PETSC_TLS _Thread_local
85c708d6e3SStefano Zampini   #endif
86c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC
87c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
88c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble);
89c708d6e3SStefano Zampini #else
90c708d6e3SStefano Zampini   #define PETSC_EXTERN_TLS PETSC_EXTERN
91c708d6e3SStefano Zampini   #define PETSC_TLS
923ba16761SJacob Faibussowitsch   #define PetscAddLogDouble(a, b, c)          ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS)))
933ba16761SJacob Faibussowitsch   #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e)))
94c708d6e3SStefano Zampini #endif
9519b02663SBarry Smith 
96c60ec953SBarry Smith /*
97aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
98c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
99c60ec953SBarry Smith        how much memory they use, etc.
100c60ec953SBarry Smith 
101aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
102c60ec953SBarry Smith */
1036a6a9b46SSatish Balay typedef struct {
104c60ec953SBarry Smith   char        *name;    /* The class name */
105c60ec953SBarry Smith   PetscClassId classid; /* The integer identifying this class */
106aa213bdcSJed Brown } PetscClassRegInfo;
1076a6a9b46SSatish Balay 
1086a6a9b46SSatish Balay typedef struct {
1090700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1106a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1116a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1124851f57dSBarry Smith   PetscLogDouble mem;          /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */
1134851f57dSBarry Smith   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */
114aa213bdcSJed Brown } PetscClassPerfInfo;
1156a6a9b46SSatish Balay 
116aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
117aa213bdcSJed Brown struct _n_PetscClassRegLog {
118c60ec953SBarry Smith   int                numClasses; /* The number of classes registered */
119c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
120aa213bdcSJed Brown   PetscClassRegInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
121c60ec953SBarry Smith };
1226a6a9b46SSatish Balay 
123aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
124aa213bdcSJed Brown struct _n_PetscClassPerfLog {
125c60ec953SBarry Smith   int                 numClasses; /* The number of logging classes */
126c60ec953SBarry Smith   int                 maxClasses; /* The maximum number of classes */
127aa213bdcSJed Brown   PetscClassPerfInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
128c60ec953SBarry Smith };
12916a05f60SBarry Smith 
130c60ec953SBarry Smith /*
131aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
132c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
133c60ec953SBarry Smith        much time it takes, etc.
134c60ec953SBarry Smith 
135aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
136c60ec953SBarry Smith       of these for each stage.
137c60ec953SBarry Smith 
138c60ec953SBarry Smith */
1396a6a9b46SSatish Balay typedef struct {
1406a6a9b46SSatish Balay   char        *name;       /* The name of this event */
141c60ec953SBarry Smith   PetscClassId classid;    /* The class the event is associated with */
142217044c2SLisandro Dalcin   PetscBool    collective; /* Flag this event as collective */
143a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
144a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this event */
145a0c7f9aaSSamuel Khuvis #endif
1466a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE)
1476a6a9b46SSatish Balay   int mpe_id_begin; /* MPE IDs that define the event */
1486a6a9b46SSatish Balay   int mpe_id_end;
1496a6a9b46SSatish Balay #endif
150aa213bdcSJed Brown } PetscEventRegInfo;
1516a6a9b46SSatish Balay 
152aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
153aa213bdcSJed Brown struct _n_PetscEventRegLog {
1546a6a9b46SSatish Balay   int                numEvents; /* The number of registered events */
1556a6a9b46SSatish Balay   int                maxEvents; /* The maximum number of events */
156aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1576a6a9b46SSatish Balay };
1586a6a9b46SSatish Balay 
159aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
160aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1616a6a9b46SSatish Balay   int                 numEvents; /* The number of logging events */
1626a6a9b46SSatish Balay   int                 maxEvents; /* The maximum number of events */
163aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1646a6a9b46SSatish Balay };
16516a05f60SBarry Smith 
166c60ec953SBarry Smith /*
167aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1686a6a9b46SSatish Balay 
169aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
170c60ec953SBarry Smith */
171aa213bdcSJed Brown typedef struct _PetscStageInfo {
1726a6a9b46SSatish Balay   char              *name;     /* The stage name */
173ace3abfcSBarry Smith   PetscBool          used;     /* The stage was pushed on this processor */
174aa213bdcSJed Brown   PetscEventPerfInfo perfInfo; /* The stage performance information */
175aa213bdcSJed Brown   PetscEventPerfLog  eventLog; /* The event information for this stage */
176aa213bdcSJed Brown   PetscClassPerfLog  classLog; /* The class information for this stage */
177a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS)
178a0c7f9aaSSamuel Khuvis   void *timer; /* Associated external tool timer for this stage */
179a0c7f9aaSSamuel Khuvis #endif
180aa213bdcSJed Brown } PetscStageInfo;
1816a6a9b46SSatish Balay 
182aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
183aa213bdcSJed Brown struct _n_PetscStageLog {
1846a6a9b46SSatish Balay   int              numStages; /* The number of registered stages */
1856a6a9b46SSatish Balay   int              maxStages; /* The maximum number of stages */
186aa213bdcSJed Brown   PetscIntStack    stack;     /* The stack for active stages */
187aa213bdcSJed Brown   int              curStage;  /* The current stage (only used in macros so we don't call PetscIntStackTop) */
188aa213bdcSJed Brown   PetscStageInfo  *stageInfo; /* The information for each stage */
189aa213bdcSJed Brown   PetscEventRegLog eventLog;  /* The registered events */
190aa213bdcSJed Brown   PetscClassRegLog classLog;  /* The registered classes */
1916a6a9b46SSatish Balay };
192fee518ebSJed Brown 
193edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectParent()", ) static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p)
194d71ae5a4SJacob Faibussowitsch {
1954f839811SJacob Faibussowitsch   (void)o;
1964f839811SJacob Faibussowitsch   (void)p;
1973ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
1984dfa11a4SJacob Faibussowitsch }
1994dfa11a4SJacob Faibussowitsch 
200edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectMemory()", ) static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m)
201d71ae5a4SJacob Faibussowitsch {
2024f839811SJacob Faibussowitsch   (void)o;
2034f839811SJacob Faibussowitsch   (void)m;
2043ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
2054dfa11a4SJacob Faibussowitsch }
2063bb1ff40SBarry Smith 
207aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/
208aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog  petsc_stageLog;
209f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *);
210f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *);
211f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *);
212614700edSBarry Smith 
213fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
21477c4ece6SBarry Smith 
215aa482453SBarry Smith   #if defined(PETSC_HAVE_MPE)
216014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
217014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
21877c4ece6SBarry Smith   #endif
21977c4ece6SBarry Smith 
220014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
221014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject);
222014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
223014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
22477c4ece6SBarry Smith 
2259566063dSJacob Faibussowitsch   #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));)
2263ba16761SJacob Faibussowitsch   #define PetscLogObjectCreate(h)        ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : PETSC_SUCCESS)
2273ba16761SJacob Faibussowitsch   #define PetscLogObjectDestroy(h)       ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : PETSC_SUCCESS)
2283ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
229fa2bb9feSLisandro Dalcin 
2308ba1e511SMatthew Knepley /* Initialization functions */
231bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
232014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
233bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
235014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
237fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *);
2389371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
239fa2bb9feSLisandro Dalcin 
2408ba1e511SMatthew Knepley /* Output functions */
241014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
242f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
243014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
24431d06abdSBarry Smith 
2454dd65854SConnor Ward /* Status checking functions */
2464dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *);
2474dd65854SConnor Ward 
248fa2bb9feSLisandro Dalcin /* Stage functions */
249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *);
250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
251014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
252014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool);
253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *);
254014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool);
255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *);
256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *);
257f5d6ab90SLisandro Dalcin 
2588ba1e511SMatthew Knepley /* Event functions */
259014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *);
260217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool);
261fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
262fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
263014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
264014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
265c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
266c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool);
268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
269014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
2708c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *);
27113230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *);
272891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
2735d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
2747a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent);
2757a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void);
2768ba1e511SMatthew Knepley 
277e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory;
278e3ed9ee7SBarry Smith 
279fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogSyncOn; /* true if logging synchronization is enabled */
28062872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
28162872c28SLisandro Dalcin 
28262872c28SLisandro Dalcin   #define PetscLogEventSync(e, comm) \
2833ba16761SJacob 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)))
28477c4ece6SBarry Smith 
28552e6d16bSBarry Smith   #define PetscLogEventBegin(e, o1, o2, o3, o4) \
2863ba16761SJacob 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))
287043328b6SSatish Balay 
28852e6d16bSBarry Smith   #define PetscLogEventEnd(e, o1, o2, o3, o4) \
2893ba16761SJacob 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))
29077c4ece6SBarry Smith 
291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *);
292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
293003131ecSBarry Smith 
294c708d6e3SStefano Zampini /* Global flop counter */
295c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
296c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
297c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_ct;
298c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_ct;
299c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_ct;
300c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_len;
301c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_len;
302c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_len;
303c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_len;
304c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
305c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gather_ct;
306c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
307c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_ct;
308c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
309c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
310c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
311c708d6e3SStefano Zampini 
312c708d6e3SStefano Zampini /* Thread local storage */
313c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th;
314c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th;
315c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th;
316c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th;
317c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th;
318c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th;
319c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th;
320c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th;
321c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th;
322c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th;
323c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th;
324c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th;
325c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th;
326c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th;
327c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th;
328c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th;
329c708d6e3SStefano Zampini 
330c708d6e3SStefano Zampini   /*
331c708d6e3SStefano Zampini    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
332c708d6e3SStefano Zampini 
333c708d6e3SStefano Zampini    For the complex numbers version, note that
334c708d6e3SStefano Zampini        1 complex addition = 2 flops
335c708d6e3SStefano Zampini        1 complex multiplication = 6 flops,
336c708d6e3SStefano Zampini    where we define 1 flop as that for a double precision scalar.  We roughly approximate
337c708d6e3SStefano Zampini    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
338c708d6e3SStefano Zampini    to the assumption that we're counting mostly additions and multiplications -- and
339c708d6e3SStefano Zampini    roughly the same number of each.  More accurate counting could be done by distinguishing
340c708d6e3SStefano Zampini    among the various arithmetic operations.
341c708d6e3SStefano Zampini  */
342c708d6e3SStefano Zampini 
343c708d6e3SStefano Zampini   #if defined(PETSC_USE_COMPLEX)
344c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 4.0
345c708d6e3SStefano Zampini   #else
346c708d6e3SStefano Zampini     #define PETSC_FLOPS_PER_OP 1.0
347c708d6e3SStefano Zampini   #endif
348c708d6e3SStefano Zampini 
349c708d6e3SStefano Zampini /*@C
350c708d6e3SStefano Zampini        PetscLogFlops - Log how many flops are performed in a calculation
351c708d6e3SStefano Zampini 
352c708d6e3SStefano Zampini    Input Parameter:
353c708d6e3SStefano Zampini .   flops - the number of flops
354c708d6e3SStefano Zampini 
355c708d6e3SStefano Zampini    Level: intermediate
356c708d6e3SStefano Zampini 
357c200f75eSSatish Balay    Note:
358c200f75eSSatish Balay      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
359c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
360c200f75eSSatish Balay 
361c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`
362c708d6e3SStefano Zampini @*/
363c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n)
364c708d6e3SStefano Zampini {
365c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
366c708d6e3SStefano Zampini   return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n);
367c708d6e3SStefano Zampini }
368c708d6e3SStefano Zampini 
369ce85283eSBarry Smith   /*
370f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
371f621e05eSBarry Smith    their sizes.
372f621e05eSBarry Smith 
373af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
374ce85283eSBarry Smith    uses macros to defined the MPI operations.
37515308354SBarry Smith 
37615308354SBarry Smith      It does not work correctly from HP-UX because it processes the
377bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
378b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3797c1e34a4SSatish Balay 
380f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
381ce85283eSBarry Smith */
382d5bc873cSPierre Jolivet   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
38377a39924SBarry Smith /*
38477a39924SBarry Smith    Logging of MPI activities
38577a39924SBarry Smith */
386c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
387d71ae5a4SJacob Faibussowitsch {
388f12d10ccSJunchao Zhang   PetscMPIInt typesize;
3895f80ce2aSJacob Faibussowitsch 
3903ba16761SJacob Faibussowitsch   if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS;
3919566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
392c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize));
393f95db71bSBarry Smith }
39477a39924SBarry Smith 
395c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th)
396d71ae5a4SJacob Faibussowitsch {
397f12d10ccSJunchao Zhang   PetscMPIInt    typesize, size, p;
398c708d6e3SStefano Zampini   PetscLogDouble l;
3993b9284c0SMatthew G Knepley 
4003ba16761SJacob Faibussowitsch   if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS;
4019566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
4029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type, &typesize));
403c708d6e3SStefano Zampini   for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize);
404c708d6e3SStefano Zampini   return PetscAddLogDouble(length, length_th, l);
4053b9284c0SMatthew G Knepley }
4063b9284c0SMatthew G Knepley 
40772b11a25SBarry Smith /*
40872b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
40972b11a25SBarry Smith */
410d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm)
411d71ae5a4SJacob Faibussowitsch {
4129371c9d4SSatish Balay   PetscMPIInt size;
4139371c9d4SSatish Balay   MPI_Comm_size(comm, &size);
4149371c9d4SSatish Balay   return size > 1;
41572b11a25SBarry Smith }
41672b11a25SBarry Smith 
417c708d6e3SStefano Zampini     #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \
418c708d6e3SStefano 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)))
41915308354SBarry Smith 
420c708d6e3SStefano Zampini     #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \
421c708d6e3SStefano 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)))
422c87b50c4SJunchao Zhang 
423c708d6e3SStefano Zampini     #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \
424c708d6e3SStefano 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)))
42515308354SBarry Smith 
426c708d6e3SStefano Zampini     #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \
427c708d6e3SStefano 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)))
428c87b50c4SJunchao Zhang 
429c708d6e3SStefano Zampini     #define MPI_Startall_irecv(count, datatype, number, requests) \
430c708d6e3SStefano 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))))
4310d4b0b6cSBarry Smith 
432c708d6e3SStefano Zampini     #define MPI_Startall_isend(count, datatype, number, requests) \
433c708d6e3SStefano 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))))
4340d4b0b6cSBarry Smith 
435c708d6e3SStefano 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)))
4360d4b0b6cSBarry Smith 
437c708d6e3SStefano Zampini     #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \
438c708d6e3SStefano 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)))
43915308354SBarry Smith 
440c708d6e3SStefano Zampini     #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \
441c708d6e3SStefano 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)))
442c87b50c4SJunchao Zhang 
443c708d6e3SStefano Zampini     #define MPI_Send(buf, count, datatype, dest, tag, comm) \
444c708d6e3SStefano 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)))
44577a39924SBarry Smith 
446c708d6e3SStefano Zampini     #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \
447c708d6e3SStefano 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)))
448c87b50c4SJunchao Zhang 
449c708d6e3SStefano 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)))
45077a39924SBarry Smith 
451c708d6e3SStefano 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)))
45277a39924SBarry Smith 
453c708d6e3SStefano Zampini     #define MPI_Waitall(count, array_of_requests, array_of_statuses) \
454c708d6e3SStefano 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)))
45577a39924SBarry Smith 
456c708d6e3SStefano 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)))
4573914022bSBarry Smith 
458c708d6e3SStefano 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)))
45954fe5c21SBarry Smith 
460c708d6e3SStefano Zampini     #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \
461c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm)))
462d6e4c47cSJed Brown 
4633b9284c0SMatthew G Knepley     #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
464c708d6e3SStefano 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)))
4653b9284c0SMatthew G Knepley 
4663b9284c0SMatthew G Knepley     #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \
467c708d6e3SStefano 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)))
4683b9284c0SMatthew G Knepley 
469c708d6e3SStefano Zampini     #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \
470c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm)))
47101faf4e4SMatthew Knepley 
47201faf4e4SMatthew Knepley     #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \
473c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm)))
47401faf4e4SMatthew Knepley 
47501faf4e4SMatthew Knepley     #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
476c708d6e3SStefano 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)))
47701faf4e4SMatthew Knepley 
47801faf4e4SMatthew Knepley     #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \
479c708d6e3SStefano 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)))
48001faf4e4SMatthew Knepley 
48101faf4e4SMatthew Knepley     #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \
482c708d6e3SStefano 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)))
48301faf4e4SMatthew Knepley 
48401faf4e4SMatthew Knepley     #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \
485c708d6e3SStefano 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)))
486f12d10ccSJunchao Zhang 
487f12d10ccSJunchao Zhang     #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
488c708d6e3SStefano 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)))
489f12d10ccSJunchao Zhang 
490f12d10ccSJunchao Zhang     #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \
491c708d6e3SStefano 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)))
492f12d10ccSJunchao Zhang 
493f12d10ccSJunchao Zhang     #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \
494c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request)))
495f12d10ccSJunchao Zhang 
496f12d10ccSJunchao Zhang     #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \
497c708d6e3SStefano Zampini       (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request)))
498f12d10ccSJunchao Zhang 
499f12d10ccSJunchao Zhang     #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
500c708d6e3SStefano 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)))
501f12d10ccSJunchao Zhang 
502f12d10ccSJunchao Zhang     #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \
503c708d6e3SStefano 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)))
504f12d10ccSJunchao Zhang 
505f12d10ccSJunchao Zhang     #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
506c708d6e3SStefano 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)))
507f12d10ccSJunchao Zhang 
508f12d10ccSJunchao Zhang     #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \
509c708d6e3SStefano 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)))
510f12d10ccSJunchao Zhang 
511715b587bSJunchao Zhang     #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \
512715b587bSJunchao 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)))
513715b587bSJunchao Zhang 
514715b587bSJunchao Zhang     #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \
515715b587bSJunchao 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)))
516715b587bSJunchao Zhang 
517715b587bSJunchao Zhang     #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \
518715b587bSJunchao 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)))
519715b587bSJunchao Zhang 
520715b587bSJunchao Zhang     #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \
521715b587bSJunchao 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)))
522715b587bSJunchao Zhang 
523715b587bSJunchao Zhang     #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \
524715b587bSJunchao Zhang       (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm)))
525715b587bSJunchao Zhang 
526715b587bSJunchao 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)))
527715b587bSJunchao Zhang 
528715b587bSJunchao Zhang     #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \
529715b587bSJunchao 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)))
5300d4b0b6cSBarry Smith   #else
5310d4b0b6cSBarry Smith 
5329371c9d4SSatish Balay     #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5330d4b0b6cSBarry Smith 
5349371c9d4SSatish Balay     #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests)))
5350d4b0b6cSBarry Smith 
5369371c9d4SSatish Balay     #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests)))
5370d4b0b6cSBarry Smith 
538c9b973beSBarry Smith   #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
539614700edSBarry Smith 
540df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/
541614700edSBarry Smith 
542e3ed9ee7SBarry Smith   #define PetscLogMemory PETSC_FALSE
543e3ed9ee7SBarry Smith 
5443ba16761SJacob Faibussowitsch   #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS)
5453ba16761SJacob Faibussowitsch   #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS)
546614700edSBarry Smith 
5473ba16761SJacob Faibussowitsch   #define PetscLogStageRegister(a, b)   PETSC_SUCCESS
5483ba16761SJacob Faibussowitsch   #define PetscLogStagePush(a)          PETSC_SUCCESS
5493ba16761SJacob Faibussowitsch   #define PetscLogStagePop()            PETSC_SUCCESS
5503ba16761SJacob Faibussowitsch   #define PetscLogStageSetActive(a, b)  PETSC_SUCCESS
5513ba16761SJacob Faibussowitsch   #define PetscLogStageGetActive(a, b)  PETSC_SUCCESS
5523ba16761SJacob Faibussowitsch   #define PetscLogStageGetVisible(a, b) PETSC_SUCCESS
5533ba16761SJacob Faibussowitsch   #define PetscLogStageSetVisible(a, b) PETSC_SUCCESS
5543ba16761SJacob Faibussowitsch   #define PetscLogStageGetId(a, b)      (*(b) = 0, PETSC_SUCCESS)
555f5d6ab90SLisandro Dalcin 
5563ba16761SJacob Faibussowitsch   #define PetscLogEventRegister(a, b, c)    PETSC_SUCCESS
5573ba16761SJacob Faibussowitsch   #define PetscLogEventSetCollective(a, b)  PETSC_SUCCESS
5583ba16761SJacob Faibussowitsch   #define PetscLogEventIncludeClass(a)      PETSC_SUCCESS
5593ba16761SJacob Faibussowitsch   #define PetscLogEventExcludeClass(a)      PETSC_SUCCESS
5603ba16761SJacob Faibussowitsch   #define PetscLogEventActivate(a)          PETSC_SUCCESS
5613ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivate(a)        PETSC_SUCCESS
5623ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivatePush(a)    PETSC_SUCCESS
5633ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivatePop(a)     PETSC_SUCCESS
5643ba16761SJacob Faibussowitsch   #define PetscLogEventActivateClass(a)     PETSC_SUCCESS
5653ba16761SJacob Faibussowitsch   #define PetscLogEventDeactivateClass(a)   PETSC_SUCCESS
5663ba16761SJacob Faibussowitsch   #define PetscLogEventSetActiveAll(a, b)   PETSC_SUCCESS
5673ba16761SJacob Faibussowitsch   #define PetscLogEventGetId(a, b)          (*(b) = 0, PETSC_SUCCESS)
5683ba16761SJacob Faibussowitsch   #define PetscLogEventGetPerfInfo(a, b, c) PETSC_SUCCESS
5693ba16761SJacob Faibussowitsch   #define PetscLogEventSetDof(a, b, c)      PETSC_SUCCESS
5703ba16761SJacob Faibussowitsch   #define PetscLogEventSetError(a, b, c)    PETSC_SUCCESS
57177c4ece6SBarry Smith 
5723ba16761SJacob Faibussowitsch   #define PetscLogPLB PETSC_SUCCESS
5733ba16761SJacob Faibussowitsch   #define PetscLogPLE PETSC_SUCCESS
5743ba16761SJacob Faibussowitsch   #define PetscLogPHC PETSC_SUCCESS
5753ba16761SJacob Faibussowitsch   #define PetscLogPHD PETSC_SUCCESS
576f5d6ab90SLisandro Dalcin 
5773ba16761SJacob Faibussowitsch   #define PetscLogObjectParents(p, n, c) PETSC_SUCCESS
5783ba16761SJacob Faibussowitsch   #define PetscLogObjectCreate(h)        PETSC_SUCCESS
5793ba16761SJacob Faibussowitsch   #define PetscLogObjectDestroy(h)       PETSC_SUCCESS
5803ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3);
581fa2bb9feSLisandro Dalcin 
5823ba16761SJacob Faibussowitsch   #define PetscLogDefaultBegin()     PETSC_SUCCESS
5833ba16761SJacob Faibussowitsch   #define PetscLogAllBegin()         PETSC_SUCCESS
5843ba16761SJacob Faibussowitsch   #define PetscLogNestedBegin()      PETSC_SUCCESS
5853ba16761SJacob Faibussowitsch   #define PetscLogTraceBegin(file)   PETSC_SUCCESS
5863ba16761SJacob Faibussowitsch   #define PetscLogActions(a)         PETSC_SUCCESS
5873ba16761SJacob Faibussowitsch   #define PetscLogObjects(a)         PETSC_SUCCESS
5883ba16761SJacob Faibussowitsch   #define PetscLogSetThreshold(a, b) PETSC_SUCCESS
5893ba16761SJacob Faibussowitsch   #define PetscLogSet(lb, le)        PETSC_SUCCESS
5903ba16761SJacob Faibussowitsch   #define PetscLogIsActive(flag)     (*(flag) = PETSC_FALSE, PETSC_SUCCESS)
591fa2bb9feSLisandro Dalcin 
5923ba16761SJacob Faibussowitsch   #define PetscLogView(viewer)      PETSC_SUCCESS
5933ba16761SJacob Faibussowitsch   #define PetscLogViewFromOptions() PETSC_SUCCESS
5943ba16761SJacob Faibussowitsch   #define PetscLogDump(c)           PETSC_SUCCESS
595fa2bb9feSLisandro Dalcin 
5963ba16761SJacob Faibussowitsch   #define PetscLogEventSync(e, comm)                            PETSC_SUCCESS
5973ba16761SJacob Faibussowitsch   #define PetscLogEventBegin(e, o1, o2, o3, o4)                 PETSC_SUCCESS
5983ba16761SJacob Faibussowitsch   #define PetscLogEventEnd(e, o1, o2, o3, o4)                   PETSC_SUCCESS
599ce6058e1SBarry Smith 
60023c86b1bSSatish Balay   /* If PETSC_USE_LOG is NOT defined, these still need to be! */
60123c86b1bSSatish Balay   #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
60223c86b1bSSatish Balay   #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests))
60323c86b1bSSatish Balay   #define MPI_Start_isend(count, datatype, requests)            MPI_Start(requests)
60423c86b1bSSatish Balay 
60523c86b1bSSatish Balay #endif /* PETSC_USE_LOG */
60623c86b1bSSatish Balay 
607204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \
608204a6943SJed Brown   do { \
609204a6943SJed Brown     PetscBool     PetscPreLoading = flag; \
610204a6943SJed Brown     int           PetscPreLoadMax, PetscPreLoadIt; \
611166c7f25SBarry Smith     PetscLogStage _stageNum; \
6129566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \
613204a6943SJed Brown     PetscPreLoadMax     = (int)(PetscPreLoading); \
614204a6943SJed Brown     PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \
615204a6943SJed Brown     for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \
616204a6943SJed Brown       PetscPreLoadingOn = PetscPreLoading; \
6179566063dSJacob Faibussowitsch       PetscCall(PetscBarrier(NULL)); \
6189566063dSJacob Faibussowitsch       if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6199566063dSJacob Faibussowitsch       else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6209566063dSJacob Faibussowitsch       PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
621a8f51744SPierre Jolivet       PetscCall(PetscLogStagePush(_stageNum))
6228e58c17dSMatthew Knepley 
623204a6943SJed Brown #define PetscPreLoadEnd() \
6249566063dSJacob Faibussowitsch   PetscCall(PetscLogStagePop()); \
625204a6943SJed Brown   PetscPreLoading = PETSC_FALSE; \
626043328b6SSatish Balay   } \
6279371c9d4SSatish Balay   } \
6289371c9d4SSatish Balay   while (0)
6298e58c17dSMatthew Knepley 
6309371c9d4SSatish Balay #define PetscPreLoadStage(name) \
6319371c9d4SSatish Balay   do { \
6329566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePop()); \
6339566063dSJacob Faibussowitsch     if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \
6349566063dSJacob Faibussowitsch     else PetscCall(PetscLogStageRegister(name, &_stageNum)); \
6359566063dSJacob Faibussowitsch     PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
6369566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePush(_stageNum)); \
637204a6943SJed Brown   } while (0)
638e9fa29b7SSatish Balay 
639ad14c47eSJed Brown /* some vars for logging */
640ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */
641ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;   /* true if we are currently in a preloading calculation */
642ad14c47eSJed Brown 
643c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE)
644c708d6e3SStefano Zampini 
645c708d6e3SStefano Zampini /* Global GPU counters */
646c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
647c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
648c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
649c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
650c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar;
651c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar;
652c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar;
653c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar;
654c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gflops;
655c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtime;
656c708d6e3SStefano Zampini 
657c708d6e3SStefano Zampini /* Thread local storage */
658c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th;
659c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th;
660c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th;
661c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th;
662c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th;
663c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th;
664c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th;
665c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th;
666c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th;
667c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th;
668c708d6e3SStefano Zampini 
669c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void);
670c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void);
671c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void);
672c708d6e3SStefano Zampini 
673c708d6e3SStefano Zampini /*@C
674c708d6e3SStefano Zampini        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
675c708d6e3SStefano Zampini 
676c708d6e3SStefano Zampini    Input Parameter:
677c708d6e3SStefano Zampini .   flops - the number of flops
678c708d6e3SStefano Zampini 
679c200f75eSSatish Balay    Level: intermediate
680c200f75eSSatish Balay 
681c708d6e3SStefano Zampini    Notes:
682c708d6e3SStefano Zampini      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
683c200f75eSSatish Balay      not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n)
684c708d6e3SStefano Zampini 
685c708d6e3SStefano 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
686c708d6e3SStefano Zampini      just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()`
687c708d6e3SStefano Zampini 
688c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()`
689c708d6e3SStefano Zampini @*/
690c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
691c708d6e3SStefano Zampini {
692c708d6e3SStefano Zampini   PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops");
6933ba16761SJacob Faibussowitsch   PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n));
6943ba16761SJacob Faibussowitsch   PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n));
6953ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
696c708d6e3SStefano Zampini }
697c708d6e3SStefano Zampini 
698c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
699c708d6e3SStefano Zampini {
7003ba16761SJacob Faibussowitsch   return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t);
701c708d6e3SStefano Zampini }
702c708d6e3SStefano Zampini 
703c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
704c708d6e3SStefano Zampini {
7053ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size);
706c708d6e3SStefano Zampini }
707c708d6e3SStefano Zampini 
708c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
709c708d6e3SStefano Zampini {
7103ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size);
711c708d6e3SStefano Zampini }
712c708d6e3SStefano Zampini 
713c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size)
714c708d6e3SStefano Zampini {
7153ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size);
716c708d6e3SStefano Zampini }
717c708d6e3SStefano Zampini 
718c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size)
719c708d6e3SStefano Zampini {
7203ba16761SJacob Faibussowitsch   return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size);
721c708d6e3SStefano Zampini }
722c708d6e3SStefano Zampini #else
723c708d6e3SStefano Zampini 
7243ba16761SJacob Faibussowitsch   #define PetscLogCpuToGpu(a)       PETSC_SUCCESS
7253ba16761SJacob Faibussowitsch   #define PetscLogGpuToCpu(a)       PETSC_SUCCESS
7263ba16761SJacob Faibussowitsch   #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS
7273ba16761SJacob Faibussowitsch   #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS
7283ba16761SJacob Faibussowitsch   #define PetscLogGpuFlops(a)       PETSC_SUCCESS
7293ba16761SJacob Faibussowitsch   #define PetscLogGpuTime()         PETSC_SUCCESS
7303ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeAdd(a)     PETSC_SUCCESS
7313ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeBegin()    PETSC_SUCCESS
7323ba16761SJacob Faibussowitsch   #define PetscLogGpuTimeEnd()      PETSC_SUCCESS
733c708d6e3SStefano Zampini 
734c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */
735c708d6e3SStefano Zampini 
736c708d6e3SStefano Zampini /* remove TLS defines */
737c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS
738c708d6e3SStefano Zampini #undef PETSC_TLS
739c708d6e3SStefano Zampini 
74097bb86f7SLois Curfman McInnes #endif
741