xref: /petsc/include/petsclog.h (revision 4db21f4b09b74fc57a145283b87f28e99f1b6a3d)
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 */
11fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],void*,const char[],...);
12fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
13fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S)
14fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                   PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1)
15fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2)
16fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)             PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3)
17fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)          PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4)
18fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5)
19fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6)
20fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6,a7)
21fa2bb9feSLisandro Dalcin #else
22fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                       0
23fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                   0
24fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                0
25fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)             0
26fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)          0
27fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       0
28fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    0
29fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0
30fa2bb9feSLisandro Dalcin #endif
31fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
32fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
33fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
34fa2bb9feSLisandro Dalcin 
35b859824cSBarry Smith /*MC
36b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
37b859824cSBarry Smith      code.
38b859824cSBarry Smith 
39b859824cSBarry Smith     Level: intermediate
40b859824cSBarry Smith 
41b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
42b859824cSBarry Smith M*/
43b859824cSBarry Smith typedef int PetscLogEvent;
44b859824cSBarry Smith 
45b859824cSBarry Smith /*MC
46b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
47b859824cSBarry Smith 
48b859824cSBarry Smith     Level: intermediate
49b859824cSBarry Smith 
50522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
51b859824cSBarry Smith M*/
52b859824cSBarry Smith typedef int PetscLogStage;
53b859824cSBarry Smith 
548ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
55014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
5697bb86f7SLois Curfman McInnes 
5719b02663SBarry Smith /* Global flop counter */
58014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
59014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
6019b02663SBarry Smith 
61bec0b493Shannah_mairs /* Global GPU counters */
62bec0b493Shannah_mairs #if defined(PETSC_HAVE_VIENNACL) || defined(PETSC_HAVE_CUDA)
63bec0b493Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
64bec0b493Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
65bec0b493Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
66bec0b493Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
67958c4211Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_gflops;
68958c4211Shannah_mairs PETSC_EXTERN PetscLogDouble petsc_gtime;
69bec0b493Shannah_mairs #endif
70bec0b493Shannah_mairs 
7131d06abdSBarry Smith /* We must make the following structures available to access the event
7231d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
7331d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
74d49d4b11SBarry Smith 
75fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
7631d06abdSBarry Smith */
77aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
786a6a9b46SSatish Balay 
79217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
80c60ec953SBarry Smith /*
81aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
82c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
83c60ec953SBarry Smith        how much memory they use, etc.
84c60ec953SBarry Smith 
85aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
86c60ec953SBarry Smith */
876a6a9b46SSatish Balay typedef struct  {
88c60ec953SBarry Smith   char           *name;   /* The class name */
89c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
90aa213bdcSJed Brown } PetscClassRegInfo;
916a6a9b46SSatish Balay 
926a6a9b46SSatish Balay typedef struct {
930700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
946a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
956a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
966a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
976a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
98aa213bdcSJed Brown } PetscClassPerfInfo;
996a6a9b46SSatish Balay 
100aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
101aa213bdcSJed Brown struct _n_PetscClassRegLog {
102c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
103c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
104aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
105c60ec953SBarry Smith };
1066a6a9b46SSatish Balay 
107aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
108aa213bdcSJed Brown struct _n_PetscClassPerfLog {
109c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
110c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
111aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
112c60ec953SBarry Smith };
113c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
114c60ec953SBarry Smith /*
115aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
116c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
117c60ec953SBarry Smith        much time it takes, etc.
118c60ec953SBarry Smith 
119aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
120c60ec953SBarry Smith       of these for each stage.
121c60ec953SBarry Smith 
122c60ec953SBarry Smith */
1236a6a9b46SSatish Balay typedef struct {
1246a6a9b46SSatish Balay   char         *name;         /* The name of this event */
125c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
126217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
1276a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1286a6a9b46SSatish Balay   int          mpe_id_begin;  /* MPE IDs that define the event */
1296a6a9b46SSatish Balay   int          mpe_id_end;
1306a6a9b46SSatish Balay #endif
131aa213bdcSJed Brown } PetscEventRegInfo;
1326a6a9b46SSatish Balay 
133c60ec953SBarry Smith typedef struct {
134c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
135ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
136ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
137c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
138c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
139a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
140a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
141217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
142891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1435d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
144c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
145c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
146c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
147e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
148e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
149e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
150e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
151bec0b493Shannah_mairs   #if defined(PETSC_HAVE_VIENNACL) || defined(PETSC_HAVE_CUDA)
152bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
153bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
154bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
155bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
156958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
157958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
158bec0b493Shannah_mairs   #endif
159aa213bdcSJed Brown } PetscEventPerfInfo;
160c60ec953SBarry Smith 
161aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
162aa213bdcSJed Brown struct _n_PetscEventRegLog {
1636a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1646a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
165aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1666a6a9b46SSatish Balay };
1676a6a9b46SSatish Balay 
168aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
169aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1706a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1716a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
172aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1736a6a9b46SSatish Balay };
174c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
175c60ec953SBarry Smith /*
176aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1776a6a9b46SSatish Balay 
178aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
179c60ec953SBarry Smith */
180aa213bdcSJed Brown typedef struct _PetscStageInfo {
1816a6a9b46SSatish Balay   char               *name;     /* The stage name */
182ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
183aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
184aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
185aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
186aa213bdcSJed Brown } PetscStageInfo;
1876a6a9b46SSatish Balay 
188aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
189aa213bdcSJed Brown struct _n_PetscStageLog {
1906a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
1916a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
192aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
193aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
194aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
195aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
196aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
1976a6a9b46SSatish Balay };
198217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
199fee518ebSJed Brown 
2003bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
2013bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
2023bb1ff40SBarry Smith 
203aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
204aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
205f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
206f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
207f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
208614700edSBarry Smith 
209da63de55SLois Curfman McInnes /*
210da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
211da63de55SLois Curfman McInnes 
212da63de55SLois Curfman McInnes    For the complex numbers version, note that
213da63de55SLois Curfman McInnes        1 complex addition = 2 flops
214da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
215da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
216da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
217da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
218da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
219da63de55SLois Curfman McInnes    among the various arithmetic operations.
220da63de55SLois Curfman McInnes  */
221da63de55SLois Curfman McInnes 
222aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
223542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
224da63de55SLois Curfman McInnes #else
225542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
226bf3909cdSBarry Smith #endif
227bf3909cdSBarry Smith 
228dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n)
229dd19b90bSBarry Smith {
230dd19b90bSBarry Smith   PetscFunctionBegin;
231bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
232dd19b90bSBarry Smith   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
233da63de55SLois Curfman McInnes #endif
234dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
235dd19b90bSBarry Smith   PetscFunctionReturn(0);
236dd19b90bSBarry Smith }
237fa2bb9feSLisandro Dalcin 
238bec0b493Shannah_mairs #if defined(PETSC_HAVE_VIENNACL) || defined(PETSC_HAVE_CUDA)
239*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
240*4db21f4bSStefano Zampini {
241958c4211Shannah_mairs   PetscFunctionBegin;
242bec0b493Shannah_mairs   petsc_ctog_ct += 1;
243bec0b493Shannah_mairs   petsc_ctog_sz += size;
244bec0b493Shannah_mairs   PetscFunctionReturn(0);
245bec0b493Shannah_mairs }
246*4db21f4bSStefano Zampini 
247*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
248*4db21f4bSStefano Zampini {
249958c4211Shannah_mairs   PetscFunctionBegin;
250bec0b493Shannah_mairs   petsc_gtoc_ct += 1;
251bec0b493Shannah_mairs   petsc_gtoc_sz += size;
252bec0b493Shannah_mairs   PetscFunctionReturn(0);
253bec0b493Shannah_mairs }
254*4db21f4bSStefano Zampini 
255*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
256*4db21f4bSStefano Zampini {
257958c4211Shannah_mairs   PetscFunctionBegin;
258958c4211Shannah_mairs #if defined(PETSC_USE_DEBUG)
259958c4211Shannah_mairs   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
260958c4211Shannah_mairs #endif
261958c4211Shannah_mairs   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
262958c4211Shannah_mairs   petsc_gflops += PETSC_FLOPS_PER_OP*n;
263958c4211Shannah_mairs   PetscFunctionReturn(0);
264958c4211Shannah_mairs }
265*4db21f4bSStefano Zampini 
266*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeBegin()
267*4db21f4bSStefano Zampini {
268958c4211Shannah_mairs   PetscErrorCode ierr;
269958c4211Shannah_mairs   PetscFunctionBegin;
270958c4211Shannah_mairs   ierr = PetscTimeSubtract(&petsc_gtime);CHKERRQ(ierr);
271958c4211Shannah_mairs   PetscFunctionReturn(0);
272958c4211Shannah_mairs }
273*4db21f4bSStefano Zampini 
274*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeEnd()
275*4db21f4bSStefano Zampini {
276958c4211Shannah_mairs   PetscErrorCode ierr;
277958c4211Shannah_mairs   PetscFunctionBegin;
278958c4211Shannah_mairs   ierr = PetscTimeAdd(&petsc_gtime);CHKERRQ(ierr);
279958c4211Shannah_mairs   PetscFunctionReturn(0);
280958c4211Shannah_mairs }
281*4db21f4bSStefano Zampini 
282*4db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
283*4db21f4bSStefano Zampini {
284*4db21f4bSStefano Zampini   PetscFunctionBegin;
285*4db21f4bSStefano Zampini   petsc_gtime += t;
286*4db21f4bSStefano Zampini   PetscFunctionReturn(0);
287*4db21f4bSStefano Zampini }
288bec0b493Shannah_mairs #endif
289bec0b493Shannah_mairs 
290fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
29177c4ece6SBarry Smith 
292aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
29577c4ece6SBarry Smith #endif
29677c4ece6SBarry Smith 
297014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
298014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
299014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
300014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
30177c4ece6SBarry Smith 
302e83a5d19SLisandro 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)
303fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
304fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
305fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...);
306fa2bb9feSLisandro Dalcin 
3078ba1e511SMatthew Knepley /* Initialization functions */
308bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
309014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
310bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
313014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
314fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
3166849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
317fa2bb9feSLisandro Dalcin 
3188ba1e511SMatthew Knepley /* Output functions */
319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
320f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
32231d06abdSBarry Smith 
323fa2bb9feSLisandro Dalcin /* Stage functions */
324014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
325014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
326014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
327014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
328014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
329014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
330014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
331014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
332f5d6ab90SLisandro Dalcin 
3338ba1e511SMatthew Knepley /* Event functions */
334014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
335217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
336fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
337fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
338014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
339014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
340014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
341014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
342014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
3438c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
34413230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
345891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
3465d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
3478ba1e511SMatthew Knepley 
3488ba1e511SMatthew Knepley /* Global counters */
349014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
350014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
351014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
352014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
353014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
354014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
355014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
356014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
357014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
358014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
359014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
360014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
361014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
362014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
363014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
3648ba1e511SMatthew Knepley 
365e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
366e3ed9ee7SBarry Smith 
367fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
36862872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
36962872c28SLisandro Dalcin 
37062872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
37162872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
37262872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0 ))
37377c4ece6SBarry Smith 
37452e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
3758b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
376495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
377043328b6SSatish Balay 
37852e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
3798b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
380495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
38177c4ece6SBarry Smith 
382014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
383014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
384003131ecSBarry Smith 
385ce85283eSBarry Smith /*
386f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
387f621e05eSBarry Smith    their sizes.
388f621e05eSBarry Smith 
389af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
390ce85283eSBarry Smith    uses macros to defined the MPI operations.
39115308354SBarry Smith 
39215308354SBarry Smith      It does not work correctly from HP-UX because it processes the
393bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
394b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3957c1e34a4SSatish Balay 
396f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
397ce85283eSBarry Smith */
398c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
39977a39924SBarry Smith /*
40077a39924SBarry Smith    Logging of MPI activities
40177a39924SBarry Smith */
402b23bfdefSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length)
403f95db71bSBarry Smith {
404f12d10ccSJunchao Zhang   PetscMPIInt    typesize;
405f12d10ccSJunchao Zhang   PetscErrorCode ierr;
4067d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
407f12d10ccSJunchao Zhang   ierr     = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
408f12d10ccSJunchao Zhang   *length += (PetscLogDouble) (count*typesize);
4099c72ff1eSSatish Balay   return 0;
410f95db71bSBarry Smith }
41177a39924SBarry Smith 
412f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
4133b9284c0SMatthew G Knepley {
414f12d10ccSJunchao Zhang   PetscMPIInt    typesize,size,p;
415f12d10ccSJunchao Zhang   PetscErrorCode ierr;
4163b9284c0SMatthew G Knepley 
4177d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
418f12d10ccSJunchao Zhang   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
419f12d10ccSJunchao Zhang   ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
420f12d10ccSJunchao Zhang   for (p=0; p<size; ++p) {
421f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
422f12d10ccSJunchao Zhang   }
423f12d10ccSJunchao Zhang   return 0;
424f12d10ccSJunchao Zhang }
425f12d10ccSJunchao Zhang 
426f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
427f12d10ccSJunchao Zhang {
428f12d10ccSJunchao Zhang   PetscMPIInt    typesize,p;
429f12d10ccSJunchao Zhang   PetscErrorCode ierr;
430f12d10ccSJunchao Zhang 
431f12d10ccSJunchao Zhang   if (type == MPI_DATATYPE_NULL) return 0;
432f12d10ccSJunchao Zhang   ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
433f12d10ccSJunchao Zhang   for (p=0; p<n; ++p) {
434f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
4353b9284c0SMatthew G Knepley   }
4363b9284c0SMatthew G Knepley   return 0;
4373b9284c0SMatthew G Knepley }
4383b9284c0SMatthew G Knepley 
43972b11a25SBarry Smith /*
44072b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
44172b11a25SBarry Smith */
44272b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm)
44372b11a25SBarry Smith {
44472b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
44572b11a25SBarry Smith }
44672b11a25SBarry Smith 
44777a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
448f12d10ccSJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
44915308354SBarry Smith 
45077a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
451f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
45215308354SBarry Smith 
453457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
454f12d10ccSJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests))))
4550d4b0b6cSBarry Smith 
456457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
457f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests))))
4580d4b0b6cSBarry Smith 
459457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
460f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests)))
4610d4b0b6cSBarry Smith 
462ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
463f12d10ccSJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
46415308354SBarry Smith 
46577a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
466f12d10ccSJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
46777a39924SBarry Smith 
46877a39924SBarry Smith #define MPI_Wait(request,status) \
4695fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
47077a39924SBarry Smith 
47177a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
4725fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
47377a39924SBarry Smith 
47477a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
4755fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
47677a39924SBarry Smith 
47777a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
4785fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
4793914022bSBarry Smith 
48054fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
4815fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
48254fe5c21SBarry Smith 
483d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
4845fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
485d6e4c47cSJed Brown 
4863b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
487f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
4883b9284c0SMatthew G Knepley 
4893b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
490f12d10ccSJunchao 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)))
4913b9284c0SMatthew G Knepley 
49201faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
4935fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
49401faf4e4SMatthew Knepley 
49501faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
4965fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
49701faf4e4SMatthew Knepley 
49801faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
499f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
50001faf4e4SMatthew Knepley 
50101faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
502f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
50301faf4e4SMatthew Knepley 
50401faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
505f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
50601faf4e4SMatthew Knepley 
50701faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
508f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
509f12d10ccSJunchao Zhang 
510f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
511f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
512f12d10ccSJunchao Zhang 
513f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
514f12d10ccSJunchao 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)))
515f12d10ccSJunchao Zhang 
516f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
517f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
518f12d10ccSJunchao Zhang 
519f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \
520f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request)))
521f12d10ccSJunchao Zhang 
522f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
523f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
524f12d10ccSJunchao Zhang 
525f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \
526f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request)))
527f12d10ccSJunchao Zhang 
528f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
529f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
530f12d10ccSJunchao Zhang 
531f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
532f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
533f12d10ccSJunchao Zhang 
534f12d10ccSJunchao Zhang /* We treat MPI_Ineighbor_alltoallv as a set of isend/irecv instead of a traditional MPI collective.
535f12d10ccSJunchao Zhang    OpenMPI-3.0 ran into error with outdegree = indegree = 0, so we use ((outdegree) || (indegree)) as a workaround.
536f12d10ccSJunchao Zhang  */
537f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
538f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))))
539f12d10ccSJunchao Zhang 
540f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
541f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))))
54201faf4e4SMatthew Knepley 
5430d4b0b6cSBarry Smith #else
5440d4b0b6cSBarry Smith 
545457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
546ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5470d4b0b6cSBarry Smith 
548457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
549ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
5500d4b0b6cSBarry Smith 
551457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
5525fa69175SJed Brown   (MPI_Start((requests)))
5530d4b0b6cSBarry Smith 
554f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
555f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
556f12d10ccSJunchao Zhang 
557f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
558f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
559c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
560614700edSBarry Smith 
561df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
562614700edSBarry Smith 
563e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
564e3ed9ee7SBarry Smith 
565b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
566fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
567614700edSBarry Smith 
568fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
569fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
570fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
571f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
572f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
573f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
574f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
575f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
576f5d6ab90SLisandro Dalcin 
577fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
578fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
579fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
580fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
581b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
582b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
583b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
584b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
585e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
58646eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
587561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
5889c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
5899c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
59077c4ece6SBarry Smith 
5918b5db460SBarry Smith #define PetscLogPLB                        0
5928b5db460SBarry Smith #define PetscLogPLE                        0
5938b5db460SBarry Smith #define PetscLogPHC                        0
5948b5db460SBarry Smith #define PetscLogPHD                        0
595f5d6ab90SLisandro Dalcin 
596efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
59752e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
59852e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
599fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...);
600fa2bb9feSLisandro Dalcin 
601bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
602b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
603bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
604fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
60573fda44aSBarry Smith #define PetscLogActions(a)                 0
606fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
607fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
608fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 0
609fa2bb9feSLisandro Dalcin 
610fa2bb9feSLisandro Dalcin #define PetscLogView(viewer)               0
611fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions()          0
612fa2bb9feSLisandro Dalcin #define PetscLogDump(c)                    0
613fa2bb9feSLisandro Dalcin 
61462872c28SLisandro Dalcin #define PetscLogEventSync(e,comm)          0
615fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4)  0
616fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4)    0
617ce6058e1SBarry Smith 
618aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
619ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
620ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
621457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests)           MPI_Start(requests)
622f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
623f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
624f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
625f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
626f141ce34SMatthew Knepley 
627aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
6286daaf66cSBarry Smith 
629204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
630204a6943SJed Brown do {\
631204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
632204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
633166c7f25SBarry Smith   PetscLogStage  _stageNum;\
6348cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
635c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
636204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
637204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
638204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
639204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
6400298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
641204a6943SJed Brown     if (PetscPreLoadIt>0) {\
6428e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
6438e58c17dSMatthew Knepley     } else {\
644a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
6458e58c17dSMatthew Knepley     }\
646204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
6478e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
6488e58c17dSMatthew Knepley 
649204a6943SJed Brown #define PetscPreLoadEnd() \
650043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
651204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
652043328b6SSatish Balay   }\
653204a6943SJed Brown } while (0)
6548e58c17dSMatthew Knepley 
655204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
656043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
657204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
6588e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
6598e58c17dSMatthew Knepley     } else {                                                            \
660a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
6618e58c17dSMatthew Knepley     }                                                                   \
662204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
663204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
664204a6943SJed Brown   } while (0)
665e9fa29b7SSatish Balay 
666ad14c47eSJed Brown /* some vars for logging */
667ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
668ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
669ad14c47eSJed Brown 
67097bb86f7SLois Curfman McInnes #endif
671