xref: /petsc/include/petsclog.h (revision 5e3723c648426056cbd46ee0443e3b0f8d332fa0)
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 */
206849ba73SBarry Smith extern PetscEvent PETSC_Barrier;
2197bb86f7SLois Curfman McInnes 
2219b02663SBarry Smith /* Global flop counter */
23b0a32e0cSBarry Smith extern PetscLogDouble _TotalFlops;
2419b02663SBarry Smith 
25edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */
26dfbe8321SBarry Smith EXTERN PetscErrorCode        PetscLogInfo(void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
276849ba73SBarry Smith EXTERN PetscErrorCode        PetscLogInfoDeactivateClass(PetscCookie);
286849ba73SBarry Smith EXTERN PetscErrorCode        PetscLogInfoActivateClass(PetscCookie);
29b0a32e0cSBarry Smith extern PetscTruth PetscLogPrintInfo;  /* if true, indicates PetscLogInfo() is turned on */
30614700edSBarry Smith 
31aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
32614700edSBarry Smith 
33da63de55SLois Curfman McInnes /*
34da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
35da63de55SLois Curfman McInnes 
36da63de55SLois Curfman McInnes    For the complex numbers version, note that
37da63de55SLois Curfman McInnes        1 complex addition = 2 flops
38da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
39da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
40da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
41da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
42da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
43da63de55SLois Curfman McInnes    among the various arithmetic operations.
44da63de55SLois Curfman McInnes  */
45da63de55SLois Curfman McInnes 
46aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
47b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (4*n),0)
48da63de55SLois Curfman McInnes #else
49b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (n),0)
50da63de55SLois Curfman McInnes #endif
5177c4ece6SBarry Smith 
52aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
5377c4ece6SBarry Smith #include "mpe.h"
54dfbe8321SBarry Smith EXTERN PetscErrorCode        PetscLogMPEBegin(void);
55dfbe8321SBarry Smith EXTERN PetscErrorCode        PetscLogMPEDump(const char[]);
5635d8aa7fSBarry Smith extern PetscTruth UseMPE;
57043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \
5874968b1dSMatthew Knepley   if(UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) \
59639ffa60SSatish Balay     MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,(char*)"");
60043328b6SSatish Balay 
61043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \
6274968b1dSMatthew Knepley   if(UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) \
63639ffa60SSatish Balay     MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,(char*)"");
64043328b6SSatish Balay 
65614700edSBarry Smith #else
66043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e)
67043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e)
6877c4ece6SBarry Smith #endif
6977c4ece6SBarry Smith 
706849ba73SBarry Smith EXTERN PetscErrorCode (*_PetscLogPLB)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
716849ba73SBarry Smith EXTERN PetscErrorCode (*_PetscLogPLE)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
72dfbe8321SBarry Smith EXTERN PetscErrorCode (*_PetscLogPHC)(PetscObject);
73dfbe8321SBarry Smith EXTERN PetscErrorCode (*_PetscLogPHD)(PetscObject);
7477c4ece6SBarry Smith 
75043328b6SSatish Balay #define PetscLogObjectParent(p,c) \
76043328b6SSatish Balay   if (c) {\
774482741eSBarry Smith     PetscValidHeader((PetscObject)(c),2);\
784482741eSBarry Smith     PetscValidHeader((PetscObject)(p),1);\
798ba1e511SMatthew Knepley     ((PetscObject)(c))->parent = (PetscObject)(p);\
80043328b6SSatish Balay     ((PetscObject)(c))->parentid = ((PetscObject)p)->id;\
81043328b6SSatish Balay   }
82043328b6SSatish Balay #define PetscLogObjectParents(p,n,d) {int _i; for (_i=0; _i<n; _i++) PetscLogObjectParent(p,(d)[_i]);}
838ba1e511SMatthew Knepley #define PetscLogObjectCreate(h)      {if (_PetscLogPHC) (*_PetscLogPHC)((PetscObject)h);}
848ba1e511SMatthew Knepley #define PetscLogObjectDestroy(h)     {if (_PetscLogPHD) (*_PetscLogPHD)((PetscObject)h);}
854482741eSBarry Smith #define PetscLogObjectMemory(p,m)    {PetscValidHeader((PetscObject)p,1);((PetscObject)(p))->mem += (m);}
868ba1e511SMatthew Knepley /* Initialization functions */
87dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogBegin(void);
88dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogAllBegin(void);
89dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
90dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogActions(PetscTruth);
91dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjects(PetscTruth);
928ba1e511SMatthew Knepley /* General functions */
93dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogGetRGBColor(const char*[]);
94dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogDestroy(void);
956849ba73SBarry Smith EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
966849ba73SBarry Smith                    PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
97dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
988ba1e511SMatthew Knepley /* Output functions */
99dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogPrintSummary(MPI_Comm, const char[]);
100dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogDump(const char[]);
1018ba1e511SMatthew Knepley /* Counter functions */
102dfbe8321SBarry Smith EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
1038ba1e511SMatthew Knepley /* Stage functions */
104dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageRegister(int*, const char[]);
105dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStagePush(int);
106dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStagePop(void);
107dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageSetActive(int, PetscTruth);
108dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetActive(int, PetscTruth *);
109dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageSetVisible(int, PetscTruth);
110dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetVisible(int, PetscTruth *);
111dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetId(const char [], int *);
1128ba1e511SMatthew Knepley /* Event functions */
1136849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventRegister(PetscEvent*, const char[], PetscCookie);
1146849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventActivate(PetscEvent);
1156849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventDeactivate(PetscEvent);
1166849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscEvent, PetscTruth);
1176849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventActivateClass(PetscCookie);
1186849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscCookie);
1198ba1e511SMatthew Knepley /* Class functions */
1206849ba73SBarry Smith EXTERN PetscErrorCode PetscLogClassRegister(PetscCookie*, const char []);
1218ba1e511SMatthew Knepley 
1228ba1e511SMatthew Knepley /* Global counters */
1238ba1e511SMatthew Knepley extern PetscLogDouble irecv_ct,  isend_ct,  recv_ct,  send_ct;
1248ba1e511SMatthew Knepley extern PetscLogDouble irecv_len, isend_len, recv_len, send_len;
1258ba1e511SMatthew Knepley extern PetscLogDouble allreduce_ct;
1268ba1e511SMatthew Knepley extern PetscLogDouble wait_ct, wait_any_ct, wait_all_ct, sum_of_waits_ct;
127*5e3723c6SSatish Balay extern int            PETSC_DUMMY_SIZE, PETSC_DUMMY_COUNT;
1288ba1e511SMatthew Knepley 
1298ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event
1308ba1e511SMatthew Knepley    activation flags in the PetscLogEventBegin/End() macros. If we forced a
1318ba1e511SMatthew Knepley    function call each time, we could leave these structures in plog.h
1328ba1e511SMatthew Knepley */
133e855f6f8SMatthew Knepley /* Default log */
134e855f6f8SMatthew Knepley typedef struct _StageLog *StageLog;
135e855f6f8SMatthew Knepley extern StageLog _stageLog;
136e855f6f8SMatthew Knepley 
137e855f6f8SMatthew Knepley /* A simple stack (should replace) */
138e855f6f8SMatthew Knepley typedef struct _IntStack *IntStack;
139e855f6f8SMatthew Knepley 
140e855f6f8SMatthew Knepley /* The structures for logging performance */
141af80a1fbSMatthew Knepley typedef struct _EventPerfInfo {
142e855f6f8SMatthew Knepley   int            id;            /* The integer identifying this section */
143800883a5SMatthew Knepley   PetscTruth     active;        /* The flag to activate logging */
144800883a5SMatthew Knepley   PetscTruth     visible;       /* The flag to print info in summary */
1458ba1e511SMatthew Knepley   int            depth;         /* The nesting depth of the event call */
1468ba1e511SMatthew Knepley   int            count;         /* The number of times this section was executed */
1478ba1e511SMatthew Knepley   PetscLogDouble flops;         /* The flops used in this section */
1488ba1e511SMatthew Knepley   PetscLogDouble time;          /* The time taken for this section */
1498ba1e511SMatthew Knepley   PetscLogDouble numMessages;   /* The number of messages in this section */
1508ba1e511SMatthew Knepley   PetscLogDouble messageLength; /* The total message lengths in this section */
1518ba1e511SMatthew Knepley   PetscLogDouble numReductions; /* The number of reductions in this section */
152af80a1fbSMatthew Knepley } EventPerfInfo;
1538ba1e511SMatthew Knepley 
154e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo {
155e855f6f8SMatthew Knepley   int            id;           /* The integer identifying this class */
1568ba1e511SMatthew Knepley   int            creations;    /* The number of objects of this class created */
1578ba1e511SMatthew Knepley   int            destructions; /* The number of objects of this class destroyed */
1588ba1e511SMatthew Knepley   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1598ba1e511SMatthew Knepley   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
160e855f6f8SMatthew Knepley } ClassPerfInfo;
1618ba1e511SMatthew Knepley 
162e855f6f8SMatthew Knepley /* The structures for logging registration */
163e855f6f8SMatthew Knepley typedef struct _ClassRegInfo {
164e855f6f8SMatthew Knepley   char            *name;   /* The class name */
1656849ba73SBarry Smith   PetscCookie cookie; /* The integer identifying this class */
166e855f6f8SMatthew Knepley } ClassRegInfo;
167e855f6f8SMatthew Knepley 
168e855f6f8SMatthew Knepley typedef struct _EventRegInfo {
169e855f6f8SMatthew Knepley   char            *name;   /* The name of this event */
1706849ba73SBarry Smith   PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */
17144451550SSatish Balay #if defined (PETSC_HAVE_MPE)
17244451550SSatish Balay   int             mpe_id_begin; /* MPE IDs that define the event */
17344451550SSatish Balay   int             mpe_id_end;
17444451550SSatish Balay #endif
175e855f6f8SMatthew Knepley } EventRegInfo;
176e855f6f8SMatthew Knepley 
177e855f6f8SMatthew Knepley typedef struct _EventRegLog *EventRegLog;
178e855f6f8SMatthew Knepley struct _EventRegLog {
179e855f6f8SMatthew Knepley   int           numEvents; /* The number of registered events */
180e855f6f8SMatthew Knepley   int           maxEvents; /* The maximum number of events */
181e855f6f8SMatthew Knepley   EventRegInfo *eventInfo; /* The registration information for each event */
1828ba1e511SMatthew Knepley };
1838ba1e511SMatthew Knepley 
184e855f6f8SMatthew Knepley typedef struct _EventPerfLog *EventPerfLog;
185e855f6f8SMatthew Knepley struct _EventPerfLog {
186e855f6f8SMatthew Knepley   int            numEvents; /* The number of logging events */
187e855f6f8SMatthew Knepley   int            maxEvents; /* The maximum number of events */
188af80a1fbSMatthew Knepley   EventPerfInfo *eventInfo; /* The performance information for each event */
189e855f6f8SMatthew Knepley };
1908ba1e511SMatthew Knepley 
191e855f6f8SMatthew Knepley /* The structure for logging class information */
192e855f6f8SMatthew Knepley typedef struct _ClassRegLog *ClassRegLog;
193e855f6f8SMatthew Knepley struct _ClassRegLog {
194e855f6f8SMatthew Knepley   int           numClasses; /* The number of classes registered */
195e855f6f8SMatthew Knepley   int           maxClasses; /* The maximum number of classes */
196e855f6f8SMatthew Knepley   ClassRegInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
197e855f6f8SMatthew Knepley };
198e855f6f8SMatthew Knepley 
199e855f6f8SMatthew Knepley typedef struct _ClassPerfLog *ClassPerfLog;
200e855f6f8SMatthew Knepley struct _ClassPerfLog {
201e855f6f8SMatthew Knepley   int            numClasses; /* The number of logging classes */
202e855f6f8SMatthew Knepley   int            maxClasses; /* The maximum number of classes */
203e855f6f8SMatthew Knepley   ClassPerfInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
204e855f6f8SMatthew Knepley };
205e855f6f8SMatthew Knepley 
206e855f6f8SMatthew Knepley /* The structures for logging in stages */
207e855f6f8SMatthew Knepley typedef struct _StageInfo {
208e855f6f8SMatthew Knepley   char         *name;     /* The stage name */
209773a6509SMatthew Knepley   PetscTruth    used;     /* The stage was pushed on this processor */
210af80a1fbSMatthew Knepley   EventPerfInfo perfInfo; /* The stage performance information */
211e855f6f8SMatthew Knepley   EventPerfLog  eventLog; /* The event information for this stage */
212e855f6f8SMatthew Knepley   ClassPerfLog  classLog; /* The class information for this stage */
213e855f6f8SMatthew Knepley } StageInfo;
214e855f6f8SMatthew Knepley 
2158ba1e511SMatthew Knepley struct _StageLog {
2168ba1e511SMatthew Knepley   /* Size information */
2178ba1e511SMatthew Knepley   int         numStages; /* The number of registered stages */
2188ba1e511SMatthew Knepley   int         maxStages; /* The maximum number of stages */
2198ba1e511SMatthew Knepley   /* Runtime information */
2208ba1e511SMatthew Knepley   IntStack    stack;     /* The stack for active stages */
2218ba1e511SMatthew Knepley   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
2228ba1e511SMatthew Knepley   /* Stage specific information */
223e855f6f8SMatthew Knepley   StageInfo  *stageInfo; /* The information for each stage */
224e855f6f8SMatthew Knepley   EventRegLog eventLog;  /* The registered events */
225e855f6f8SMatthew Knepley   ClassRegLog classLog;  /* The registered classes */
2268ba1e511SMatthew Knepley };
2278ba1e511SMatthew Knepley 
228043328b6SSatish Balay #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0; \
229043328b6SSatish Balay {\
230043328b6SSatish Balay   int _2_ierr;\
231773a6509SMatthew Knepley   if (_PetscLogPLB && \
232773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
233773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
2346e491fe6SBarry Smith     _2_ierr = PetscLogEventBegin((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\
2356e491fe6SBarry Smith     _2_ierr = MPI_Barrier(cm);CHKERRQ(_2_ierr);\
2366e491fe6SBarry Smith     _2_ierr = PetscLogEventEnd((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\
237005c665bSBarry Smith   }\
2386e491fe6SBarry Smith   _2_ierr = PetscLogEventBegin((e)+1,o1,o2,o3,o4);CHKERRQ(_2_ierr);\
239005c665bSBarry Smith }
24077c4ece6SBarry Smith 
241043328b6SSatish Balay #define PetscLogEventBegin(e,o1,o2,o3,o4) 0; \
242043328b6SSatish Balay {\
243773a6509SMatthew Knepley   if (_PetscLogPLB && \
244773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
245773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
246043328b6SSatish Balay     (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\
247043328b6SSatish Balay   }\
248043328b6SSatish Balay   PETSC_LOG_EVENT_MPE_BEGIN(e); \
249a1b5d808SSatish Balay }
250043328b6SSatish Balay 
251b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
252043328b6SSatish Balay 
253043328b6SSatish Balay #define PetscLogEventEnd(e,o1,o2,o3,o4) 0; \
254043328b6SSatish Balay {\
255773a6509SMatthew Knepley   if (_PetscLogPLE && \
256773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
257773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
258043328b6SSatish Balay     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\
259043328b6SSatish Balay   }\
260043328b6SSatish Balay   PETSC_LOG_EVENT_MPE_END(e); \
261a1b5d808SSatish Balay }
26277c4ece6SBarry Smith 
263f141ce34SMatthew Knepley /* Creation and destruction functions */
264dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogCreate(StageLog *);
265dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogDestroy(StageLog);
266f141ce34SMatthew Knepley /* Registration functions */
267dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogRegister(StageLog, const char [], int *);
268f141ce34SMatthew Knepley /* Runtime functions */
269dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogGetStageLog(StageLog *);
270dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogPush(StageLog, int);
271dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogPop(StageLog);
272dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetCurrent(StageLog, int *);
273dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogSetActive(StageLog, int, PetscTruth);
274dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetActive(StageLog, int, PetscTruth *);
275dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogSetVisible(StageLog, int, PetscTruth);
276dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetVisible(StageLog, int, PetscTruth *);
277dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetStage(StageLog, const char [], int *);
278aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetClassRegLog(StageLog, ClassRegLog *);
279aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetEventRegLog(StageLog, EventRegLog *);
280aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *);
281aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetEventPerfLog(StageLog, int, EventPerfLog *);
282f141ce34SMatthew Knepley 
283ce85283eSBarry Smith /*
2843c94ec11SBarry Smith      This does not work for MPI-Uni because our include/mpiuni/mpi.h file
285ce85283eSBarry Smith    uses macros to defined the MPI operations.
28615308354SBarry Smith 
28715308354SBarry Smith      It does not work correctly from HP-UX because it processes the
288bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
289b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
2907c1e34a4SSatish Balay 
291f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
292ce85283eSBarry Smith */
293f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
29477a39924SBarry Smith /*
29577a39924SBarry Smith    Logging of MPI activities
29677a39924SBarry Smith */
29777a39924SBarry Smith #define TypeSize(buff,count,type) \
298*5e3723c6SSatish Balay  (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0))
29977a39924SBarry Smith 
30077a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
301*5e3723c6SSatish 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))
30215308354SBarry Smith 
30377a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
304*5e3723c6SSatish 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))
30515308354SBarry Smith 
3060d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
307*5e3723c6SSatish Balay  ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3080d4b0b6cSBarry Smith 
3090d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
310*5e3723c6SSatish Balay  ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3110d4b0b6cSBarry Smith 
3120d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
313*5e3723c6SSatish Balay  ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests))
3140d4b0b6cSBarry Smith 
315ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
316*5e3723c6SSatish 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))
31715308354SBarry Smith 
31877a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
319*5e3723c6SSatish 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))
32077a39924SBarry Smith 
32177a39924SBarry Smith #define MPI_Wait(request,status) \
322*5e3723c6SSatish Balay  ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status))
32377a39924SBarry Smith 
32477a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
325*5e3723c6SSatish Balay  ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d))
32677a39924SBarry Smith 
32777a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
328*5e3723c6SSatish 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))
32977a39924SBarry Smith 
33077a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
331*5e3723c6SSatish Balay  ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm))
3323914022bSBarry Smith 
3330d4b0b6cSBarry Smith #else
3340d4b0b6cSBarry Smith 
3350d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
336*5e3723c6SSatish Balay  (MPI_Startall(number,requests))
3370d4b0b6cSBarry Smith 
3380d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
339*5e3723c6SSatish Balay  (MPI_Startall(number,requests))
3400d4b0b6cSBarry Smith 
3410d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
342*5e3723c6SSatish Balay  (MPI_Start(requests))
3430d4b0b6cSBarry Smith 
344f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
345614700edSBarry Smith 
346df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
347614700edSBarry Smith 
348b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
349614700edSBarry Smith 
350df8cf0b5SBarry Smith /*
351df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
352df8cf0b5SBarry Smith */
353b0a32e0cSBarry Smith #define PetscLogMPEBegin()         0
354b0a32e0cSBarry Smith #define PetscLogMPEDump(a)         0
355614700edSBarry Smith 
356b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
357b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
358614700edSBarry Smith 
359b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
360b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
36177c4ece6SBarry Smith 
362b0a32e0cSBarry Smith #define _PetscLogPLB                        0
363b0a32e0cSBarry Smith #define _PetscLogPLE                        0
364b0a32e0cSBarry Smith #define _PetscLogPHC                        0
365b0a32e0cSBarry Smith #define _PetscLogPHD                        0
36699de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
367b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
368b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
369b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
370b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
371b0a32e0cSBarry Smith #define PetscLogObjectParent(p,c)
372b0a32e0cSBarry Smith #define PetscLogObjectParents(p,n,c)
373b0a32e0cSBarry Smith #define PetscLogObjectCreate(h)
374b0a32e0cSBarry Smith #define PetscLogObjectDestroy(h)
375b0a32e0cSBarry Smith #define PetscLogObjectMemory(p,m)
376b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
377b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
378b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
379b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
380b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
381b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
382b0a32e0cSBarry Smith #define PetscLogBegin()                     0
383b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
384b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
385b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
386b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
387043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
38873fda44aSBarry Smith #define PetscLogObjects(a)                  0
38973fda44aSBarry Smith #define PetscLogActions(a)                  0
390dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
391ce6058e1SBarry Smith 
392aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
393ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
394ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
395ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
396ca161407SBarry Smith 
397f141ce34SMatthew Knepley /* Creation and destruction functions */
398f141ce34SMatthew Knepley #define StageLogCreate(stageLog)                     0
399f141ce34SMatthew Knepley #define StageLogDestroy(stageLog)                    0
400f141ce34SMatthew Knepley /* Registration functions */
401f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage)      0
402f141ce34SMatthew Knepley /* Runtime functions */
403f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog)                0
404f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage)                0
405f141ce34SMatthew Knepley #define StageLogPop(stageLog)                        0
406f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage)          0
407f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active)   0
408f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active)   0
409f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0
410f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0
411f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage)      0
412f141ce34SMatthew Knepley 
413aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4146daaf66cSBarry Smith 
415435da068SBarry Smith extern PetscTruth PetscPreLoadingUsed;       /* true if we are or have done preloading */
416435da068SBarry Smith extern PetscTruth PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
4171d1367b7SBarry Smith 
418043328b6SSatish Balay #define PreLoadBegin(flag,name) \
419043328b6SSatish Balay {\
420c4411e17SBarry Smith   PetscTruth PreLoading = flag;\
4218e58c17dSMatthew Knepley   int        PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\
4226e491fe6SBarry Smith   _3_ierr = PetscOptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
423043328b6SSatish Balay   PreLoadMax = (int)(PreLoading);\
424043328b6SSatish Balay   PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
425e7592fafSBarry Smith   for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
426435da068SBarry Smith     PetscPreLoadingOn = PreLoading;\
4276e491fe6SBarry Smith     _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
4288e58c17dSMatthew Knepley     if (PreLoadIt>0) {\
4298e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4308e58c17dSMatthew Knepley     } else {\
4318e58c17dSMatthew Knepley       _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4328e58c17dSMatthew Knepley     }\
433773a6509SMatthew Knepley     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4348e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
4358e58c17dSMatthew Knepley 
436043328b6SSatish Balay #define PreLoadEnd() \
437043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
438043328b6SSatish Balay     PreLoading = PETSC_FALSE;\
439043328b6SSatish Balay   }\
440043328b6SSatish Balay }
4418e58c17dSMatthew Knepley 
442043328b6SSatish Balay #define PreLoadStage(name) \
443043328b6SSatish Balay   _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
4448e58c17dSMatthew Knepley   if (PreLoadIt>0) {\
4458e58c17dSMatthew Knepley     _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4468e58c17dSMatthew Knepley   } else {\
4478e58c17dSMatthew Knepley     _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4488e58c17dSMatthew Knepley   }\
449773a6509SMatthew Knepley   _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4508e58c17dSMatthew Knepley   _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
451e9fa29b7SSatish Balay 
452e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
45397bb86f7SLois Curfman McInnes #endif
454