xref: /petsc/include/petsclog.h (revision 95fbd943d7c27f52d1b744f92ae57b2fc0bd05b9)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
497bb86f7SLois Curfman McInnes 
5b0a32e0cSBarry Smith #if !defined(__PetscLog_H)
6b0a32e0cSBarry Smith #define __PetscLog_H
797bb86f7SLois Curfman McInnes #include "petsc.h"
8e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
997bb86f7SLois Curfman McInnes /*
108ba1e511SMatthew Knepley   Each PETSc object class has it's own cookie (internal integer in the
118ba1e511SMatthew Knepley   data structure used for error checking). These are all defined by an offset
128ba1e511SMatthew Knepley   from the lowest one, PETSC_COOKIE.
1397bb86f7SLois Curfman McInnes */
148ba1e511SMatthew Knepley #define PETSC_COOKIE 1211211
156849ba73SBarry Smith extern PetscCookie PETSC_LARGEST_COOKIE;
168ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
176849ba73SBarry Smith extern PetscEvent PETSC_LARGEST_EVENT;
1897bb86f7SLois Curfman McInnes 
198ba1e511SMatthew Knepley /* Events for the Petsc standard library */
20ff73aad6SKris Buschelman extern PetscEvent PETSC_DLLEXPORT PETSC_Barrier;
2197bb86f7SLois Curfman McInnes 
2219b02663SBarry Smith /* Global flop counter */
23ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops;
2419b02663SBarry Smith 
25edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */
26ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfo_Private(void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
2763ba0a88SBarry Smith #if defined(PETSC_USE_DEBUG)
2863ba0a88SBarry Smith #define PetscLogInfo(A)      PetscLogInfo_Private A
2963ba0a88SBarry Smith #else
3063ba0a88SBarry Smith #define PetscLogInfo(A)      0
3163ba0a88SBarry Smith #endif
32ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfoDeactivateClass(PetscCookie);
33ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfoActivateClass(PetscCookie);
34ff73aad6SKris Buschelman extern PetscTruth     PETSC_DLLEXPORT PetscLogPrintInfo;  /* if true, indicates PetscLogInfo() is turned on */
35614700edSBarry Smith 
36aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
37614700edSBarry Smith 
38da63de55SLois Curfman McInnes /*
39da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
40da63de55SLois Curfman McInnes 
41da63de55SLois Curfman McInnes    For the complex numbers version, note that
42da63de55SLois Curfman McInnes        1 complex addition = 2 flops
43da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
44da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
45da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
46da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
47da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
48da63de55SLois Curfman McInnes    among the various arithmetic operations.
49da63de55SLois Curfman McInnes  */
50da63de55SLois Curfman McInnes 
51aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
52b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (4*n),0)
53da63de55SLois Curfman McInnes #else
54b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (n),0)
55da63de55SLois Curfman McInnes #endif
5677c4ece6SBarry Smith 
57aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
5877c4ece6SBarry Smith #include "mpe.h"
59ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT        PetscLogMPEBegin(void);
60ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT        PetscLogMPEDump(const char[]);
6135d8aa7fSBarry Smith extern PetscTruth UseMPE;
62043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \
6352e6d16bSBarry Smith   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ?
6452e6d16bSBarry Smith    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,(char*)"") : 0)
65043328b6SSatish Balay 
66043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \
6752e6d16bSBarry Smith   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ?
6852e6d16bSBarry Smith    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,(char*)"") : 0)
69043328b6SSatish Balay 
70614700edSBarry Smith #else
7152e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0
7252e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e)   0
7377c4ece6SBarry Smith #endif
7477c4ece6SBarry Smith 
75ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
76ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
77ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject);
78ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject);
7977c4ece6SBarry Smith 
80043328b6SSatish Balay #define PetscLogObjectParent(p,c) \
8152e6d16bSBarry Smith   ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0)
8252e6d16bSBarry Smith 
83efee365bSSatish Balay #define PetscLogObjectParents(p,n,d)  0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}}
84d38fa0fbSBarry Smith #define PetscLogObjectCreate(h)      ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0)
85d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h)     ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0)
8652e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)    (((PetscObject)(p))->mem += (m),0)
878ba1e511SMatthew Knepley /* Initialization functions */
88ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void);
89ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void);
90ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *);
91ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth);
92ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth);
938ba1e511SMatthew Knepley /* General functions */
94ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]);
95ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void);
96ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
976849ba73SBarry Smith                    PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
98ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
998ba1e511SMatthew Knepley /* Output functions */
100ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]);
101ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]);
1028ba1e511SMatthew Knepley /* Counter functions */
103ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *);
1048ba1e511SMatthew Knepley /* Stage functions */
105ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(int*, const char[]);
106ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(int);
107ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void);
108ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(int, PetscTruth);
109ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(int, PetscTruth *);
110ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(int, PetscTruth);
111ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(int, PetscTruth *);
112ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], int *);
1138ba1e511SMatthew Knepley /* Event functions */
114ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(PetscEvent*, const char[], PetscCookie);
115ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscEvent);
116ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscEvent);
117ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscEvent, PetscTruth);
118ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie);
119ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie);
1208ba1e511SMatthew Knepley /* Class functions */
121ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogClassRegister(PetscCookie*, const char []);
1228ba1e511SMatthew Knepley 
1238ba1e511SMatthew Knepley /* Global counters */
124ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct;
125ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct;
126ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct;
127ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct;
128ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len;
129ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len;
130ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len;
131ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len;
132ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct;
133ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct;
134ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct;
135ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct;
136ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct;
137ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int            PETSC_DUMMY_SIZE;
138ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int            PETSC_DUMMY_COUNT;
1398ba1e511SMatthew Knepley 
1408ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event
1418ba1e511SMatthew Knepley    activation flags in the PetscLogEventBegin/End() macros. If we forced a
1428ba1e511SMatthew Knepley    function call each time, we could leave these structures in plog.h
1438ba1e511SMatthew Knepley */
144e855f6f8SMatthew Knepley /* Default log */
145*95fbd943SSatish Balay typedef struct _n_StageLog *StageLog;
146ff73aad6SKris Buschelman extern PETSC_DLLEXPORT StageLog _stageLog;
147e855f6f8SMatthew Knepley 
148e855f6f8SMatthew Knepley /* A simple stack (should replace) */
149*95fbd943SSatish Balay typedef struct _n_IntStack *IntStack;
150e855f6f8SMatthew Knepley 
151e855f6f8SMatthew Knepley /* The structures for logging performance */
152af80a1fbSMatthew Knepley typedef struct _EventPerfInfo {
153e855f6f8SMatthew Knepley   int            id;            /* The integer identifying this section */
154800883a5SMatthew Knepley   PetscTruth     active;        /* The flag to activate logging */
155800883a5SMatthew Knepley   PetscTruth     visible;       /* The flag to print info in summary */
1568ba1e511SMatthew Knepley   int            depth;         /* The nesting depth of the event call */
1578ba1e511SMatthew Knepley   int            count;         /* The number of times this section was executed */
1588ba1e511SMatthew Knepley   PetscLogDouble flops;         /* The flops used in this section */
1598ba1e511SMatthew Knepley   PetscLogDouble time;          /* The time taken for this section */
1608ba1e511SMatthew Knepley   PetscLogDouble numMessages;   /* The number of messages in this section */
1618ba1e511SMatthew Knepley   PetscLogDouble messageLength; /* The total message lengths in this section */
1628ba1e511SMatthew Knepley   PetscLogDouble numReductions; /* The number of reductions in this section */
163af80a1fbSMatthew Knepley } EventPerfInfo;
1648ba1e511SMatthew Knepley 
165e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo {
166e855f6f8SMatthew Knepley   int            id;           /* The integer identifying this class */
1678ba1e511SMatthew Knepley   int            creations;    /* The number of objects of this class created */
1688ba1e511SMatthew Knepley   int            destructions; /* The number of objects of this class destroyed */
1698ba1e511SMatthew Knepley   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1708ba1e511SMatthew Knepley   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
171e855f6f8SMatthew Knepley } ClassPerfInfo;
1728ba1e511SMatthew Knepley 
173e855f6f8SMatthew Knepley /* The structures for logging registration */
174e855f6f8SMatthew Knepley typedef struct _ClassRegInfo {
175e855f6f8SMatthew Knepley   char            *name;   /* The class name */
1766849ba73SBarry Smith   PetscCookie cookie; /* The integer identifying this class */
177e855f6f8SMatthew Knepley } ClassRegInfo;
178e855f6f8SMatthew Knepley 
179e855f6f8SMatthew Knepley typedef struct _EventRegInfo {
180e855f6f8SMatthew Knepley   char            *name;   /* The name of this event */
1816849ba73SBarry Smith   PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */
18244451550SSatish Balay #if defined (PETSC_HAVE_MPE)
18344451550SSatish Balay   int             mpe_id_begin; /* MPE IDs that define the event */
18444451550SSatish Balay   int             mpe_id_end;
18544451550SSatish Balay #endif
186e855f6f8SMatthew Knepley } EventRegInfo;
187e855f6f8SMatthew Knepley 
188*95fbd943SSatish Balay typedef struct _n_EventRegLog *EventRegLog;
189*95fbd943SSatish Balay struct _n_EventRegLog {
190e855f6f8SMatthew Knepley   int           numEvents; /* The number of registered events */
191e855f6f8SMatthew Knepley   int           maxEvents; /* The maximum number of events */
192e855f6f8SMatthew Knepley   EventRegInfo *eventInfo; /* The registration information for each event */
1938ba1e511SMatthew Knepley };
1948ba1e511SMatthew Knepley 
195*95fbd943SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog;
196*95fbd943SSatish Balay struct _n_EventPerfLog {
197e855f6f8SMatthew Knepley   int            numEvents; /* The number of logging events */
198e855f6f8SMatthew Knepley   int            maxEvents; /* The maximum number of events */
199af80a1fbSMatthew Knepley   EventPerfInfo *eventInfo; /* The performance information for each event */
200e855f6f8SMatthew Knepley };
2018ba1e511SMatthew Knepley 
202e855f6f8SMatthew Knepley /* The structure for logging class information */
203*95fbd943SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog;
204*95fbd943SSatish Balay struct _n_ClassRegLog {
205e855f6f8SMatthew Knepley   int           numClasses; /* The number of classes registered */
206e855f6f8SMatthew Knepley   int           maxClasses; /* The maximum number of classes */
207e855f6f8SMatthew Knepley   ClassRegInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
208e855f6f8SMatthew Knepley };
209e855f6f8SMatthew Knepley 
210*95fbd943SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog;
211*95fbd943SSatish Balay struct _n_ClassPerfLog {
212e855f6f8SMatthew Knepley   int            numClasses; /* The number of logging classes */
213e855f6f8SMatthew Knepley   int            maxClasses; /* The maximum number of classes */
214e855f6f8SMatthew Knepley   ClassPerfInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
215e855f6f8SMatthew Knepley };
216e855f6f8SMatthew Knepley 
217e855f6f8SMatthew Knepley /* The structures for logging in stages */
218e855f6f8SMatthew Knepley typedef struct _StageInfo {
219e855f6f8SMatthew Knepley   char         *name;     /* The stage name */
220773a6509SMatthew Knepley   PetscTruth    used;     /* The stage was pushed on this processor */
221af80a1fbSMatthew Knepley   EventPerfInfo perfInfo; /* The stage performance information */
222e855f6f8SMatthew Knepley   EventPerfLog  eventLog; /* The event information for this stage */
223e855f6f8SMatthew Knepley   ClassPerfLog  classLog; /* The class information for this stage */
224e855f6f8SMatthew Knepley } StageInfo;
225e855f6f8SMatthew Knepley 
226*95fbd943SSatish Balay struct _n_StageLog {
2278ba1e511SMatthew Knepley   /* Size information */
2288ba1e511SMatthew Knepley   int         numStages; /* The number of registered stages */
2298ba1e511SMatthew Knepley   int         maxStages; /* The maximum number of stages */
2308ba1e511SMatthew Knepley   /* Runtime information */
2318ba1e511SMatthew Knepley   IntStack    stack;     /* The stack for active stages */
2328ba1e511SMatthew Knepley   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
2338ba1e511SMatthew Knepley   /* Stage specific information */
234e855f6f8SMatthew Knepley   StageInfo  *stageInfo; /* The information for each stage */
235e855f6f8SMatthew Knepley   EventRegLog eventLog;  /* The registered events */
236e855f6f8SMatthew Knepley   ClassRegLog classLog;  /* The registered classes */
2378ba1e511SMatthew Knepley };
2388ba1e511SMatthew Knepley 
23952e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
24052e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active &&  _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
24152e6d16bSBarry Smith     (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \
24252e6d16bSBarry Smith    PetscLogEventBegin((e)+1,o1,o2,o3,o4))
24377c4ece6SBarry Smith 
24452e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
24552e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
24652e6d16bSBarry Smith     (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
24752e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_BEGIN(e))
248043328b6SSatish Balay 
249b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
250043328b6SSatish Balay 
25152e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
25252e6d16bSBarry Smith   (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
25352e6d16bSBarry Smith     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
25452e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_END(e))
25577c4ece6SBarry Smith 
256f141ce34SMatthew Knepley /* Creation and destruction functions */
257ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *);
258ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog);
259f141ce34SMatthew Knepley /* Registration functions */
260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *);
261f141ce34SMatthew Knepley /* Runtime functions */
262ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *);
263ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int);
264ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog);
265ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *);
266ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth);
267ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *);
268ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth);
269ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *);
270ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *);
271ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *);
272ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *);
273ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *);
274ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *);
275f141ce34SMatthew Knepley 
276ce85283eSBarry Smith /*
2773c94ec11SBarry Smith      This does not work for MPI-Uni because our include/mpiuni/mpi.h file
278ce85283eSBarry Smith    uses macros to defined the MPI operations.
27915308354SBarry Smith 
28015308354SBarry Smith      It does not work correctly from HP-UX because it processes the
281bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
282b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
2837c1e34a4SSatish Balay 
284f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
285ce85283eSBarry Smith */
286f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
28777a39924SBarry Smith /*
28877a39924SBarry Smith    Logging of MPI activities
28977a39924SBarry Smith */
29077a39924SBarry Smith #define TypeSize(buff,count,type) \
2915e3723c6SSatish Balay  (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0))
29277a39924SBarry Smith 
29377a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
2945e3723c6SSatish Balay  ((PETSC_DUMMY_COUNT = count,irecv_ct++,0) || TypeSize(irecv_len,PETSC_DUMMY_COUNT,datatype) || MPI_Irecv(buf,PETSC_DUMMY_COUNT,datatype,source,tag,comm,request))
29515308354SBarry Smith 
29677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
2975e3723c6SSatish Balay  ((PETSC_DUMMY_COUNT = count,isend_ct++,0) || TypeSize(isend_len,PETSC_DUMMY_COUNT,datatype) || MPI_Isend(buf,PETSC_DUMMY_COUNT,datatype,dest,tag,comm,request))
29815308354SBarry Smith 
2990d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
3005e3723c6SSatish Balay  ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3010d4b0b6cSBarry Smith 
3020d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
3035e3723c6SSatish Balay  ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3040d4b0b6cSBarry Smith 
3050d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
3065e3723c6SSatish Balay  ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests))
3070d4b0b6cSBarry Smith 
308ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
3095e3723c6SSatish Balay  ((PETSC_DUMMY_COUNT = count,recv_ct++,0) || TypeSize(recv_len,PETSC_DUMMY_COUNT,datatype) || MPI_Recv(buf,PETSC_DUMMY_COUNT,datatype,source,tag,comm,status))
31015308354SBarry Smith 
31177a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
3125e3723c6SSatish Balay  ((PETSC_DUMMY_COUNT = count,send_ct++,0) || TypeSize(send_len,PETSC_DUMMY_COUNT,datatype) || MPI_Send(buf,PETSC_DUMMY_COUNT,datatype,dest,tag,comm))
31377a39924SBarry Smith 
31477a39924SBarry Smith #define MPI_Wait(request,status) \
3155e3723c6SSatish Balay  ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status))
31677a39924SBarry Smith 
31777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
3185e3723c6SSatish Balay  ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d))
31977a39924SBarry Smith 
32077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
3215e3723c6SSatish Balay  ((PETSC_DUMMY_COUNT = count,wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (PETSC_DUMMY_COUNT),0) || MPI_Waitall(PETSC_DUMMY_COUNT,array_of_requests,array_of_statuses))
32277a39924SBarry Smith 
32377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
3245e3723c6SSatish Balay  ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm))
3253914022bSBarry Smith 
3260d4b0b6cSBarry Smith #else
3270d4b0b6cSBarry Smith 
3280d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
3295e3723c6SSatish Balay  (MPI_Startall(number,requests))
3300d4b0b6cSBarry Smith 
3310d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
3325e3723c6SSatish Balay  (MPI_Startall(number,requests))
3330d4b0b6cSBarry Smith 
3340d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
3355e3723c6SSatish Balay  (MPI_Start(requests))
3360d4b0b6cSBarry Smith 
337f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
338614700edSBarry Smith 
339df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
340614700edSBarry Smith 
341b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
342614700edSBarry Smith 
343df8cf0b5SBarry Smith /*
344df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
345df8cf0b5SBarry Smith */
346b0a32e0cSBarry Smith #define PetscLogMPEBegin()         0
347b0a32e0cSBarry Smith #define PetscLogMPEDump(a)         0
348614700edSBarry Smith 
349b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
350b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
351614700edSBarry Smith 
352b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
353b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
35477c4ece6SBarry Smith 
355b0a32e0cSBarry Smith #define _PetscLogPLB                        0
356b0a32e0cSBarry Smith #define _PetscLogPLE                        0
357b0a32e0cSBarry Smith #define _PetscLogPHC                        0
358b0a32e0cSBarry Smith #define _PetscLogPHD                        0
35999de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
360b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
361b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
362b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
363b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
36452e6d16bSBarry Smith #define PetscLogObjectParent(p,c)           0
365efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)        0
36652e6d16bSBarry Smith #define PetscLogObjectCreate(h)             0
36752e6d16bSBarry Smith #define PetscLogObjectDestroy(h)            0
36852e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)           0
369b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
370b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
371b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
372b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
373b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
374b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
375b0a32e0cSBarry Smith #define PetscLogBegin()                     0
376b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
377b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
378b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
379b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
380043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
38173fda44aSBarry Smith #define PetscLogObjects(a)                  0
38273fda44aSBarry Smith #define PetscLogActions(a)                  0
383ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
384ce6058e1SBarry Smith 
385aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
386ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
387ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
388ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
389ca161407SBarry Smith 
390f141ce34SMatthew Knepley /* Creation and destruction functions */
391f141ce34SMatthew Knepley #define StageLogCreate(stageLog)                     0
392f141ce34SMatthew Knepley #define StageLogDestroy(stageLog)                    0
393f141ce34SMatthew Knepley /* Registration functions */
394f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage)      0
395f141ce34SMatthew Knepley /* Runtime functions */
396f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog)                0
397f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage)                0
398f141ce34SMatthew Knepley #define StageLogPop(stageLog)                        0
399f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage)          0
400f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active)   0
401f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active)   0
402f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0
403f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0
404f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage)      0
405f141ce34SMatthew Knepley 
406aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4076daaf66cSBarry Smith 
408ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscTruth PetscPreLoadingUsed;       /* true if we are or have done preloading */
409ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscTruth PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
4101d1367b7SBarry Smith 
411043328b6SSatish Balay #define PreLoadBegin(flag,name) \
412043328b6SSatish Balay {\
413c4411e17SBarry Smith   PetscTruth PreLoading = flag;\
4148e58c17dSMatthew Knepley   int        PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\
4154dc4c822SBarry Smith   _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
416043328b6SSatish Balay   PreLoadMax = (int)(PreLoading);\
417043328b6SSatish Balay   PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
418e7592fafSBarry Smith   for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
419435da068SBarry Smith     PetscPreLoadingOn = PreLoading;\
4206e491fe6SBarry Smith     _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
4218e58c17dSMatthew Knepley     if (PreLoadIt>0) {\
4228e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4238e58c17dSMatthew Knepley     } else {\
4248e58c17dSMatthew Knepley       _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4258e58c17dSMatthew Knepley     }\
426773a6509SMatthew Knepley     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4278e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
4288e58c17dSMatthew Knepley 
429043328b6SSatish Balay #define PreLoadEnd() \
430043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
431043328b6SSatish Balay     PreLoading = PETSC_FALSE;\
432043328b6SSatish Balay   }\
433043328b6SSatish Balay }
4348e58c17dSMatthew Knepley 
435043328b6SSatish Balay #define PreLoadStage(name) \
436043328b6SSatish Balay   _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
4378e58c17dSMatthew Knepley   if (PreLoadIt>0) {\
4388e58c17dSMatthew Knepley     _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4398e58c17dSMatthew Knepley   } else {\
4408e58c17dSMatthew Knepley     _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4418e58c17dSMatthew Knepley   }\
442773a6509SMatthew Knepley   _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4438e58c17dSMatthew Knepley   _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
444e9fa29b7SSatish Balay 
445e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
44697bb86f7SLois Curfman McInnes #endif
447