xref: /petsc/include/petsclog.h (revision 0700a8246d308f50502909ba325e6169d3ee27eb)
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
7d382aafbSBarry Smith #include "petscsys.h"
8e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN
9c8d78d4dSSatish Balay 
108ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
11166c7f25SBarry Smith extern PetscLogEvent PETSC_LARGEST_EVENT;
1297bb86f7SLois Curfman McInnes 
1319b02663SBarry Smith /* Global flop counter */
14ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops;
1590fdf44cSMatthew Knepley extern PetscLogDouble petsc_tmp_flops;
1619b02663SBarry Smith 
17edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */
18ae15b995SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfo_Private(const char[],void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
196cf91177SBarry Smith #if defined(PETSC_USE_INFO)
20ae15b995SBarry Smith #define PetscInfo(A,S)                       PetscInfo_Private(__FUNCT__,A,S)
21ae15b995SBarry Smith #define PetscInfo1(A,S,a1)                   PetscInfo_Private(__FUNCT__,A,S,a1)
22ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2)                PetscInfo_Private(__FUNCT__,A,S,a1,a2)
23ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3)             PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3)
24ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4)          PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4)
25ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5)
26ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6)
27ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6,a7)
2863ba0a88SBarry Smith #else
29ae15b995SBarry Smith #define PetscInfo(A,S)                       0
30ae15b995SBarry Smith #define PetscInfo1(A,S,a1)                   0
31ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2)                0
32ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3)             0
33ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4)          0
34ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       0
35ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    0
36ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0
3763ba0a88SBarry Smith #endif
38*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoDeactivateClass(PetscClassId);
39*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoActivateClass(PetscClassId);
406cf91177SBarry Smith extern PetscTruth     PETSC_DLLEXPORT PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
41614700edSBarry Smith 
426a6a9b46SSatish Balay /* We must make these structures available if we are to access the event
436a6a9b46SSatish Balay    activation flags in the PetscLogEventBegin/End() macros. If we forced a
446a6a9b46SSatish Balay    function call each time, we could make these private.
456a6a9b46SSatish Balay */
46d49d4b11SBarry Smith 
47d49d4b11SBarry Smith /* The class naming scheme procedes as follows:
48d49d4b11SBarry Smith 
49d49d4b11SBarry Smith    Event:
50d49d4b11SBarry Smith      Events are a class which describes certain blocks of executable
51d49d4b11SBarry Smith      code. The corresponding instantiations of events are Actions.
52d49d4b11SBarry Smith 
53d49d4b11SBarry Smith    Class:
54d49d4b11SBarry Smith      Classes are the classes representing Petsc structures. The
55d49d4b11SBarry Smith      corresponding instantiations are called Objects.
56d49d4b11SBarry Smith 
57d49d4b11SBarry Smith    StageLog:
58d49d4b11SBarry Smith      This type holds information about stages of computation. These
59d49d4b11SBarry Smith      are understood to be chunks encompassing several events, or
60d49d4b11SBarry Smith      alternatively, as a covering (possibly nested) of the timeline.
61d49d4b11SBarry Smith 
62d49d4b11SBarry Smith    StageInfo:
63d49d4b11SBarry Smith      The information about each stage. This log contains an
64d49d4b11SBarry Smith      EventPerfLog and a ClassPerfLog.
65d49d4b11SBarry Smith 
66d49d4b11SBarry Smith    EventRegLog:
67d49d4b11SBarry Smith      This type holds the information generated for each event as
68d49d4b11SBarry Smith      it is registered. This information does not change and thus is
69d49d4b11SBarry Smith      stored separately from performance information.
70d49d4b11SBarry Smith 
71d49d4b11SBarry Smith    EventPerfLog:
72d49d4b11SBarry Smith      This type holds the performance information logged for each
73d49d4b11SBarry Smith      event. Usually this information is logged for only one stage.
74d49d4b11SBarry Smith 
75d49d4b11SBarry Smith    ClassRegLog:
76d49d4b11SBarry Smith      This type holds the information generated for each class as
77d49d4b11SBarry Smith      it is registered. This information does not change and thus is
78d49d4b11SBarry Smith      stored separately from performance information.
79d49d4b11SBarry Smith 
80d49d4b11SBarry Smith    ClassPerfLog:
81d49d4b11SBarry Smith      This class holds information describing class/object usage during
82d49d4b11SBarry Smith      a run. Usually this information is logged for only one stage.
83d49d4b11SBarry Smith */
84d49d4b11SBarry Smith 
856a6a9b46SSatish Balay /* Default log */
866a6a9b46SSatish Balay typedef struct _n_StageLog *StageLog;
876a6a9b46SSatish Balay extern PETSC_DLLEXPORT StageLog _stageLog;
886a6a9b46SSatish Balay 
896a6a9b46SSatish Balay /* A simple stack (should replace) */
906a6a9b46SSatish Balay typedef struct _n_IntStack *IntStack;
916a6a9b46SSatish Balay 
926a6a9b46SSatish Balay /* The structures for logging performance */
936a6a9b46SSatish Balay typedef struct {
946a6a9b46SSatish Balay   int            id;            /* The integer identifying this section */
956a6a9b46SSatish Balay   PetscTruth     active;        /* The flag to activate logging */
966a6a9b46SSatish Balay   PetscTruth     visible;       /* The flag to print info in summary */
976a6a9b46SSatish Balay   int            depth;         /* The nesting depth of the event call */
986a6a9b46SSatish Balay   int            count;         /* The number of times this section was executed */
996a6a9b46SSatish Balay   PetscLogDouble flops;         /* The flops used in this section */
1006a6a9b46SSatish Balay   PetscLogDouble time;          /* The time taken for this section */
1016a6a9b46SSatish Balay   PetscLogDouble numMessages;   /* The number of messages in this section */
1026a6a9b46SSatish Balay   PetscLogDouble messageLength; /* The total message lengths in this section */
1036a6a9b46SSatish Balay   PetscLogDouble numReductions; /* The number of reductions in this section */
1046a6a9b46SSatish Balay } EventPerfInfo;
1056a6a9b46SSatish Balay 
1066a6a9b46SSatish Balay typedef struct {
107*0700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1086a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1096a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1106a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1116a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
1126a6a9b46SSatish Balay } ClassPerfInfo;
1136a6a9b46SSatish Balay 
1146a6a9b46SSatish Balay /* The structures for logging registration */
1156a6a9b46SSatish Balay typedef struct  {
1166a6a9b46SSatish Balay   char         *name;   /* The class name */
117*0700a824SBarry Smith   PetscClassId classid; /* The integer identifying this class */
1186a6a9b46SSatish Balay } ClassRegInfo;
1196a6a9b46SSatish Balay 
1206a6a9b46SSatish Balay typedef struct {
1216a6a9b46SSatish Balay   char         *name;   /* The name of this event */
122*0700a824SBarry Smith   PetscClassId classid; /* The class id for this event (should maybe give class ID instead) */
1236a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1246a6a9b46SSatish Balay   int          mpe_id_begin; /* MPE IDs that define the event */
1256a6a9b46SSatish Balay   int          mpe_id_end;
1266a6a9b46SSatish Balay #endif
1276a6a9b46SSatish Balay } EventRegInfo;
1286a6a9b46SSatish Balay 
1296a6a9b46SSatish Balay typedef struct _n_EventRegLog *EventRegLog;
1306a6a9b46SSatish Balay struct _n_EventRegLog {
1316a6a9b46SSatish Balay   int           numEvents; /* The number of registered events */
1326a6a9b46SSatish Balay   int           maxEvents; /* The maximum number of events */
1336a6a9b46SSatish Balay   EventRegInfo *eventInfo; /* The registration information for each event */
1346a6a9b46SSatish Balay };
1356a6a9b46SSatish Balay 
1366a6a9b46SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog;
1376a6a9b46SSatish Balay struct _n_EventPerfLog {
1386a6a9b46SSatish Balay   int            numEvents; /* The number of logging events */
1396a6a9b46SSatish Balay   int            maxEvents; /* The maximum number of events */
1406a6a9b46SSatish Balay   EventPerfInfo *eventInfo; /* The performance information for each event */
1416a6a9b46SSatish Balay };
1426a6a9b46SSatish Balay 
1436a6a9b46SSatish Balay /* The structure for logging class information */
1446a6a9b46SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog;
1456a6a9b46SSatish Balay struct _n_ClassRegLog {
1466a6a9b46SSatish Balay   int           numClasses; /* The number of classes registered */
1476a6a9b46SSatish Balay   int           maxClasses; /* The maximum number of classes */
148*0700a824SBarry Smith   ClassRegInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
1496a6a9b46SSatish Balay };
1506a6a9b46SSatish Balay 
1516a6a9b46SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog;
1526a6a9b46SSatish Balay struct _n_ClassPerfLog {
1536a6a9b46SSatish Balay   int            numClasses; /* The number of logging classes */
1546a6a9b46SSatish Balay   int            maxClasses; /* The maximum number of classes */
155*0700a824SBarry Smith   ClassPerfInfo *classInfo;  /* The structure for class information (classids are monotonicly increasing) */
1566a6a9b46SSatish Balay };
1576a6a9b46SSatish Balay 
1586a6a9b46SSatish Balay /* The structures for logging in stages */
1596a6a9b46SSatish Balay typedef struct _StageInfo {
1606a6a9b46SSatish Balay   char         *name;     /* The stage name */
1616a6a9b46SSatish Balay   PetscTruth    used;     /* The stage was pushed on this processor */
1626a6a9b46SSatish Balay   EventPerfInfo perfInfo; /* The stage performance information */
1636a6a9b46SSatish Balay   EventPerfLog  eventLog; /* The event information for this stage */
1646a6a9b46SSatish Balay   ClassPerfLog  classLog; /* The class information for this stage */
1656a6a9b46SSatish Balay } StageInfo;
1666a6a9b46SSatish Balay 
1676a6a9b46SSatish Balay struct _n_StageLog {
1686a6a9b46SSatish Balay   /* Size information */
1696a6a9b46SSatish Balay   int         numStages; /* The number of registered stages */
1706a6a9b46SSatish Balay   int         maxStages; /* The maximum number of stages */
1716a6a9b46SSatish Balay   /* Runtime information */
1726a6a9b46SSatish Balay   IntStack    stack;     /* The stack for active stages */
1736a6a9b46SSatish Balay   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
1746a6a9b46SSatish Balay   /* Stage specific information */
1756a6a9b46SSatish Balay   StageInfo  *stageInfo; /* The information for each stage */
1766a6a9b46SSatish Balay   EventRegLog eventLog;  /* The registered events */
1776a6a9b46SSatish Balay   ClassRegLog classLog;  /* The registered classes */
1786a6a9b46SSatish Balay };
1796a6a9b46SSatish Balay 
180aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
181614700edSBarry Smith 
182da63de55SLois Curfman McInnes /*
183da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
184da63de55SLois Curfman McInnes 
185da63de55SLois Curfman McInnes    For the complex numbers version, note that
186da63de55SLois Curfman McInnes        1 complex addition = 2 flops
187da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
188da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
189da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
190da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
191da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
192da63de55SLois Curfman McInnes    among the various arithmetic operations.
193da63de55SLois Curfman McInnes  */
194da63de55SLois Curfman McInnes 
195aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
196542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
197da63de55SLois Curfman McInnes #else
198542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
199bf3909cdSBarry Smith #endif
200bf3909cdSBarry Smith 
201bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
202542d4b3fSSatish Balay #define PetscLogFlops(n) (petsc_tmp_flops = (PETSC_FLOPS_PER_OP*((PetscLogDouble)n)), ((petsc_tmp_flops < 0) ? PETSC_ERR_FLOP_COUNT : (_TotalFlops += petsc_tmp_flops,0)))
203542d4b3fSSatish Balay #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n))
204bf3909cdSBarry Smith #else
205542d4b3fSSatish Balay #define PetscLogFlops(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n),0)
206542d4b3fSSatish Balay #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n))
207da63de55SLois Curfman McInnes #endif
20877c4ece6SBarry Smith 
209aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
21077c4ece6SBarry Smith #include "mpe.h"
211ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT        PetscLogMPEBegin(void);
212ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT        PetscLogMPEDump(const char[]);
21335d8aa7fSBarry Smith extern PetscTruth UseMPE;
214043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \
215335e4f37SSatish Balay   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
216a1b71033SSatish Balay    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,NULL) : 0)
217043328b6SSatish Balay 
218043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \
219335e4f37SSatish Balay   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
220a1b71033SSatish Balay    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,NULL) : 0)
221043328b6SSatish Balay 
222614700edSBarry Smith #else
22352e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0
22452e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e)   0
22577c4ece6SBarry Smith #endif
22677c4ece6SBarry Smith 
227166c7f25SBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
228166c7f25SBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
229ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject);
230ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject);
23177c4ece6SBarry Smith 
232043328b6SSatish Balay #define PetscLogObjectParent(p,c) \
23352e6d16bSBarry Smith   ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0)
23452e6d16bSBarry Smith 
235efee365bSSatish Balay #define PetscLogObjectParents(p,n,d)  0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}}
236d38fa0fbSBarry Smith #define PetscLogObjectCreate(h)      ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0)
237d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h)     ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0)
23852e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)    (((PetscObject)(p))->mem += (m),0)
2398ba1e511SMatthew Knepley /* Initialization functions */
240ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void);
241ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void);
242ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *);
243ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth);
244ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth);
2458ba1e511SMatthew Knepley /* General functions */
246ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]);
247ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void);
248ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
2496849ba73SBarry Smith                    PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
250ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
2518ba1e511SMatthew Knepley /* Output functions */
252ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]);
25378392ef1SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintDetailed(MPI_Comm, const char[]);
254ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]);
2558ba1e511SMatthew Knepley /* Counter functions */
256ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *);
2578ba1e511SMatthew Knepley /* Stage functions */
258166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(const char[],PetscLogStage*);
259166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(PetscLogStage);
260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void);
261166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(PetscLogStage, PetscTruth);
262166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(PetscLogStage, PetscTruth *);
263166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(PetscLogStage, PetscTruth);
264166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(PetscLogStage, PetscTruth *);
265166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], PetscLogStage *);
2668ba1e511SMatthew Knepley /* Event functions */
267*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(const char[], PetscClassId,PetscLogEvent*);
268166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscLogEvent);
269166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscLogEvent);
270166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscLogEvent, PetscTruth);
271*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscClassId);
272*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscClassId);
2739afaeae2SBarry Smith 
2748ba1e511SMatthew Knepley 
2758ba1e511SMatthew Knepley /* Global counters */
276ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct;
277ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct;
278ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct;
279ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct;
280ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len;
281ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len;
282ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len;
283ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len;
284ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct;
28501faf4e4SMatthew Knepley extern PETSC_DLLEXPORT PetscLogDouble gather_ct;
28601faf4e4SMatthew Knepley extern PETSC_DLLEXPORT PetscLogDouble scatter_ct;
287ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct;
288ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct;
289ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct;
290ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct;
2918ba1e511SMatthew Knepley 
29252e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
29352e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active &&  _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
29452e6d16bSBarry Smith     (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \
29552e6d16bSBarry Smith    PetscLogEventBegin((e)+1,o1,o2,o3,o4))
29677c4ece6SBarry Smith 
29752e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
29852e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
29952e6d16bSBarry Smith     (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
30052e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_BEGIN(e))
301043328b6SSatish Balay 
302b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
303043328b6SSatish Balay 
30452e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
30552e6d16bSBarry Smith   (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
30652e6d16bSBarry Smith     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
30752e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_END(e))
30877c4ece6SBarry Smith 
309f141ce34SMatthew Knepley /* Creation and destruction functions */
310ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *);
311ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog);
312f141ce34SMatthew Knepley /* Registration functions */
313ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *);
314f141ce34SMatthew Knepley /* Runtime functions */
315ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *);
316ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int);
317ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog);
318ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *);
319ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth);
320ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *);
321ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth);
322ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *);
323ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *);
324ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *);
325ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *);
326ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *);
327ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *);
328f141ce34SMatthew Knepley 
329e630d40cSMatthew Knepley EXTERN PetscErrorCode PETSC_DLLEXPORT EventRegLogGetEvent(EventRegLog, const char [], PetscLogEvent *);
330e630d40cSMatthew Knepley 
331003131ecSBarry Smith EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble*);
332003131ecSBarry Smith EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
333003131ecSBarry Smith 
334ce85283eSBarry Smith /*
335f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
336f621e05eSBarry Smith    their sizes.
337f621e05eSBarry Smith 
3383c94ec11SBarry Smith      This does not work for MPI-Uni because our include/mpiuni/mpi.h file
339ce85283eSBarry Smith    uses macros to defined the MPI operations.
34015308354SBarry Smith 
34115308354SBarry Smith      It does not work correctly from HP-UX because it processes the
342bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
343b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3447c1e34a4SSatish Balay 
345f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
346ce85283eSBarry Smith */
347c8217ed5SSatish Balay #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
34877a39924SBarry Smith /*
34977a39924SBarry Smith    Logging of MPI activities
35077a39924SBarry Smith */
351f95db71bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode TypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type)
352f95db71bSBarry Smith {
353618e35e3SBarry Smith   PetscMPIInt mysize; return  (MPI_Type_size(type,&mysize) || ((*buff += (PetscLogDouble) (count*mysize)),0));
354f95db71bSBarry Smith }
35577a39924SBarry Smith 
35677a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
357f95db71bSBarry Smith  ((irecv_ct++,0) || TypeSize(&irecv_len,count,datatype) || MPI_Irecv(buf,count,datatype,source,tag,comm,request))
35815308354SBarry Smith 
35977a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
360f95db71bSBarry Smith  ((isend_ct++,0) || TypeSize(&isend_len,count,datatype) || MPI_Isend(buf,count,datatype,dest,tag,comm,request))
36115308354SBarry Smith 
3620d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
363f95db71bSBarry Smith  ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(&irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3640d4b0b6cSBarry Smith 
3650d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
366f95db71bSBarry Smith  ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3670d4b0b6cSBarry Smith 
3680d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
369f95db71bSBarry Smith  ((isend_ct++,0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Start(requests))
3700d4b0b6cSBarry Smith 
371ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
372f95db71bSBarry Smith  ((recv_ct++,0) || TypeSize(&recv_len,count,datatype) || MPI_Recv(buf,count,datatype,source,tag,comm,status))
37315308354SBarry Smith 
37477a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
375f95db71bSBarry Smith  ((send_ct++,0) || TypeSize(&send_len,count,datatype) || MPI_Send(buf,count,datatype,dest,tag,comm))
37677a39924SBarry Smith 
37777a39924SBarry Smith #define MPI_Wait(request,status) \
3785e3723c6SSatish Balay  ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status))
37977a39924SBarry Smith 
38077a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
3815e3723c6SSatish Balay  ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d))
38277a39924SBarry Smith 
38377a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
384f95db71bSBarry Smith  ((wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall(count,array_of_requests,array_of_statuses))
38577a39924SBarry Smith 
38677a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
3875e3723c6SSatish Balay  ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm))
3883914022bSBarry Smith 
38901faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
39001faf4e4SMatthew Knepley  ((gather_ct++,0) || MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm))
39101faf4e4SMatthew Knepley 
39201faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
39301faf4e4SMatthew Knepley  ((gather_ct++,0) || MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm))
39401faf4e4SMatthew Knepley 
39501faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
396f95db71bSBarry Smith  ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm))
39701faf4e4SMatthew Knepley 
39801faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
399f95db71bSBarry Smith  ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm))
40001faf4e4SMatthew Knepley 
40101faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
402f95db71bSBarry Smith   ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm))
40301faf4e4SMatthew Knepley 
40401faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
405f95db71bSBarry Smith   ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm))
40601faf4e4SMatthew Knepley 
4070d4b0b6cSBarry Smith #else
4080d4b0b6cSBarry Smith 
4090d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
4105e3723c6SSatish Balay  (MPI_Startall(number,requests))
4110d4b0b6cSBarry Smith 
4120d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
4135e3723c6SSatish Balay  (MPI_Startall(number,requests))
4140d4b0b6cSBarry Smith 
4150d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
4165e3723c6SSatish Balay  (MPI_Start(requests))
4170d4b0b6cSBarry Smith 
418c8217ed5SSatish Balay #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
419614700edSBarry Smith 
420df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
421614700edSBarry Smith 
422b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
423d854a674SSatish Balay #define PetscLogFlopsNoError(n)
424614700edSBarry Smith 
425df8cf0b5SBarry Smith /*
426df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
427df8cf0b5SBarry Smith */
428b0a32e0cSBarry Smith #define PetscLogMPEBegin()         0
429b0a32e0cSBarry Smith #define PetscLogMPEDump(a)         0
430614700edSBarry Smith 
431b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
432b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
433614700edSBarry Smith 
434b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
435b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
436e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)  0
43777c4ece6SBarry Smith 
438b0a32e0cSBarry Smith #define _PetscLogPLB                        0
439b0a32e0cSBarry Smith #define _PetscLogPLE                        0
440b0a32e0cSBarry Smith #define _PetscLogPHC                        0
441b0a32e0cSBarry Smith #define _PetscLogPHD                        0
44299de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
443b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
444b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
445b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
446b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
44752e6d16bSBarry Smith #define PetscLogObjectParent(p,c)           0
448efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)        0
44952e6d16bSBarry Smith #define PetscLogObjectCreate(h)             0
45052e6d16bSBarry Smith #define PetscLogObjectDestroy(h)            0
45152e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)           0
452b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
453b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
454b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
455b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
456b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
457b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
45878392ef1SBarry Smith #define PetscLogPrintDetailed(comm,file)    0
459b0a32e0cSBarry Smith #define PetscLogBegin()                     0
460b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
461b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
462b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
463b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
464043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
46573fda44aSBarry Smith #define PetscLogObjects(a)                  0
46673fda44aSBarry Smith #define PetscLogActions(a)                  0
467ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
468ce6058e1SBarry Smith 
469aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
470ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
471ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
472ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
473ca161407SBarry Smith 
474f141ce34SMatthew Knepley /* Creation and destruction functions */
475f141ce34SMatthew Knepley #define StageLogCreate(stageLog)                     0
476f141ce34SMatthew Knepley #define StageLogDestroy(stageLog)                    0
477f141ce34SMatthew Knepley /* Registration functions */
478f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage)      0
479f141ce34SMatthew Knepley /* Runtime functions */
480f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog)                0
481f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage)                0
482f141ce34SMatthew Knepley #define StageLogPop(stageLog)                        0
483f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage)          0
484f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active)   0
485f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active)   0
486f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0
487f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0
488f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage)      0
489fad68dfaSSatish Balay #define PetscLogStageGetId(a,b)                      (*(b)=0,0)
490fad68dfaSSatish Balay #define PetscLogStageSetActive(a,b)                  0
4916a6a9b46SSatish Balay #define PetscLogStageGetActive(a,b)                  0
4926a6a9b46SSatish Balay #define PetscLogStageGetVisible(a,b)                 0
4936a6a9b46SSatish Balay #define PetscLogStageSetVisible(a,b)                 0
494f141ce34SMatthew Knepley 
495aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4966daaf66cSBarry Smith 
497bf5c43c7SMatthew Knepley /* Special support for C++ */
498bf5c43c7SMatthew Knepley #include "petsclog.hh"
499bf5c43c7SMatthew Knepley 
500043328b6SSatish Balay #define PreLoadBegin(flag,name) \
501043328b6SSatish Balay {\
502c4411e17SBarry Smith   PetscTruth     PreLoading = flag;\
5038cbcd9ccSBarry Smith   int            PreLoadMax,PreLoadIt;\
504166c7f25SBarry Smith   PetscLogStage  _stageNum;\
5058cbcd9ccSBarry Smith   PetscErrorCode _3_ierr;	\
5064dc4c822SBarry Smith   _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
507043328b6SSatish Balay   PreLoadMax = (int)(PreLoading);\
508043328b6SSatish Balay   PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
509e7592fafSBarry Smith   for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
510435da068SBarry Smith     PetscPreLoadingOn = PreLoading;\
5116e491fe6SBarry Smith     _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
5128e58c17dSMatthew Knepley     if (PreLoadIt>0) {\
5138e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
5148e58c17dSMatthew Knepley     } else {\
515a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
5168e58c17dSMatthew Knepley     }\
517773a6509SMatthew Knepley     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
5188e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
5198e58c17dSMatthew Knepley 
520043328b6SSatish Balay #define PreLoadEnd() \
521043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
522043328b6SSatish Balay     PreLoading = PETSC_FALSE;\
523043328b6SSatish Balay   }\
524043328b6SSatish Balay }
5258e58c17dSMatthew Knepley 
526043328b6SSatish Balay #define PreLoadStage(name) \
527043328b6SSatish Balay   _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
5288e58c17dSMatthew Knepley   if (PreLoadIt>0) {\
5298e58c17dSMatthew Knepley     _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
5308e58c17dSMatthew Knepley   } else {\
531a3bc4eb9SBarry Smith     _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr);	\
5328e58c17dSMatthew Knepley   }\
533773a6509SMatthew Knepley   _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
5348e58c17dSMatthew Knepley   _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
535e9fa29b7SSatish Balay 
536e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
53797bb86f7SLois Curfman McInnes #endif
538