xref: /petsc/include/petsclog.h (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
426bd1501SBarry Smith #if !defined(PETSCLOG_H)
526bd1501SBarry Smith #define PETSCLOG_H
6*ac09b921SBarry Smith 
7aaa7dc30SBarry Smith #include <petscsys.h>
8958c4211Shannah_mairs #include <petsctime.h>
9c8d78d4dSSatish Balay 
10*ac09b921SBarry Smith /* SUBMANSEC = Sys */
11*ac09b921SBarry 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
31e94e781bSJacob Faibussowitsch     PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size
32e94e781bSJacob Faibussowitsch 
33e94e781bSJacob Faibussowitsch     Used as an input for PetscInfoSetFilterCommSelf()
34e94e781bSJacob Faibussowitsch 
35e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will
36e94e781bSJacob Faibussowitsch print for all communicators)
37e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
38e94e781bSJacob Faibussowitsch $   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 *);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,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 
72db781477SPatrick Sanan .seealso: `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 
81db781477SPatrick Sanan .seealso: `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 
8819b02663SBarry Smith /* Global flop counter */
89014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
90014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
9119b02663SBarry Smith 
9231d06abdSBarry Smith /* We must make the following structures available to access the event
9331d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
9431d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
95d49d4b11SBarry Smith 
96fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
9731d06abdSBarry Smith */
98aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
996a6a9b46SSatish Balay 
100217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
101c60ec953SBarry Smith /*
102aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
103c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
104c60ec953SBarry Smith        how much memory they use, etc.
105c60ec953SBarry Smith 
106aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
107c60ec953SBarry Smith */
1086a6a9b46SSatish Balay typedef struct  {
109c60ec953SBarry Smith   char           *name;   /* The class name */
110c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
111aa213bdcSJed Brown } PetscClassRegInfo;
1126a6a9b46SSatish Balay 
1136a6a9b46SSatish Balay typedef struct {
1140700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1156a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1166a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1176a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1186a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
119aa213bdcSJed Brown } PetscClassPerfInfo;
1206a6a9b46SSatish Balay 
121aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
122aa213bdcSJed Brown struct _n_PetscClassRegLog {
123c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
124c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
125aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
126c60ec953SBarry Smith };
1276a6a9b46SSatish Balay 
128aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
129aa213bdcSJed Brown struct _n_PetscClassPerfLog {
130c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
131c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
132aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
133c60ec953SBarry Smith };
134c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
135c60ec953SBarry Smith /*
136aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
137c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
138c60ec953SBarry Smith        much time it takes, etc.
139c60ec953SBarry Smith 
140aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
141c60ec953SBarry Smith       of these for each stage.
142c60ec953SBarry Smith 
143c60ec953SBarry Smith */
1446a6a9b46SSatish Balay typedef struct {
1456a6a9b46SSatish Balay   char         *name;         /* The name of this event */
146c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
147217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
1486a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1496a6a9b46SSatish Balay   int          mpe_id_begin;  /* MPE IDs that define the event */
1506a6a9b46SSatish Balay   int          mpe_id_end;
1516a6a9b46SSatish Balay #endif
152aa213bdcSJed Brown } PetscEventRegInfo;
1536a6a9b46SSatish Balay 
154c60ec953SBarry Smith typedef struct {
155c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
156ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
157ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
158c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
159c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
160a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
161a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
162217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
163891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1645d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
165c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
166c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
167c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
168e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
169e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
170e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
171e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
172091bc5acSJunchao Zhang   #if defined(PETSC_HAVE_DEVICE)
173bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
174bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
175bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
176bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
177958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
178958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
179bec0b493Shannah_mairs   #endif
180aa213bdcSJed Brown } PetscEventPerfInfo;
181c60ec953SBarry Smith 
182aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
183aa213bdcSJed Brown struct _n_PetscEventRegLog {
1846a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1856a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
186aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1876a6a9b46SSatish Balay };
1886a6a9b46SSatish Balay 
189aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
190aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1916a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1926a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
193aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1946a6a9b46SSatish Balay };
195c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
196c60ec953SBarry Smith /*
197aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1986a6a9b46SSatish Balay 
199aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
200c60ec953SBarry Smith */
201aa213bdcSJed Brown typedef struct _PetscStageInfo {
2026a6a9b46SSatish Balay   char               *name;     /* The stage name */
203ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
204aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
205aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
206aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
207aa213bdcSJed Brown } PetscStageInfo;
2086a6a9b46SSatish Balay 
209aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
210aa213bdcSJed Brown struct _n_PetscStageLog {
2116a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
2126a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
213aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
214aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
215aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
216aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
217aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
2186a6a9b46SSatish Balay };
219217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
220fee518ebSJed Brown 
2213bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
2223bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
2233bb1ff40SBarry Smith 
224aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
225aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
226f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
227f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
228f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
229614700edSBarry Smith 
230da63de55SLois Curfman McInnes /*
231da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
232da63de55SLois Curfman McInnes 
233da63de55SLois Curfman McInnes    For the complex numbers version, note that
234da63de55SLois Curfman McInnes        1 complex addition = 2 flops
235da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
236da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
237da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
238da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
239da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
240da63de55SLois Curfman McInnes    among the various arithmetic operations.
241da63de55SLois Curfman McInnes  */
242da63de55SLois Curfman McInnes 
243aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
244542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
245da63de55SLois Curfman McInnes #else
246542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
247bf3909cdSBarry Smith #endif
248bf3909cdSBarry Smith 
249f8bfbb56SSatish Balay /*@C
250ca0c957dSBarry Smith        PetscLogFlops - Log how many flops are performed in a calculation
251ca0c957dSBarry Smith 
252c3b874c4SJose E. Roman    Input Parameter:
253c3b874c4SJose E. Roman .   flops - the number of flops
254ca0c957dSBarry Smith 
255ca0c957dSBarry Smith    Notes:
256ca0c957dSBarry Smith      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
257ca0c957dSBarry Smith      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
258ca0c957dSBarry Smith 
259ca0c957dSBarry Smith    Level: intermediate
260ca0c957dSBarry Smith 
261db781477SPatrick Sanan .seealso: `PetscLogView()`, `PetscLogGpuFlops()`
262ca0c957dSBarry Smith @*/
263ca0c957dSBarry Smith 
2649fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogFlops(PetscLogDouble n)
265dd19b90bSBarry Smith {
266dd19b90bSBarry Smith   PetscFunctionBegin;
267bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
2682c71b3e2SJacob Faibussowitsch   PetscCheck(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
269da63de55SLois Curfman McInnes #endif
270dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
271dd19b90bSBarry Smith   PetscFunctionReturn(0);
272dd19b90bSBarry Smith }
273fa2bb9feSLisandro Dalcin 
274fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
27577c4ece6SBarry Smith 
276aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
277014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
278014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
27977c4ece6SBarry Smith #endif
28077c4ece6SBarry Smith 
281014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
282014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
283014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
284014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
28577c4ece6SBarry Smith 
2869566063dSJacob Faibussowitsch #define PetscLogObjectParents(p,n,d)  PetscMacroReturnStandard(for (int _i=0; _i<(n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]));)
287fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
288fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
2893ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2,3);
290fa2bb9feSLisandro Dalcin 
2918ba1e511SMatthew Knepley /* Initialization functions */
292bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
294bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
298fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
299014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
3006849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
301fa2bb9feSLisandro Dalcin 
3028ba1e511SMatthew Knepley /* Output functions */
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
304f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
30631d06abdSBarry Smith 
3074dd65854SConnor Ward /* Status checking functions */
3084dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool*);
3094dd65854SConnor Ward 
310fa2bb9feSLisandro Dalcin /* Stage functions */
311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
313014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
319f5d6ab90SLisandro Dalcin 
3208ba1e511SMatthew Knepley /* Event functions */
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
322217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
323fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
324fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
325014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
326014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
327c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
328c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
329014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
330014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
331014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
3328c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
33313230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
334891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
3355d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
3368ba1e511SMatthew Knepley 
3378ba1e511SMatthew Knepley /* Global counters */
338014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
339014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
340014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
341014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
342014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
343014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
344014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
345014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
346014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
347014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
348014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
349014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
350014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
351014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
352014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
3538ba1e511SMatthew Knepley 
354e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
355e3ed9ee7SBarry Smith 
356fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
35762872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
35862872c28SLisandro Dalcin 
35962872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
36062872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
36162872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0))
36277c4ece6SBarry Smith 
36352e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
3648b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
365495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
366043328b6SSatish Balay 
36752e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
3688b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
369495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
37077c4ece6SBarry Smith 
371014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
372014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
373003131ecSBarry Smith 
374ce85283eSBarry Smith /*
375f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
376f621e05eSBarry Smith    their sizes.
377f621e05eSBarry Smith 
378af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
379ce85283eSBarry Smith    uses macros to defined the MPI operations.
38015308354SBarry Smith 
38115308354SBarry Smith      It does not work correctly from HP-UX because it processes the
382bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
383b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3847c1e34a4SSatish Balay 
385f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
386ce85283eSBarry Smith */
387c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
38877a39924SBarry Smith /*
38977a39924SBarry Smith    Logging of MPI activities
39077a39924SBarry Smith */
3919fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length)
392f95db71bSBarry Smith {
393f12d10ccSJunchao Zhang   PetscMPIInt typesize;
3945f80ce2aSJacob Faibussowitsch 
3957d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
3969566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type,&typesize));
397f12d10ccSJunchao Zhang   *length += (PetscLogDouble) (count*typesize);
3989c72ff1eSSatish Balay   return 0;
399f95db71bSBarry Smith }
40077a39924SBarry Smith 
4019fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
4023b9284c0SMatthew G Knepley {
403f12d10ccSJunchao Zhang   PetscMPIInt    typesize,size,p;
4043b9284c0SMatthew G Knepley 
4057d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
4069566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
4079566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type,&typesize));
4085f80ce2aSJacob Faibussowitsch   for (p=0; p<size; ++p) *length += (PetscLogDouble)(counts[p]*typesize);
409f12d10ccSJunchao Zhang   return 0;
410f12d10ccSJunchao Zhang }
411f12d10ccSJunchao Zhang 
4129fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
413f12d10ccSJunchao Zhang {
414f12d10ccSJunchao Zhang   PetscMPIInt typesize,p;
415f12d10ccSJunchao Zhang 
416f12d10ccSJunchao Zhang   if (type == MPI_DATATYPE_NULL) return 0;
4179566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Type_size(type,&typesize));
4185f80ce2aSJacob Faibussowitsch   for (p=0; p<n; ++p) *length += (PetscLogDouble)(counts[p]*typesize);
4193b9284c0SMatthew G Knepley   return 0;
4203b9284c0SMatthew G Knepley }
4213b9284c0SMatthew G Knepley 
42272b11a25SBarry Smith /*
42372b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
42472b11a25SBarry Smith */
4259fbee547SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm)
42672b11a25SBarry Smith {
42772b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
42872b11a25SBarry Smith }
42972b11a25SBarry Smith 
43077a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
431f12d10ccSJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
43215308354SBarry Smith 
433c87b50c4SJunchao Zhang #define MPI_Irecv_c(buf,count,datatype,source,tag,comm,request) \
434c87b50c4SJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv_c((buf),(count),(datatype),(source),(tag),(comm),(request)))
435c87b50c4SJunchao Zhang 
43677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
437f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
43815308354SBarry Smith 
439c87b50c4SJunchao Zhang #define MPI_Isend_c(buf,count,datatype,dest,tag,comm,request) \
440c87b50c4SJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend_c((buf),(count),(datatype),(dest),(tag),(comm),(request)))
441c87b50c4SJunchao Zhang 
442457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
443f12d10ccSJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests))))
4440d4b0b6cSBarry Smith 
445457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
446f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests))))
4470d4b0b6cSBarry Smith 
448457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
449f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests)))
4500d4b0b6cSBarry Smith 
451ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
452f12d10ccSJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
45315308354SBarry Smith 
454c87b50c4SJunchao Zhang #define MPI_Recv_c(buf,count,datatype,source,tag,comm,status) \
455c87b50c4SJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv_c((buf),(count),(datatype),(source),(tag),(comm),(status)))
456c87b50c4SJunchao Zhang 
45777a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
458f12d10ccSJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
45977a39924SBarry Smith 
460c87b50c4SJunchao Zhang #define MPI_Send_c(buf,count,datatype,dest,tag,comm) \
461c87b50c4SJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send_c((buf),(count),(datatype),(dest),(tag),(comm)))
462c87b50c4SJunchao Zhang 
46377a39924SBarry Smith #define MPI_Wait(request,status) \
4645fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
46577a39924SBarry Smith 
46677a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
4675fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
46877a39924SBarry Smith 
46977a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
4705fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
47177a39924SBarry Smith 
47277a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
473df05ca09SBarry Smith   (petsc_allreduce_ct += PetscMPIParallelComm((comm)),MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
4743914022bSBarry Smith 
47554fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
4765fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
47754fe5c21SBarry Smith 
478d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
4795fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
480d6e4c47cSJed Brown 
4813b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
482f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
4833b9284c0SMatthew G Knepley 
4843b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
485f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
4863b9284c0SMatthew G Knepley 
48701faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
4885fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
48901faf4e4SMatthew Knepley 
49001faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
4915fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
49201faf4e4SMatthew Knepley 
49301faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
494f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
49501faf4e4SMatthew Knepley 
49601faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
497f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
49801faf4e4SMatthew Knepley 
49901faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
500f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
50101faf4e4SMatthew Knepley 
50201faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
503f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
504f12d10ccSJunchao Zhang 
505f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
506f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
507f12d10ccSJunchao Zhang 
508f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
509f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Ialltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
510f12d10ccSJunchao Zhang 
511f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
512f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
513f12d10ccSJunchao Zhang 
514f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \
515f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request)))
516f12d10ccSJunchao Zhang 
517f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
518f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
519f12d10ccSJunchao Zhang 
520f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \
521f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request)))
522f12d10ccSJunchao Zhang 
523f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
524f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
525f12d10ccSJunchao Zhang 
526f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
527f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
528f12d10ccSJunchao Zhang 
5290d4b0b6cSBarry Smith #else
5300d4b0b6cSBarry Smith 
531457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
532ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5330d4b0b6cSBarry Smith 
534457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
535ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5360d4b0b6cSBarry Smith 
537457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
5385fa69175SJed Brown   (MPI_Start((requests)))
5390d4b0b6cSBarry Smith 
540c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
541614700edSBarry Smith 
542df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
543614700edSBarry Smith 
544e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
545e3ed9ee7SBarry Smith 
546b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
547fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
548614700edSBarry Smith 
549fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
550fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
551fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
552f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
553f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
554f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
555f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
556f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
557f5d6ab90SLisandro Dalcin 
558fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
559fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
560fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
561fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
562b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
563b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
564c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a)     0
565c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a)      0
566b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
567b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
568e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
56946eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
570561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
5719c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
5729c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
57377c4ece6SBarry Smith 
5748b5db460SBarry Smith #define PetscLogPLB                        0
5758b5db460SBarry Smith #define PetscLogPLE                        0
5768b5db460SBarry Smith #define PetscLogPHC                        0
5778b5db460SBarry Smith #define PetscLogPHD                        0
578f5d6ab90SLisandro Dalcin 
579efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
58052e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
58152e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
5823ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
583fa2bb9feSLisandro Dalcin 
584bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
585b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
586bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
587fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
58873fda44aSBarry Smith #define PetscLogActions(a)                 0
589fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
590fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
591fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 0
592340002ceSLawrence Mitchell #define PetscLogIsActive(flag)             (*(flag) = PETSC_FALSE,0)
593fa2bb9feSLisandro Dalcin 
594fa2bb9feSLisandro Dalcin #define PetscLogView(viewer)               0
595fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions()          0
596fa2bb9feSLisandro Dalcin #define PetscLogDump(c)                    0
597fa2bb9feSLisandro Dalcin 
59862872c28SLisandro Dalcin #define PetscLogEventSync(e,comm)          0
599fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4)  0
600fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4)    0
601ce6058e1SBarry Smith 
60223c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */
60323c86b1bSSatish Balay #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
60423c86b1bSSatish Balay #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
60523c86b1bSSatish Balay #define MPI_Start_isend(count,datatype,requests)           MPI_Start(requests)
60623c86b1bSSatish Balay 
60723c86b1bSSatish Balay #endif   /* PETSC_USE_LOG */
60823c86b1bSSatish Balay 
60923c86b1bSSatish Balay #if defined (PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE)
61023c86b1bSSatish Balay 
61123c86b1bSSatish Balay /* Global GPU counters */
61223c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
61323c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
61423c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
61523c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
61623c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar;
61723c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar;
61823c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar;
61923c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar;
62023c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gflops;
62123c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtime;
62223c86b1bSSatish Balay 
6239fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
62423c86b1bSSatish Balay {
62523c86b1bSSatish Balay   PetscFunctionBegin;
62623c86b1bSSatish Balay   petsc_ctog_ct += 1;
62723c86b1bSSatish Balay   petsc_ctog_sz += size;
62823c86b1bSSatish Balay   PetscFunctionReturn(0);
62923c86b1bSSatish Balay }
63023c86b1bSSatish Balay 
6319fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
63223c86b1bSSatish Balay {
63323c86b1bSSatish Balay   PetscFunctionBegin;
63423c86b1bSSatish Balay   petsc_gtoc_ct += 1;
63523c86b1bSSatish Balay   petsc_gtoc_sz += size;
63623c86b1bSSatish Balay   PetscFunctionReturn(0);
63723c86b1bSSatish Balay }
63823c86b1bSSatish Balay 
6399fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size)
64023c86b1bSSatish Balay {
64123c86b1bSSatish Balay   PetscFunctionBegin;
64223c86b1bSSatish Balay   petsc_ctog_ct_scalar += 1;
64323c86b1bSSatish Balay   petsc_ctog_sz_scalar += size;
64423c86b1bSSatish Balay   PetscFunctionReturn(0);
64523c86b1bSSatish Balay }
64623c86b1bSSatish Balay 
6479fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size)
64823c86b1bSSatish Balay {
64923c86b1bSSatish Balay   PetscFunctionBegin;
65023c86b1bSSatish Balay   petsc_gtoc_ct_scalar += 1;
65123c86b1bSSatish Balay   petsc_gtoc_sz_scalar += size;
65223c86b1bSSatish Balay   PetscFunctionReturn(0);
65323c86b1bSSatish Balay }
65423c86b1bSSatish Balay 
65523c86b1bSSatish Balay /*@C
65623c86b1bSSatish Balay        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
65723c86b1bSSatish Balay 
65823c86b1bSSatish Balay    Input Parameter:
65923c86b1bSSatish Balay .   flops - the number of flops
66023c86b1bSSatish Balay 
66123c86b1bSSatish Balay    Notes:
66223c86b1bSSatish Balay      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
66323c86b1bSSatish Balay      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
66423c86b1bSSatish Balay 
66523c86b1bSSatish Balay    Level: intermediate
66623c86b1bSSatish Balay 
667db781477SPatrick Sanan .seealso: `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()`
66823c86b1bSSatish Balay @*/
6699fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
67023c86b1bSSatish Balay {
67123c86b1bSSatish Balay   PetscFunctionBegin;
6722c71b3e2SJacob Faibussowitsch   PetscCheck(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
67323c86b1bSSatish Balay   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
67423c86b1bSSatish Balay   petsc_gflops += PETSC_FLOPS_PER_OP*n;
67523c86b1bSSatish Balay   PetscFunctionReturn(0);
67623c86b1bSSatish Balay }
67723c86b1bSSatish Balay 
6789fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
67923c86b1bSSatish Balay {
68023c86b1bSSatish Balay   PetscFunctionBegin;
68123c86b1bSSatish Balay   petsc_gtime += t;
68223c86b1bSSatish Balay   PetscFunctionReturn(0);
68323c86b1bSSatish Balay }
68423c86b1bSSatish Balay 
685156b51fbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void);
68623c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void);
68723c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void);
68823c86b1bSSatish Balay 
68923c86b1bSSatish Balay #else
69023c86b1bSSatish Balay 
6918157aad8SJunchao Zhang #define PetscLogCpuToGpu(a)                0
6928157aad8SJunchao Zhang #define PetscLogGpuToCpu(a)                0
69345c4b7c1SBarry Smith #define PetscLogCpuToGpuScalar(a)          0
69445c4b7c1SBarry Smith #define PetscLogGpuToCpuScalar(a)          0
6958157aad8SJunchao Zhang #define PetscLogGpuFlops(a)                0
69653b96e71SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a)              0
6978157aad8SJunchao Zhang #define PetscLogGpuTimeBegin()             0
6988157aad8SJunchao Zhang #define PetscLogGpuTimeEnd()               0
6998157aad8SJunchao Zhang 
70023c86b1bSSatish Balay #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */
7016daaf66cSBarry Smith 
702204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
703204a6943SJed Brown do {\
704204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
705204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
706166c7f25SBarry Smith   PetscLogStage  _stageNum;\
7079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL));     \
708204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
709204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
710204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
711204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
7129566063dSJacob Faibussowitsch     PetscCall(PetscBarrier(NULL));\
7139566063dSJacob Faibussowitsch     if (PetscPreLoadIt>0) PetscCall(PetscLogStageGetId(name,&_stageNum));\
7149566063dSJacob Faibussowitsch     else PetscCall(PetscLogStageRegister(name,&_stageNum));\
7159566063dSJacob Faibussowitsch     PetscCall(PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)));\
7169566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePush(_stageNum));
7178e58c17dSMatthew Knepley 
718204a6943SJed Brown #define PetscPreLoadEnd() \
7199566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePop());\
720204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
721043328b6SSatish Balay   }\
722204a6943SJed Brown } while (0)
7238e58c17dSMatthew Knepley 
724204a6943SJed Brown #define PetscPreLoadStage(name) do {                                                           \
7259566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePop());                                                               \
7269566063dSJacob Faibussowitsch     if (PetscPreLoadIt>0)   PetscCall(PetscLogStageGetId(name,&_stageNum));                      \
7279566063dSJacob Faibussowitsch     else PetscCall(PetscLogStageRegister(name,&_stageNum));                                      \
7289566063dSJacob Faibussowitsch     PetscCall(PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \
7299566063dSJacob Faibussowitsch     PetscCall(PetscLogStagePush(_stageNum));                                                     \
730204a6943SJed Brown   } while (0)
731e9fa29b7SSatish Balay 
732ad14c47eSJed Brown /* some vars for logging */
733ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
734ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
735ad14c47eSJed Brown 
73697bb86f7SLois Curfman McInnes #endif
737