xref: /petsc/include/petsclog.h (revision 9fbee5477fd88ea4536ebb185f3c80da15fb55c0)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
497bb86f7SLois Curfman McInnes 
526bd1501SBarry Smith #if !defined(PETSCLOG_H)
626bd1501SBarry Smith #define PETSCLOG_H
7aaa7dc30SBarry Smith #include <petscsys.h>
8958c4211Shannah_mairs #include <petsctime.h>
9c8d78d4dSSatish Balay 
10fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */
113ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],PetscObject,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4);
12fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
137d3de750SJacob Faibussowitsch #define PetscInfo(A,...) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),__VA_ARGS__)
14fa2bb9feSLisandro Dalcin #else
157d3de750SJacob Faibussowitsch #define PetscInfo(A,...) 0
16fa2bb9feSLisandro Dalcin #endif
17e94e781bSJacob Faibussowitsch 
187d3de750SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
197d3de750SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
207d3de750SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS_)_
217d3de750SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
227d3de750SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
237d3de750SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
247d3de750SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
257d3de750SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
267d3de750SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__)
277d3de750SJacob Faibussowitsch 
28e94e781bSJacob Faibussowitsch /*E
29e94e781bSJacob Faibussowitsch     PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size
30e94e781bSJacob Faibussowitsch 
31e94e781bSJacob Faibussowitsch     Used as an input for PetscInfoSetFilterCommSelf()
32e94e781bSJacob Faibussowitsch 
33e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will
34e94e781bSJacob Faibussowitsch print for all communicators)
35e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
36e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1
37e94e781bSJacob Faibussowitsch 
38e94e781bSJacob Faibussowitsch     Level: intermediate
39e94e781bSJacob Faibussowitsch 
40e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf()
41e94e781bSJacob Faibussowitsch E*/
42e94e781bSJacob Faibussowitsch typedef enum {
43e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL = -1,
44e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF = 0,
45e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
46e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
47e94e781bSJacob Faibussowitsch 
48e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[];
49fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
50fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
51e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *);
52e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool);
53e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]);
54e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **);
55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *);
56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *);
57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *);
58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void);
62fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
63fa2bb9feSLisandro Dalcin 
64b859824cSBarry Smith /*MC
65b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
66b859824cSBarry Smith      code.
67b859824cSBarry Smith 
68b859824cSBarry Smith     Level: intermediate
69b859824cSBarry Smith 
70b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
71b859824cSBarry Smith M*/
72b859824cSBarry Smith typedef int PetscLogEvent;
73b859824cSBarry Smith 
74b859824cSBarry Smith /*MC
75b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
76b859824cSBarry Smith 
77b859824cSBarry Smith     Level: intermediate
78b859824cSBarry Smith 
79522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
80b859824cSBarry Smith M*/
81b859824cSBarry Smith typedef int PetscLogStage;
82b859824cSBarry Smith 
838ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
84014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
8597bb86f7SLois Curfman McInnes 
8619b02663SBarry Smith /* Global flop counter */
87014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
88014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
8919b02663SBarry Smith 
9031d06abdSBarry Smith /* We must make the following structures available to access the event
9131d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
9231d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
93d49d4b11SBarry Smith 
94fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
9531d06abdSBarry Smith */
96aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
976a6a9b46SSatish Balay 
98217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
99c60ec953SBarry Smith /*
100aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
101c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
102c60ec953SBarry Smith        how much memory they use, etc.
103c60ec953SBarry Smith 
104aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
105c60ec953SBarry Smith */
1066a6a9b46SSatish Balay typedef struct  {
107c60ec953SBarry Smith   char           *name;   /* The class name */
108c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
109aa213bdcSJed Brown } PetscClassRegInfo;
1106a6a9b46SSatish Balay 
1116a6a9b46SSatish Balay typedef struct {
1120700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1136a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1146a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1156a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1166a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
117aa213bdcSJed Brown } PetscClassPerfInfo;
1186a6a9b46SSatish Balay 
119aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
120aa213bdcSJed Brown struct _n_PetscClassRegLog {
121c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
122c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
123aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
124c60ec953SBarry Smith };
1256a6a9b46SSatish Balay 
126aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
127aa213bdcSJed Brown struct _n_PetscClassPerfLog {
128c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
129c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
130aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
131c60ec953SBarry Smith };
132c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
133c60ec953SBarry Smith /*
134aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
135c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
136c60ec953SBarry Smith        much time it takes, etc.
137c60ec953SBarry Smith 
138aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
139c60ec953SBarry Smith       of these for each stage.
140c60ec953SBarry Smith 
141c60ec953SBarry Smith */
1426a6a9b46SSatish Balay typedef struct {
1436a6a9b46SSatish Balay   char         *name;         /* The name of this event */
144c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
145217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
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 
152c60ec953SBarry Smith typedef struct {
153c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
154ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
155ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
156c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
157c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
158a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
159a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
160217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
161891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1625d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
163c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
164c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
165c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
166e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
167e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
168e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
169e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
170091bc5acSJunchao Zhang   #if defined(PETSC_HAVE_DEVICE)
171bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
172bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
173bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
174bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
175958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
176958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
177bec0b493Shannah_mairs   #endif
178aa213bdcSJed Brown } PetscEventPerfInfo;
179c60ec953SBarry Smith 
180aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
181aa213bdcSJed Brown struct _n_PetscEventRegLog {
1826a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1836a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
184aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1856a6a9b46SSatish Balay };
1866a6a9b46SSatish Balay 
187aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
188aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1896a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1906a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
191aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1926a6a9b46SSatish Balay };
193c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
194c60ec953SBarry Smith /*
195aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1966a6a9b46SSatish Balay 
197aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
198c60ec953SBarry Smith */
199aa213bdcSJed Brown typedef struct _PetscStageInfo {
2006a6a9b46SSatish Balay   char               *name;     /* The stage name */
201ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
202aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
203aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
204aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
205aa213bdcSJed Brown } PetscStageInfo;
2066a6a9b46SSatish Balay 
207aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
208aa213bdcSJed Brown struct _n_PetscStageLog {
2096a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
2106a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
211aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
212aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
213aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
214aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
215aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
2166a6a9b46SSatish Balay };
217217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
218fee518ebSJed Brown 
2193bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
2203bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
2213bb1ff40SBarry Smith 
222aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
223aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
224f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
225f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
226f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
227614700edSBarry Smith 
228da63de55SLois Curfman McInnes /*
229da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
230da63de55SLois Curfman McInnes 
231da63de55SLois Curfman McInnes    For the complex numbers version, note that
232da63de55SLois Curfman McInnes        1 complex addition = 2 flops
233da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
234da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
235da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
236da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
237da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
238da63de55SLois Curfman McInnes    among the various arithmetic operations.
239da63de55SLois Curfman McInnes  */
240da63de55SLois Curfman McInnes 
241aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
242542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
243da63de55SLois Curfman McInnes #else
244542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
245bf3909cdSBarry Smith #endif
246bf3909cdSBarry Smith 
247f8bfbb56SSatish Balay /*@C
248ca0c957dSBarry Smith        PetscLogFlops - Log how many flops are performed in a calculation
249ca0c957dSBarry Smith 
250c3b874c4SJose E. Roman    Input Parameter:
251c3b874c4SJose E. Roman .   flops - the number of flops
252ca0c957dSBarry Smith 
253ca0c957dSBarry Smith    Notes:
254ca0c957dSBarry Smith      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
255ca0c957dSBarry Smith      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
256ca0c957dSBarry Smith 
257ca0c957dSBarry Smith    Level: intermediate
258ca0c957dSBarry Smith 
25968481988SMark .seealso: PetscLogView(), PetscLogGpuFlops()
260ca0c957dSBarry Smith @*/
261ca0c957dSBarry Smith 
262*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogFlops(PetscLogDouble n)
263dd19b90bSBarry Smith {
264dd19b90bSBarry Smith   PetscFunctionBegin;
265bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
2669a202e32SJacob Faibussowitsch   PetscAssert(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
267da63de55SLois Curfman McInnes #endif
268dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
269dd19b90bSBarry Smith   PetscFunctionReturn(0);
270dd19b90bSBarry Smith }
271fa2bb9feSLisandro Dalcin 
272fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
27377c4ece6SBarry Smith 
274aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
275014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
27777c4ece6SBarry Smith #endif
27877c4ece6SBarry Smith 
279014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
280014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
281014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
282014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
28377c4ece6SBarry Smith 
284e83a5d19SLisandro Dalcin #define PetscLogObjectParents(p,n,d)  0;do{int _i; for (_i=0; _i<(n); _i++) {ierr = PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]);CHKERRQ(ierr);}}while (0)
285fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
286fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
2873ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2,3);
288fa2bb9feSLisandro Dalcin 
2898ba1e511SMatthew Knepley /* Initialization functions */
290bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
292bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
296fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
2986849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
299fa2bb9feSLisandro Dalcin 
3008ba1e511SMatthew Knepley /* Output functions */
301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
302f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
30431d06abdSBarry Smith 
305fa2bb9feSLisandro Dalcin /* Stage functions */
306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
308014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
309014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
313014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
314f5d6ab90SLisandro Dalcin 
3158ba1e511SMatthew Knepley /* Event functions */
316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
317217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
318fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
319fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
322c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
323c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
324014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
325014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
326014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
3278c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
32813230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
329891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
3305d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
3318ba1e511SMatthew Knepley 
3328ba1e511SMatthew Knepley /* Global counters */
333014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
334014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
335014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
336014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
337014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
338014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
339014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
340014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
341014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
342014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
343014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
344014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
345014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
346014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
347014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
3488ba1e511SMatthew Knepley 
349e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
350e3ed9ee7SBarry Smith 
351fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
35262872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
35362872c28SLisandro Dalcin 
35462872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
35562872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
35662872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0))
35777c4ece6SBarry Smith 
35852e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
3598b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
360495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
361043328b6SSatish Balay 
36252e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
3638b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
364495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
36577c4ece6SBarry Smith 
366014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
367014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
368003131ecSBarry Smith 
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 */
382c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
38377a39924SBarry Smith /*
38477a39924SBarry Smith    Logging of MPI activities
38577a39924SBarry Smith */
386*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length)
387f95db71bSBarry Smith {
388f12d10ccSJunchao Zhang   PetscMPIInt    typesize;
389f12d10ccSJunchao Zhang   PetscErrorCode ierr;
3907d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
39155b25c41SPierre Jolivet   ierr     = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
392f12d10ccSJunchao Zhang   *length += (PetscLogDouble) (count*typesize);
3939c72ff1eSSatish Balay   return 0;
394f95db71bSBarry Smith }
39577a39924SBarry Smith 
396*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
3973b9284c0SMatthew G Knepley {
398f12d10ccSJunchao Zhang   PetscMPIInt    typesize,size,p;
399f12d10ccSJunchao Zhang   PetscErrorCode ierr;
4003b9284c0SMatthew G Knepley 
4017d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
402ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
403ffc4695bSBarry Smith   ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
404f12d10ccSJunchao Zhang   for (p=0; p<size; ++p) {
405f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
406f12d10ccSJunchao Zhang   }
407f12d10ccSJunchao Zhang   return 0;
408f12d10ccSJunchao Zhang }
409f12d10ccSJunchao Zhang 
410*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
411f12d10ccSJunchao Zhang {
412f12d10ccSJunchao Zhang   PetscMPIInt    typesize,p;
413f12d10ccSJunchao Zhang   PetscErrorCode ierr;
414f12d10ccSJunchao Zhang 
415f12d10ccSJunchao Zhang   if (type == MPI_DATATYPE_NULL) return 0;
416ffc4695bSBarry Smith   ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
417f12d10ccSJunchao Zhang   for (p=0; p<n; ++p) {
418f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
4193b9284c0SMatthew G Knepley   }
4203b9284c0SMatthew G Knepley   return 0;
4213b9284c0SMatthew G Knepley }
4223b9284c0SMatthew G Knepley 
42372b11a25SBarry Smith /*
42472b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
42572b11a25SBarry Smith */
426*9fbee547SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm)
42772b11a25SBarry Smith {
42872b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
42972b11a25SBarry Smith }
43072b11a25SBarry Smith 
43177a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
432f12d10ccSJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
43315308354SBarry Smith 
434c87b50c4SJunchao Zhang #define MPI_Irecv_c(buf,count,datatype,source,tag,comm,request) \
435c87b50c4SJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv_c((buf),(count),(datatype),(source),(tag),(comm),(request)))
436c87b50c4SJunchao Zhang 
43777a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
438f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
43915308354SBarry Smith 
440c87b50c4SJunchao Zhang #define MPI_Isend_c(buf,count,datatype,dest,tag,comm,request) \
441c87b50c4SJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend_c((buf),(count),(datatype),(dest),(tag),(comm),(request)))
442c87b50c4SJunchao Zhang 
443457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
444f12d10ccSJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests))))
4450d4b0b6cSBarry Smith 
446457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
447f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests))))
4480d4b0b6cSBarry Smith 
449457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
450f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests)))
4510d4b0b6cSBarry Smith 
452ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
453f12d10ccSJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
45415308354SBarry Smith 
455c87b50c4SJunchao Zhang #define MPI_Recv_c(buf,count,datatype,source,tag,comm,status) \
456c87b50c4SJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv_c((buf),(count),(datatype),(source),(tag),(comm),(status)))
457c87b50c4SJunchao Zhang 
45877a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
459f12d10ccSJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
46077a39924SBarry Smith 
461c87b50c4SJunchao Zhang #define MPI_Send_c(buf,count,datatype,dest,tag,comm) \
462c87b50c4SJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send_c((buf),(count),(datatype),(dest),(tag),(comm)))
463c87b50c4SJunchao Zhang 
46477a39924SBarry Smith #define MPI_Wait(request,status) \
4655fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
46677a39924SBarry Smith 
46777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
4685fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
46977a39924SBarry Smith 
47077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
4715fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
47277a39924SBarry Smith 
47377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
474df05ca09SBarry Smith   (petsc_allreduce_ct += PetscMPIParallelComm((comm)),MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
4753914022bSBarry Smith 
47654fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
4775fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
47854fe5c21SBarry Smith 
479d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
4805fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
481d6e4c47cSJed Brown 
4823b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
483f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
4843b9284c0SMatthew G Knepley 
4853b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
486f12d10ccSJunchao 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)))
4873b9284c0SMatthew G Knepley 
48801faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
4895fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
49001faf4e4SMatthew Knepley 
49101faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
4925fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
49301faf4e4SMatthew Knepley 
49401faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
495f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
49601faf4e4SMatthew Knepley 
49701faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
498f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
49901faf4e4SMatthew Knepley 
50001faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
501f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
50201faf4e4SMatthew Knepley 
50301faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
504f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
505f12d10ccSJunchao Zhang 
506f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
507f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
508f12d10ccSJunchao Zhang 
509f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
510f12d10ccSJunchao 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)))
511f12d10ccSJunchao Zhang 
512f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
513f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
514f12d10ccSJunchao Zhang 
515f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \
516f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request)))
517f12d10ccSJunchao Zhang 
518f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
519f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
520f12d10ccSJunchao Zhang 
521f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \
522f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request)))
523f12d10ccSJunchao Zhang 
524f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
525f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
526f12d10ccSJunchao Zhang 
527f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
528f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
529f12d10ccSJunchao Zhang 
5300d4b0b6cSBarry Smith #else
5310d4b0b6cSBarry Smith 
532457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
533ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5340d4b0b6cSBarry Smith 
535457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
536ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5370d4b0b6cSBarry Smith 
538457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
5395fa69175SJed Brown   (MPI_Start((requests)))
5400d4b0b6cSBarry Smith 
541c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
542614700edSBarry Smith 
543df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
544614700edSBarry Smith 
545e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
546e3ed9ee7SBarry Smith 
547b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
548fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
549614700edSBarry Smith 
550fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
551fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
552fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
553f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
554f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
555f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
556f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
557f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
558f5d6ab90SLisandro Dalcin 
559fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
560fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
561fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
562fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
563b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
564b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
565c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a)     0
566c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a)      0
567b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
568b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
569e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
57046eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
571561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
5729c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
5739c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
57477c4ece6SBarry Smith 
5758b5db460SBarry Smith #define PetscLogPLB                        0
5768b5db460SBarry Smith #define PetscLogPLE                        0
5778b5db460SBarry Smith #define PetscLogPHC                        0
5788b5db460SBarry Smith #define PetscLogPHD                        0
579f5d6ab90SLisandro Dalcin 
580efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
58152e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
58252e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
5833ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3);
584fa2bb9feSLisandro Dalcin 
585bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
586b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
587bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
588fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
58973fda44aSBarry Smith #define PetscLogActions(a)                 0
590fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
591fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
592fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 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 
623*9fbee547SJacob 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 
631*9fbee547SJacob 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 
639*9fbee547SJacob 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 
647*9fbee547SJacob 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 
66723c86b1bSSatish Balay .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd()
66823c86b1bSSatish Balay @*/
669*9fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
67023c86b1bSSatish Balay {
67123c86b1bSSatish Balay   PetscFunctionBegin;
6729ace16cdSJacob Faibussowitsch   PetscAssert(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 
678*9fbee547SJacob 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 
68523c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void);
68623c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void);
68723c86b1bSSatish Balay 
68823c86b1bSSatish Balay #else
68923c86b1bSSatish Balay 
6908157aad8SJunchao Zhang #define PetscLogCpuToGpu(a)                0
6918157aad8SJunchao Zhang #define PetscLogGpuToCpu(a)                0
69245c4b7c1SBarry Smith #define PetscLogCpuToGpuScalar(a)          0
69345c4b7c1SBarry Smith #define PetscLogGpuToCpuScalar(a)          0
6948157aad8SJunchao Zhang #define PetscLogGpuFlops(a)                0
69553b96e71SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a)              0
6968157aad8SJunchao Zhang #define PetscLogGpuTimeBegin()             0
6978157aad8SJunchao Zhang #define PetscLogGpuTimeEnd()               0
6988157aad8SJunchao Zhang 
69923c86b1bSSatish Balay #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */
7006daaf66cSBarry Smith 
701204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
702204a6943SJed Brown do {\
703204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
704204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
705166c7f25SBarry Smith   PetscLogStage  _stageNum;\
7068cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
707c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
708204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
709204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
710204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
711204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
7120298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
713204a6943SJed Brown     if (PetscPreLoadIt>0) {\
7148e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
7158e58c17dSMatthew Knepley     } else {\
716a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7178e58c17dSMatthew Knepley     }\
718204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
7198e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
7208e58c17dSMatthew Knepley 
721204a6943SJed Brown #define PetscPreLoadEnd() \
722043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
723204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
724043328b6SSatish Balay   }\
725204a6943SJed Brown } while (0)
7268e58c17dSMatthew Knepley 
727204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
728043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
729204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
7308e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
7318e58c17dSMatthew Knepley     } else {                                                            \
732a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7338e58c17dSMatthew Knepley     }                                                                   \
734204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
735204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
736204a6943SJed Brown   } while (0)
737e9fa29b7SSatish Balay 
738ad14c47eSJed Brown /* some vars for logging */
739ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
740ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
741ad14c47eSJed Brown 
74297bb86f7SLois Curfman McInnes #endif
743