xref: /petsc/include/petsclog.h (revision 52e6d16ba989af9362d0fcebb12e73dd7c9666ed)
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) \
58*52e6d16bSBarry Smith   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ?
59*52e6d16bSBarry Smith    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,(char*)"") : 0)
60043328b6SSatish Balay 
61043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \
62*52e6d16bSBarry Smith   ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ?
63*52e6d16bSBarry Smith    MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,(char*)"") : 0)
64043328b6SSatish Balay 
65614700edSBarry Smith #else
66*52e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0
67*52e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e)   0
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) \
76*52e6d16bSBarry Smith   ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0)
77*52e6d16bSBarry Smith 
78043328b6SSatish Balay #define PetscLogObjectParents(p,n,d) {int _i; for (_i=0; _i<n; _i++) PetscLogObjectParent(p,(d)[_i]);}
79d38fa0fbSBarry Smith #define PetscLogObjectCreate(h)      ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0)
80d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h)     ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0)
81*52e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)    (((PetscObject)(p))->mem += (m),0)
828ba1e511SMatthew Knepley /* Initialization functions */
83dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogBegin(void);
84dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogAllBegin(void);
85dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
86dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogActions(PetscTruth);
87dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjects(PetscTruth);
888ba1e511SMatthew Knepley /* General functions */
89dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogGetRGBColor(const char*[]);
90dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogDestroy(void);
916849ba73SBarry Smith EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
926849ba73SBarry Smith                    PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
93dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
948ba1e511SMatthew Knepley /* Output functions */
95dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogPrintSummary(MPI_Comm, const char[]);
96dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogDump(const char[]);
978ba1e511SMatthew Knepley /* Counter functions */
98dfbe8321SBarry Smith EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
998ba1e511SMatthew Knepley /* Stage functions */
100dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageRegister(int*, const char[]);
101dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStagePush(int);
102dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStagePop(void);
103dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageSetActive(int, PetscTruth);
104dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetActive(int, PetscTruth *);
105dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageSetVisible(int, PetscTruth);
106dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetVisible(int, PetscTruth *);
107dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogStageGetId(const char [], int *);
1088ba1e511SMatthew Knepley /* Event functions */
1096849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventRegister(PetscEvent*, const char[], PetscCookie);
1106849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventActivate(PetscEvent);
1116849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventDeactivate(PetscEvent);
1126849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscEvent, PetscTruth);
1136849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventActivateClass(PetscCookie);
1146849ba73SBarry Smith EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscCookie);
1158ba1e511SMatthew Knepley /* Class functions */
1166849ba73SBarry Smith EXTERN PetscErrorCode PetscLogClassRegister(PetscCookie*, const char []);
1178ba1e511SMatthew Knepley 
1188ba1e511SMatthew Knepley /* Global counters */
1198ba1e511SMatthew Knepley extern PetscLogDouble irecv_ct,  isend_ct,  recv_ct,  send_ct;
1208ba1e511SMatthew Knepley extern PetscLogDouble irecv_len, isend_len, recv_len, send_len;
1218ba1e511SMatthew Knepley extern PetscLogDouble allreduce_ct;
1228ba1e511SMatthew Knepley extern PetscLogDouble wait_ct, wait_any_ct, wait_all_ct, sum_of_waits_ct;
1235e3723c6SSatish Balay extern int            PETSC_DUMMY_SIZE, PETSC_DUMMY_COUNT;
1248ba1e511SMatthew Knepley 
1258ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event
1268ba1e511SMatthew Knepley    activation flags in the PetscLogEventBegin/End() macros. If we forced a
1278ba1e511SMatthew Knepley    function call each time, we could leave these structures in plog.h
1288ba1e511SMatthew Knepley */
129e855f6f8SMatthew Knepley /* Default log */
130e855f6f8SMatthew Knepley typedef struct _StageLog *StageLog;
131e855f6f8SMatthew Knepley extern StageLog _stageLog;
132e855f6f8SMatthew Knepley 
133e855f6f8SMatthew Knepley /* A simple stack (should replace) */
134e855f6f8SMatthew Knepley typedef struct _IntStack *IntStack;
135e855f6f8SMatthew Knepley 
136e855f6f8SMatthew Knepley /* The structures for logging performance */
137af80a1fbSMatthew Knepley typedef struct _EventPerfInfo {
138e855f6f8SMatthew Knepley   int            id;            /* The integer identifying this section */
139800883a5SMatthew Knepley   PetscTruth     active;        /* The flag to activate logging */
140800883a5SMatthew Knepley   PetscTruth     visible;       /* The flag to print info in summary */
1418ba1e511SMatthew Knepley   int            depth;         /* The nesting depth of the event call */
1428ba1e511SMatthew Knepley   int            count;         /* The number of times this section was executed */
1438ba1e511SMatthew Knepley   PetscLogDouble flops;         /* The flops used in this section */
1448ba1e511SMatthew Knepley   PetscLogDouble time;          /* The time taken for this section */
1458ba1e511SMatthew Knepley   PetscLogDouble numMessages;   /* The number of messages in this section */
1468ba1e511SMatthew Knepley   PetscLogDouble messageLength; /* The total message lengths in this section */
1478ba1e511SMatthew Knepley   PetscLogDouble numReductions; /* The number of reductions in this section */
148af80a1fbSMatthew Knepley } EventPerfInfo;
1498ba1e511SMatthew Knepley 
150e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo {
151e855f6f8SMatthew Knepley   int            id;           /* The integer identifying this class */
1528ba1e511SMatthew Knepley   int            creations;    /* The number of objects of this class created */
1538ba1e511SMatthew Knepley   int            destructions; /* The number of objects of this class destroyed */
1548ba1e511SMatthew Knepley   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1558ba1e511SMatthew Knepley   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
156e855f6f8SMatthew Knepley } ClassPerfInfo;
1578ba1e511SMatthew Knepley 
158e855f6f8SMatthew Knepley /* The structures for logging registration */
159e855f6f8SMatthew Knepley typedef struct _ClassRegInfo {
160e855f6f8SMatthew Knepley   char            *name;   /* The class name */
1616849ba73SBarry Smith   PetscCookie cookie; /* The integer identifying this class */
162e855f6f8SMatthew Knepley } ClassRegInfo;
163e855f6f8SMatthew Knepley 
164e855f6f8SMatthew Knepley typedef struct _EventRegInfo {
165e855f6f8SMatthew Knepley   char            *name;   /* The name of this event */
1666849ba73SBarry Smith   PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */
16744451550SSatish Balay #if defined (PETSC_HAVE_MPE)
16844451550SSatish Balay   int             mpe_id_begin; /* MPE IDs that define the event */
16944451550SSatish Balay   int             mpe_id_end;
17044451550SSatish Balay #endif
171e855f6f8SMatthew Knepley } EventRegInfo;
172e855f6f8SMatthew Knepley 
173e855f6f8SMatthew Knepley typedef struct _EventRegLog *EventRegLog;
174e855f6f8SMatthew Knepley struct _EventRegLog {
175e855f6f8SMatthew Knepley   int           numEvents; /* The number of registered events */
176e855f6f8SMatthew Knepley   int           maxEvents; /* The maximum number of events */
177e855f6f8SMatthew Knepley   EventRegInfo *eventInfo; /* The registration information for each event */
1788ba1e511SMatthew Knepley };
1798ba1e511SMatthew Knepley 
180e855f6f8SMatthew Knepley typedef struct _EventPerfLog *EventPerfLog;
181e855f6f8SMatthew Knepley struct _EventPerfLog {
182e855f6f8SMatthew Knepley   int            numEvents; /* The number of logging events */
183e855f6f8SMatthew Knepley   int            maxEvents; /* The maximum number of events */
184af80a1fbSMatthew Knepley   EventPerfInfo *eventInfo; /* The performance information for each event */
185e855f6f8SMatthew Knepley };
1868ba1e511SMatthew Knepley 
187e855f6f8SMatthew Knepley /* The structure for logging class information */
188e855f6f8SMatthew Knepley typedef struct _ClassRegLog *ClassRegLog;
189e855f6f8SMatthew Knepley struct _ClassRegLog {
190e855f6f8SMatthew Knepley   int           numClasses; /* The number of classes registered */
191e855f6f8SMatthew Knepley   int           maxClasses; /* The maximum number of classes */
192e855f6f8SMatthew Knepley   ClassRegInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
193e855f6f8SMatthew Knepley };
194e855f6f8SMatthew Knepley 
195e855f6f8SMatthew Knepley typedef struct _ClassPerfLog *ClassPerfLog;
196e855f6f8SMatthew Knepley struct _ClassPerfLog {
197e855f6f8SMatthew Knepley   int            numClasses; /* The number of logging classes */
198e855f6f8SMatthew Knepley   int            maxClasses; /* The maximum number of classes */
199e855f6f8SMatthew Knepley   ClassPerfInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
200e855f6f8SMatthew Knepley };
201e855f6f8SMatthew Knepley 
202e855f6f8SMatthew Knepley /* The structures for logging in stages */
203e855f6f8SMatthew Knepley typedef struct _StageInfo {
204e855f6f8SMatthew Knepley   char         *name;     /* The stage name */
205773a6509SMatthew Knepley   PetscTruth    used;     /* The stage was pushed on this processor */
206af80a1fbSMatthew Knepley   EventPerfInfo perfInfo; /* The stage performance information */
207e855f6f8SMatthew Knepley   EventPerfLog  eventLog; /* The event information for this stage */
208e855f6f8SMatthew Knepley   ClassPerfLog  classLog; /* The class information for this stage */
209e855f6f8SMatthew Knepley } StageInfo;
210e855f6f8SMatthew Knepley 
2118ba1e511SMatthew Knepley struct _StageLog {
2128ba1e511SMatthew Knepley   /* Size information */
2138ba1e511SMatthew Knepley   int         numStages; /* The number of registered stages */
2148ba1e511SMatthew Knepley   int         maxStages; /* The maximum number of stages */
2158ba1e511SMatthew Knepley   /* Runtime information */
2168ba1e511SMatthew Knepley   IntStack    stack;     /* The stack for active stages */
2178ba1e511SMatthew Knepley   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
2188ba1e511SMatthew Knepley   /* Stage specific information */
219e855f6f8SMatthew Knepley   StageInfo  *stageInfo; /* The information for each stage */
220e855f6f8SMatthew Knepley   EventRegLog eventLog;  /* The registered events */
221e855f6f8SMatthew Knepley   ClassRegLog classLog;  /* The registered classes */
2228ba1e511SMatthew Knepley };
2238ba1e511SMatthew Knepley 
224*52e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
225*52e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active &&  _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
226*52e6d16bSBarry Smith     (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \
227*52e6d16bSBarry Smith    PetscLogEventBegin((e)+1,o1,o2,o3,o4))
22877c4ece6SBarry Smith 
229*52e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
230*52e6d16bSBarry Smith   (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
231*52e6d16bSBarry Smith     (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
232*52e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_BEGIN(e))
233043328b6SSatish Balay 
234b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
235043328b6SSatish Balay 
236*52e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
237*52e6d16bSBarry Smith   (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \
238*52e6d16bSBarry Smith     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \
239*52e6d16bSBarry Smith   PETSC_LOG_EVENT_MPE_END(e))
24077c4ece6SBarry Smith 
241f141ce34SMatthew Knepley /* Creation and destruction functions */
242dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogCreate(StageLog *);
243dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogDestroy(StageLog);
244f141ce34SMatthew Knepley /* Registration functions */
245dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogRegister(StageLog, const char [], int *);
246f141ce34SMatthew Knepley /* Runtime functions */
247dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogGetStageLog(StageLog *);
248dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogPush(StageLog, int);
249dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogPop(StageLog);
250dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetCurrent(StageLog, int *);
251dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogSetActive(StageLog, int, PetscTruth);
252dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetActive(StageLog, int, PetscTruth *);
253dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogSetVisible(StageLog, int, PetscTruth);
254dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetVisible(StageLog, int, PetscTruth *);
255dfbe8321SBarry Smith EXTERN PetscErrorCode StageLogGetStage(StageLog, const char [], int *);
256aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetClassRegLog(StageLog, ClassRegLog *);
257aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetEventRegLog(StageLog, EventRegLog *);
258aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *);
259aa17faf3SMatthew Knepley EXTERN PetscErrorCode StageLogGetEventPerfLog(StageLog, int, EventPerfLog *);
260f141ce34SMatthew Knepley 
261ce85283eSBarry Smith /*
2623c94ec11SBarry Smith      This does not work for MPI-Uni because our include/mpiuni/mpi.h file
263ce85283eSBarry Smith    uses macros to defined the MPI operations.
26415308354SBarry Smith 
26515308354SBarry Smith      It does not work correctly from HP-UX because it processes the
266bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
267b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
2687c1e34a4SSatish Balay 
269f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
270ce85283eSBarry Smith */
271f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
27277a39924SBarry Smith /*
27377a39924SBarry Smith    Logging of MPI activities
27477a39924SBarry Smith */
27577a39924SBarry Smith #define TypeSize(buff,count,type) \
2765e3723c6SSatish Balay  (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0))
27777a39924SBarry Smith 
27877a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
2795e3723c6SSatish 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))
28015308354SBarry Smith 
28177a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
2825e3723c6SSatish 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))
28315308354SBarry Smith 
2840d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
2855e3723c6SSatish Balay  ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
2860d4b0b6cSBarry Smith 
2870d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
2885e3723c6SSatish Balay  ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
2890d4b0b6cSBarry Smith 
2900d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
2915e3723c6SSatish Balay  ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests))
2920d4b0b6cSBarry Smith 
293ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
2945e3723c6SSatish 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))
29515308354SBarry Smith 
29677a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
2975e3723c6SSatish 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))
29877a39924SBarry Smith 
29977a39924SBarry Smith #define MPI_Wait(request,status) \
3005e3723c6SSatish Balay  ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status))
30177a39924SBarry Smith 
30277a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
3035e3723c6SSatish Balay  ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d))
30477a39924SBarry Smith 
30577a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
3065e3723c6SSatish 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))
30777a39924SBarry Smith 
30877a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
3095e3723c6SSatish Balay  ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm))
3103914022bSBarry Smith 
3110d4b0b6cSBarry Smith #else
3120d4b0b6cSBarry Smith 
3130d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
3145e3723c6SSatish Balay  (MPI_Startall(number,requests))
3150d4b0b6cSBarry Smith 
3160d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
3175e3723c6SSatish Balay  (MPI_Startall(number,requests))
3180d4b0b6cSBarry Smith 
3190d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
3205e3723c6SSatish Balay  (MPI_Start(requests))
3210d4b0b6cSBarry Smith 
322f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
323614700edSBarry Smith 
324df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
325614700edSBarry Smith 
326b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
327614700edSBarry Smith 
328df8cf0b5SBarry Smith /*
329df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
330df8cf0b5SBarry Smith */
331b0a32e0cSBarry Smith #define PetscLogMPEBegin()         0
332b0a32e0cSBarry Smith #define PetscLogMPEDump(a)         0
333614700edSBarry Smith 
334b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
335b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
336614700edSBarry Smith 
337b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
338b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
33977c4ece6SBarry Smith 
340b0a32e0cSBarry Smith #define _PetscLogPLB                        0
341b0a32e0cSBarry Smith #define _PetscLogPLE                        0
342b0a32e0cSBarry Smith #define _PetscLogPHC                        0
343b0a32e0cSBarry Smith #define _PetscLogPHD                        0
34499de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
345b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
346b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
347b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
348b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
349*52e6d16bSBarry Smith #define PetscLogObjectParent(p,c)           0
350b0a32e0cSBarry Smith #define PetscLogObjectParents(p,n,c)
351*52e6d16bSBarry Smith #define PetscLogObjectCreate(h)             0
352*52e6d16bSBarry Smith #define PetscLogObjectDestroy(h)            0
353*52e6d16bSBarry Smith #define PetscLogObjectMemory(p,m)           0
354b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
355b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
356b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
357b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
358b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
359b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
360b0a32e0cSBarry Smith #define PetscLogBegin()                     0
361b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
362b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
363b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
364b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
365043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
36673fda44aSBarry Smith #define PetscLogObjects(a)                  0
36773fda44aSBarry Smith #define PetscLogActions(a)                  0
368dfbe8321SBarry Smith EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
369ce6058e1SBarry Smith 
370aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
371ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
372ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
373ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
374ca161407SBarry Smith 
375f141ce34SMatthew Knepley /* Creation and destruction functions */
376f141ce34SMatthew Knepley #define StageLogCreate(stageLog)                     0
377f141ce34SMatthew Knepley #define StageLogDestroy(stageLog)                    0
378f141ce34SMatthew Knepley /* Registration functions */
379f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage)      0
380f141ce34SMatthew Knepley /* Runtime functions */
381f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog)                0
382f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage)                0
383f141ce34SMatthew Knepley #define StageLogPop(stageLog)                        0
384f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage)          0
385f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active)   0
386f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active)   0
387f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0
388f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0
389f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage)      0
390f141ce34SMatthew Knepley 
391aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
3926daaf66cSBarry Smith 
393435da068SBarry Smith extern PetscTruth PetscPreLoadingUsed;       /* true if we are or have done preloading */
394435da068SBarry Smith extern PetscTruth PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
3951d1367b7SBarry Smith 
396043328b6SSatish Balay #define PreLoadBegin(flag,name) \
397043328b6SSatish Balay {\
398c4411e17SBarry Smith   PetscTruth PreLoading = flag;\
3998e58c17dSMatthew Knepley   int        PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\
4006e491fe6SBarry Smith   _3_ierr = PetscOptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
401043328b6SSatish Balay   PreLoadMax = (int)(PreLoading);\
402043328b6SSatish Balay   PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
403e7592fafSBarry Smith   for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
404435da068SBarry Smith     PetscPreLoadingOn = PreLoading;\
4056e491fe6SBarry Smith     _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
4068e58c17dSMatthew Knepley     if (PreLoadIt>0) {\
4078e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4088e58c17dSMatthew Knepley     } else {\
4098e58c17dSMatthew Knepley       _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4108e58c17dSMatthew Knepley     }\
411773a6509SMatthew Knepley     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4128e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
4138e58c17dSMatthew Knepley 
414043328b6SSatish Balay #define PreLoadEnd() \
415043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
416043328b6SSatish Balay     PreLoading = PETSC_FALSE;\
417043328b6SSatish Balay   }\
418043328b6SSatish Balay }
4198e58c17dSMatthew Knepley 
420043328b6SSatish Balay #define PreLoadStage(name) \
421043328b6SSatish Balay   _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
4228e58c17dSMatthew Knepley   if (PreLoadIt>0) {\
4238e58c17dSMatthew Knepley     _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4248e58c17dSMatthew Knepley   } else {\
4258e58c17dSMatthew Knepley     _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4268e58c17dSMatthew Knepley   }\
427773a6509SMatthew Knepley   _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4288e58c17dSMatthew Knepley   _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
429e9fa29b7SSatish Balay 
430e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END
43197bb86f7SLois Curfman McInnes #endif
432