xref: /petsc/include/petsclog.h (revision e855f6f83774f76d0855e1ebd8d8fce216f01786)
173f4d377SMatthew Knepley /* $Id: petsclog.h,v 1.155 2001/09/06 14:51:20 bsmith Exp $ */
297bb86f7SLois Curfman McInnes 
397bb86f7SLois Curfman McInnes /*
47588ac45SBarry Smith     Defines profile/logging in PETSc.
597bb86f7SLois Curfman McInnes */
697bb86f7SLois Curfman McInnes 
7b0a32e0cSBarry Smith #if !defined(__PetscLog_H)
8b0a32e0cSBarry Smith #define __PetscLog_H
997bb86f7SLois Curfman McInnes #include "petsc.h"
1097bb86f7SLois Curfman McInnes 
1197bb86f7SLois Curfman McInnes /*
128ba1e511SMatthew Knepley   Each PETSc object class has it's own cookie (internal integer in the
138ba1e511SMatthew Knepley   data structure used for error checking). These are all defined by an offset
148ba1e511SMatthew Knepley   from the lowest one, PETSC_COOKIE.
1597bb86f7SLois Curfman McInnes */
168ba1e511SMatthew Knepley #define PETSC_COOKIE 1211211
178ba1e511SMatthew Knepley extern int PETSC_LARGEST_COOKIE;
188ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
198ba1e511SMatthew Knepley extern int PETSC_LARGEST_EVENT;
2097bb86f7SLois Curfman McInnes 
218ba1e511SMatthew Knepley /* Events for the Petsc standard library */
22d5ba7fb7SMatthew Knepley extern int PETSC_Barrier;
2397bb86f7SLois Curfman McInnes 
2419b02663SBarry Smith /* Global flop counter */
25b0a32e0cSBarry Smith extern PetscLogDouble _TotalFlops;
2619b02663SBarry Smith 
27edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */
28f80b7eb0SBarry Smith EXTERN int        PetscLogInfo(void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
29b0a32e0cSBarry Smith EXTERN int        PetscLogInfoDeactivateClass(int);
30b0a32e0cSBarry Smith EXTERN int        PetscLogInfoActivateClass(int);
31b0a32e0cSBarry Smith extern PetscTruth PetscLogPrintInfo;  /* if true, indicates PetscLogInfo() is turned on */
32614700edSBarry Smith 
33aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
34614700edSBarry Smith 
35da63de55SLois Curfman McInnes /*
36da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
37da63de55SLois Curfman McInnes 
38da63de55SLois Curfman McInnes    For the complex numbers version, note that
39da63de55SLois Curfman McInnes        1 complex addition = 2 flops
40da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
41da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
42da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
43da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
44da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
45da63de55SLois Curfman McInnes    among the various arithmetic operations.
46da63de55SLois Curfman McInnes  */
47da63de55SLois Curfman McInnes 
48aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
49b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (4*n),0)
50da63de55SLois Curfman McInnes #else
51b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (n),0)
52da63de55SLois Curfman McInnes #endif
5377c4ece6SBarry Smith 
54aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
5577c4ece6SBarry Smith #include "mpe.h"
56614700edSBarry Smith #define MPEBEGIN    1000
57b0a32e0cSBarry Smith EXTERN int        PetscLogMPEBegin(void);
58b0a32e0cSBarry Smith EXTERN int        PetscLogMPEDump(const char[]);
5935d8aa7fSBarry Smith extern PetscTruth UseMPE;
60b0a32e0cSBarry Smith extern int        PetscLogEventMPEFlags[];
61b0a32e0cSBarry Smith EXTERN int        PetscLogEventMPEActivate(int);
62b0a32e0cSBarry Smith EXTERN int        PetscLogEventMPEDeactivate(int);
63614700edSBarry Smith #else
64b0a32e0cSBarry Smith #define PetscLogEventMPEActivate(a) 0
65b0a32e0cSBarry Smith #define PetscLogEventMPEDeactivate(a) 0
6677c4ece6SBarry Smith #endif
6777c4ece6SBarry Smith 
68b0a32e0cSBarry Smith EXTERN int (*_PetscLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject);
69b0a32e0cSBarry Smith EXTERN int (*_PetscLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject);
70b0a32e0cSBarry Smith EXTERN int (*_PetscLogPHC)(PetscObject);
71b0a32e0cSBarry Smith EXTERN int (*_PetscLogPHD)(PetscObject);
7277c4ece6SBarry Smith 
738ba1e511SMatthew Knepley #define PetscLogObjectParent(p,c)       if (c) {PetscValidHeader((PetscObject)(c)); \
748ba1e511SMatthew Knepley                                                 PetscValidHeader((PetscObject)(p));\
758ba1e511SMatthew Knepley                                                 ((PetscObject)(c))->parent = (PetscObject)(p);\
768ba1e511SMatthew Knepley 				                ((PetscObject)(c))->parentid = ((PetscObject)p)->id;}
778ba1e511SMatthew Knepley #define PetscLogObjectParents(p,n,d)    {int _i; for (_i=0; _i<n; _i++) \
788ba1e511SMatthew Knepley                                          PetscLogObjectParent(p,(d)[_i]);}
798ba1e511SMatthew Knepley #define PetscLogObjectCreate(h)         {if (_PetscLogPHC) (*_PetscLogPHC)((PetscObject)h);}
808ba1e511SMatthew Knepley #define PetscLogObjectDestroy(h)        {if (_PetscLogPHD) (*_PetscLogPHD)((PetscObject)h);}
818ba1e511SMatthew Knepley #define PetscLogObjectMemory(p,m)       {PetscValidHeader((PetscObject)p);\
828ba1e511SMatthew Knepley                                          ((PetscObject)(p))->mem += (m);}
838ba1e511SMatthew Knepley /* Initialization functions */
848ba1e511SMatthew Knepley EXTERN int PetscLogBegin(void);
858ba1e511SMatthew Knepley EXTERN int PetscLogAllBegin(void);
868ba1e511SMatthew Knepley EXTERN int PetscLogTraceBegin(FILE *);
878ba1e511SMatthew Knepley /* General functions */
888ba1e511SMatthew Knepley EXTERN int PetscLogDestroy(void);
898ba1e511SMatthew Knepley EXTERN int PetscLogSet(int (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
908ba1e511SMatthew Knepley                    int (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
91f80b7eb0SBarry Smith EXTERN int PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
928ba1e511SMatthew Knepley /* Output functions */
938ba1e511SMatthew Knepley EXTERN int PetscLogPrintSummary(MPI_Comm, const char[]);
948ba1e511SMatthew Knepley EXTERN int PetscLogDump(const char[]);
958ba1e511SMatthew Knepley /* Counter functions */
968ba1e511SMatthew Knepley EXTERN int PetscGetFlops(PetscLogDouble *);
978ba1e511SMatthew Knepley /* Stage functions */
988ba1e511SMatthew Knepley EXTERN int PetscLogStageRegister(int *, const char[]);
998ba1e511SMatthew Knepley EXTERN int PetscLogStagePush(int);
1008ba1e511SMatthew Knepley EXTERN int PetscLogStagePop(void);
1018ba1e511SMatthew Knepley EXTERN int PetscLogStageSetVisible(int, PetscTruth);
1028ba1e511SMatthew Knepley EXTERN int PetscLogStageGetVisible(int, PetscTruth *);
1038e58c17dSMatthew Knepley EXTERN int PetscLogStageGetId(const char [], int *);
1048ba1e511SMatthew Knepley /* Event functions */
1058ba1e511SMatthew Knepley EXTERN int PetscLogEventRegister(int *, const char[], const char[], int);
1068ba1e511SMatthew Knepley EXTERN int PetscLogEventActivate(int);
1078ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivate(int);
1088ba1e511SMatthew Knepley EXTERN int PetscLogEventActivateClass(int);
1098ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivateClass(int);
1108ba1e511SMatthew Knepley /* Class functions */
1118ba1e511SMatthew Knepley EXTERN int PetscLogClassRegister(int *, const char []);
1128ba1e511SMatthew Knepley 
1138ba1e511SMatthew Knepley /* Global counters */
1148ba1e511SMatthew Knepley extern PetscLogDouble irecv_ct,  isend_ct,  recv_ct,  send_ct;
1158ba1e511SMatthew Knepley extern PetscLogDouble irecv_len, isend_len, recv_len, send_len;
1168ba1e511SMatthew Knepley extern PetscLogDouble allreduce_ct;
1178ba1e511SMatthew Knepley extern PetscLogDouble wait_ct, wait_any_ct, wait_all_ct, sum_of_waits_ct;
1188ba1e511SMatthew Knepley extern int            PETSC_DUMMY, PETSC_DUMMY_SIZE;
1198ba1e511SMatthew Knepley 
1208ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event
1218ba1e511SMatthew Knepley    activation flags in the PetscLogEventBegin/End() macros. If we forced a
1228ba1e511SMatthew Knepley    function call each time, we could leave these structures in plog.h
1238ba1e511SMatthew Knepley */
124*e855f6f8SMatthew Knepley /* Default log */
125*e855f6f8SMatthew Knepley typedef struct _StageLog *StageLog;
126*e855f6f8SMatthew Knepley extern StageLog _stageLog;
127*e855f6f8SMatthew Knepley 
128*e855f6f8SMatthew Knepley /* A simple stack (should replace) */
129*e855f6f8SMatthew Knepley typedef struct _IntStack *IntStack;
130*e855f6f8SMatthew Knepley 
131*e855f6f8SMatthew Knepley /* The structures for logging performance */
1328ba1e511SMatthew Knepley typedef struct _PerfInfo {
133*e855f6f8SMatthew Knepley   int            id;            /* The integer identifying this section */
134800883a5SMatthew Knepley   PetscTruth     active;        /* The flag to activate logging */
135800883a5SMatthew Knepley   PetscTruth     visible;       /* The flag to print info in summary */
1368ba1e511SMatthew Knepley   int            depth;         /* The nesting depth of the event call */
1378ba1e511SMatthew Knepley   int            count;         /* The number of times this section was executed */
1388ba1e511SMatthew Knepley   PetscLogDouble flops;         /* The flops used in this section */
1398ba1e511SMatthew Knepley   PetscLogDouble time;          /* The time taken for this section */
1408ba1e511SMatthew Knepley   PetscLogDouble numMessages;   /* The number of messages in this section */
1418ba1e511SMatthew Knepley   PetscLogDouble messageLength; /* The total message lengths in this section */
1428ba1e511SMatthew Knepley   PetscLogDouble numReductions; /* The number of reductions in this section */
1438ba1e511SMatthew Knepley } PerfInfo;
1448ba1e511SMatthew Knepley 
145*e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo {
146*e855f6f8SMatthew Knepley   int            id;           /* The integer identifying this class */
1478ba1e511SMatthew Knepley   int            creations;    /* The number of objects of this class created */
1488ba1e511SMatthew Knepley   int            destructions; /* The number of objects of this class destroyed */
1498ba1e511SMatthew Knepley   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1508ba1e511SMatthew Knepley   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
151*e855f6f8SMatthew Knepley } ClassPerfInfo;
1528ba1e511SMatthew Knepley 
153*e855f6f8SMatthew Knepley /* The structures for logging registration */
154*e855f6f8SMatthew Knepley typedef struct _ClassRegInfo {
155*e855f6f8SMatthew Knepley   char *name;   /* The class name */
156*e855f6f8SMatthew Knepley   char *color;  /* The color of this class */
157*e855f6f8SMatthew Knepley   int   cookie; /* The integer identifying this class */
158*e855f6f8SMatthew Knepley } ClassRegInfo;
159*e855f6f8SMatthew Knepley 
160*e855f6f8SMatthew Knepley typedef struct _EventRegInfo {
161*e855f6f8SMatthew Knepley   char *name;   /* The name of this event */
162*e855f6f8SMatthew Knepley   char *color;  /* The color of this event */
163*e855f6f8SMatthew Knepley   int   cookie; /* The class id for this event (should maybe give class ID instead) */
164*e855f6f8SMatthew Knepley } EventRegInfo;
165*e855f6f8SMatthew Knepley 
166*e855f6f8SMatthew Knepley /* The structure for logging events */
167*e855f6f8SMatthew Knepley typedef int PetscEvent;
168*e855f6f8SMatthew Knepley 
169*e855f6f8SMatthew Knepley typedef struct _EventRegLog *EventRegLog;
170*e855f6f8SMatthew Knepley struct _EventRegLog {
171*e855f6f8SMatthew Knepley   int           numEvents; /* The number of registered events */
172*e855f6f8SMatthew Knepley   int           maxEvents; /* The maximum number of events */
173*e855f6f8SMatthew Knepley   EventRegInfo *eventInfo; /* The registration information for each event */
1748ba1e511SMatthew Knepley };
1758ba1e511SMatthew Knepley 
176*e855f6f8SMatthew Knepley typedef struct _EventPerfLog *EventPerfLog;
177*e855f6f8SMatthew Knepley struct _EventPerfLog {
178*e855f6f8SMatthew Knepley   int       numEvents; /* The number of logging events */
179*e855f6f8SMatthew Knepley   int       maxEvents; /* The maximum number of events */
180*e855f6f8SMatthew Knepley   PerfInfo *eventInfo; /* The performance information for each event */
181*e855f6f8SMatthew Knepley };
1828ba1e511SMatthew Knepley 
183*e855f6f8SMatthew Knepley /* The structure for logging class information */
184*e855f6f8SMatthew Knepley typedef struct _ClassRegLog *ClassRegLog;
185*e855f6f8SMatthew Knepley struct _ClassRegLog {
186*e855f6f8SMatthew Knepley   int           numClasses; /* The number of classes registered */
187*e855f6f8SMatthew Knepley   int           maxClasses; /* The maximum number of classes */
188*e855f6f8SMatthew Knepley   ClassRegInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
189*e855f6f8SMatthew Knepley };
190*e855f6f8SMatthew Knepley 
191*e855f6f8SMatthew Knepley typedef struct _ClassPerfLog *ClassPerfLog;
192*e855f6f8SMatthew Knepley struct _ClassPerfLog {
193*e855f6f8SMatthew Knepley   int            numClasses; /* The number of logging classes */
194*e855f6f8SMatthew Knepley   int            maxClasses; /* The maximum number of classes */
195*e855f6f8SMatthew Knepley   ClassPerfInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
196*e855f6f8SMatthew Knepley };
197*e855f6f8SMatthew Knepley 
198*e855f6f8SMatthew Knepley /* The structures for logging in stages */
199*e855f6f8SMatthew Knepley typedef struct _StageInfo {
200*e855f6f8SMatthew Knepley   char        *name;       /* The stage name */
201*e855f6f8SMatthew Knepley   char        *color;      /* The color of this stage */
202*e855f6f8SMatthew Knepley   PerfInfo     perfInfo;   /* The stage performance information */
203*e855f6f8SMatthew Knepley   EventPerfLog eventLog;   /* The event information for this stage */
204*e855f6f8SMatthew Knepley   ClassPerfLog classLog;   /* The class information for this stage */
205*e855f6f8SMatthew Knepley } StageInfo;
206*e855f6f8SMatthew Knepley 
2078ba1e511SMatthew Knepley struct _StageLog {
2088ba1e511SMatthew Knepley   /* Size information */
2098ba1e511SMatthew Knepley   int         numStages; /* The number of registered stages */
2108ba1e511SMatthew Knepley   int         maxStages; /* The maximum number of stages */
2118ba1e511SMatthew Knepley   /* Runtime information */
2128ba1e511SMatthew Knepley   IntStack    stack;     /* The stack for active stages */
2138ba1e511SMatthew Knepley   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
2148ba1e511SMatthew Knepley   /* Stage specific information */
215*e855f6f8SMatthew Knepley   StageInfo  *stageInfo; /* The information for each stage */
216*e855f6f8SMatthew Knepley   EventRegLog eventLog;  /* The registered events */
217*e855f6f8SMatthew Knepley   ClassRegLog classLog;  /* The registered classes */
2188ba1e511SMatthew Knepley };
2198ba1e511SMatthew Knepley 
220aa482453SBarry Smith #if defined(PETSC_HAVE_MPE)
221b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
22253fde1feSMatthew Knepley   0; { int _1_ierr; \
22353fde1feSMatthew Knepley     if (_PetscLogPLB && _stageLog->eventLog[_stageLog->curStage]->eventInfo[e].active) { \
2246e491fe6SBarry Smith       _1_ierr = PetscLogEventBegin((e),o1,o2,o3,o4);CHKERRQ(_1_ierr);  \
225b0a32e0cSBarry Smith       if (UseMPE && PetscLogEventMPEFlags[(e)])                      \
226005c665bSBarry Smith         MPE_Log_event(MPEBEGIN+2*(e),0,"");                      \
2276e491fe6SBarry Smith       _1_ierr = MPI_Barrier(cm);CHKERRQ(_1_ierr);                  \
2286e491fe6SBarry Smith       _1_ierr = PetscLogEventEnd((e),o1,o2,o3,o4);CHKERRQ(_1_ierr);    \
229b0a32e0cSBarry Smith       if (UseMPE && PetscLogEventMPEFlags[(e)])                      \
230005c665bSBarry Smith         MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");                  \
231005c665bSBarry Smith     }                                                            \
2326e491fe6SBarry Smith     _1_ierr = PetscLogEventBegin(e+1,o1,o2,o3,o4);CHKERRQ(_1_ierr);    \
233b0a32e0cSBarry Smith     if (UseMPE && PetscLogEventMPEFlags[(e)+1])                      \
234005c665bSBarry Smith       MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");                    \
235005c665bSBarry Smith   }
236b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)  \
23753fde1feSMatthew Knepley   0; { \
23853fde1feSMatthew Knepley    if (_PetscLogPLB && _stageLog->eventLog[_stageLog->curStage]->eventInfo[e].active) {\
239b0a32e0cSBarry Smith      (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\
240b0a32e0cSBarry Smith    if (UseMPE && PetscLogEventMPEFlags[(e)])\
241005c665bSBarry Smith      MPE_Log_event(MPEBEGIN+2*(e),0,"");\
24277c4ece6SBarry Smith   }
24377c4ece6SBarry Smith #else
244b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
24553fde1feSMatthew Knepley   0; { int _2_ierr;\
246*e855f6f8SMatthew Knepley     if (_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) { \
2476e491fe6SBarry Smith       _2_ierr = PetscLogEventBegin((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);    \
2486e491fe6SBarry Smith       _2_ierr = MPI_Barrier(cm);CHKERRQ(_2_ierr);                    \
2496e491fe6SBarry Smith       _2_ierr = PetscLogEventEnd((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);      \
250005c665bSBarry Smith     }                                                              \
2516e491fe6SBarry Smith     _2_ierr = PetscLogEventBegin((e)+1,o1,o2,o3,o4);CHKERRQ(_2_ierr);    \
252005c665bSBarry Smith   }
253b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)  \
25453fde1feSMatthew Knepley   0; { \
255*e855f6f8SMatthew Knepley    if (_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
256b0a32e0cSBarry Smith      (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\
25777c4ece6SBarry Smith   }
25877c4ece6SBarry Smith #endif
25977c4ece6SBarry Smith 
260aa482453SBarry Smith #if defined(PETSC_HAVE_MPE)
261b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
262b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
26353fde1feSMatthew Knepley   0; { \
26453fde1feSMatthew Knepley   if (_PetscLogPLE && _stageLog->eventLog[_stageLog->curStage]->eventInfo[e].active) {\
265b0a32e0cSBarry Smith     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\
266b0a32e0cSBarry Smith   if (UseMPE && PetscLogEventMPEFlags[(e)])\
267005c665bSBarry Smith      MPE_Log_event(MPEBEGIN+2*(e)+1,0,"");\
268a1b5d808SSatish Balay   }
26977c4ece6SBarry Smith #else
270b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
271b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
27253fde1feSMatthew Knepley   0; { \
273*e855f6f8SMatthew Knepley   if (_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
274b0a32e0cSBarry Smith     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\
275a1b5d808SSatish Balay   }
27677c4ece6SBarry Smith #endif
27777c4ece6SBarry Smith 
278ce85283eSBarry Smith /*
27984cb2905SBarry Smith      This does not work for MPI-Uni because our src/mpiuni/mpi.h file
280ce85283eSBarry Smith    uses macros to defined the MPI operations.
28115308354SBarry Smith 
28215308354SBarry Smith      It does not work correctly from HP-UX because it processes the
283bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
284b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
2857c1e34a4SSatish Balay 
2867c1e34a4SSatish Balay      It does not work with Windows NT because winmpich lacks MPI_Type_size()
287ce85283eSBarry Smith */
288b6410449SSatish Balay #if !defined(PETSC_HAVE_MPI_UNI) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
28977a39924SBarry Smith /*
29077a39924SBarry Smith    Logging of MPI activities
29177a39924SBarry Smith */
29277a39924SBarry Smith 
29377a39924SBarry Smith #define TypeSize(buff,count,type)                                                \
294ca161407SBarry Smith (\
295b0a32e0cSBarry Smith   MPI_Type_size(type,&PETSC_DUMMY_SIZE),buff += ((PetscLogDouble) ((count)*PETSC_DUMMY_SIZE)) \
296ca161407SBarry Smith )
29777a39924SBarry Smith 
29877a39924SBarry Smith #define MPI_Irecv(buf,count, datatype,source,tag,comm,request)        \
299ca161407SBarry Smith (\
300ca161407SBarry Smith   PETSC_DUMMY = MPI_Irecv(buf,count, datatype,source,tag,comm,request),            \
301ca161407SBarry Smith   irecv_ct++,TypeSize(irecv_len,count,datatype),PETSC_DUMMY                            \
302ca161407SBarry Smith )
30315308354SBarry Smith 
30477a39924SBarry Smith #define MPI_Isend(buf,count, datatype,dest,tag,comm,request)          \
305ca161407SBarry Smith (\
306ca161407SBarry Smith   PETSC_DUMMY = MPI_Isend(buf,count, datatype,dest,tag,comm,request),              \
307ca161407SBarry Smith   isend_ct++,  TypeSize(isend_len,count,datatype),PETSC_DUMMY                          \
308ca161407SBarry Smith )
30915308354SBarry Smith 
3100d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests)                                     \
311ca161407SBarry Smith (\
312ca161407SBarry Smith   PETSC_DUMMY = MPI_Startall(number,requests),                                                    \
31387828ca2SBarry Smith   irecv_ct += (PetscLogDouble)(number),irecv_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY \
314ca161407SBarry Smith )
3150d4b0b6cSBarry Smith 
3160d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests)                                    \
317ca161407SBarry Smith (\
318ca161407SBarry Smith   PETSC_DUMMY = MPI_Startall(number,requests),                                                   \
31987828ca2SBarry Smith   isend_ct += (PetscLogDouble)(number),isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY \
320ca161407SBarry Smith )
3210d4b0b6cSBarry Smith 
3220d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests)\
323ca161407SBarry Smith (\
324ca161407SBarry Smith   PETSC_DUMMY = MPI_Start(requests),\
32587828ca2SBarry Smith   isend_ct++,isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\
326ca161407SBarry Smith )
3270d4b0b6cSBarry Smith 
328ce85283eSBarry Smith #define MPI_Recv(buf,count, datatype,source,tag,comm,status)           \
329ca161407SBarry Smith (\
330ca161407SBarry Smith   PETSC_DUMMY = MPI_Recv(buf,count, datatype,source,tag,comm,status),               \
331ca161407SBarry Smith   recv_ct++,TypeSize(recv_len,count,datatype),PETSC_DUMMY                              \
332ca161407SBarry Smith )
33315308354SBarry Smith 
33477a39924SBarry Smith #define MPI_Send(buf,count, datatype,dest,tag,comm)                     \
335ca161407SBarry Smith (\
336ca161407SBarry Smith   PETSC_DUMMY = MPI_Send(buf,count, datatype,dest,tag,comm),                         \
337ca161407SBarry Smith   send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY                              \
338ca161407SBarry Smith )
33977a39924SBarry Smith 
34077a39924SBarry Smith #define MPI_Wait(request,status) \
34177a39924SBarry Smith (\
342e0937024SBarry Smith   wait_ct++,sum_of_waits_ct++,  \
34377a39924SBarry Smith   MPI_Wait(request,status)       \
34477a39924SBarry Smith )
34577a39924SBarry Smith 
34677a39924SBarry Smith #define MPI_Waitany(a,b,c,d)     \
34777a39924SBarry Smith (\
348e0937024SBarry Smith   wait_any_ct++,sum_of_waits_ct++,\
34977a39924SBarry Smith   MPI_Waitany(a,b,c,d)           \
35077a39924SBarry Smith )
35177a39924SBarry Smith 
35277a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
35377a39924SBarry Smith (\
354b0a32e0cSBarry Smith   wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),       \
35577a39924SBarry Smith   MPI_Waitall(count,array_of_requests,array_of_statuses)       \
35677a39924SBarry Smith )
35777a39924SBarry Smith 
35877a39924SBarry Smith #define MPI_Allreduce(sendbuf, recvbuf,count,datatype,op,comm) \
3590743b949SBarry Smith (\
3600743b949SBarry Smith   allreduce_ct++,MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)\
3610743b949SBarry Smith )
3623914022bSBarry Smith 
3630d4b0b6cSBarry Smith #else
3640d4b0b6cSBarry Smith 
3650d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
366ca161407SBarry Smith (\
367ca161407SBarry Smith   MPI_Startall(number,requests)                 \
368ca161407SBarry Smith )
3690d4b0b6cSBarry Smith 
3700d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
371ca161407SBarry Smith (\
372ca161407SBarry Smith   MPI_Startall(number,requests)                 \
373ca161407SBarry Smith )
3740d4b0b6cSBarry Smith 
3750d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \
376ca161407SBarry Smith (\
377ca161407SBarry Smith   MPI_Start(requests)                   \
378ca161407SBarry Smith )
3790d4b0b6cSBarry Smith 
380b6410449SSatish Balay #endif /* !PETSC_HAVE_MPI_UNI && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
381614700edSBarry Smith 
382df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
383614700edSBarry Smith 
384b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
385614700edSBarry Smith 
386df8cf0b5SBarry Smith /*
387df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
388df8cf0b5SBarry Smith */
389614700edSBarry Smith #define MPEBEGIN                  1000
390b0a32e0cSBarry Smith #define PetscLogMPEBegin()            0
391b0a32e0cSBarry Smith #define PetscLogMPEDump(a)            0
392b0a32e0cSBarry Smith #define PetscLogEventMPEActivate(a)   0
393b0a32e0cSBarry Smith #define PetscLogEventMPEDeactivate(a) 0
394614700edSBarry Smith 
395b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
396b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
397614700edSBarry Smith 
398b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
399b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
40077c4ece6SBarry Smith 
401b0a32e0cSBarry Smith #define _PetscLogPLB                        0
402b0a32e0cSBarry Smith #define _PetscLogPLE                        0
403b0a32e0cSBarry Smith #define _PetscLogPHC                        0
404b0a32e0cSBarry Smith #define _PetscLogPHD                        0
40599de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
406b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
407b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
408b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
409b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
410b0a32e0cSBarry Smith #define PetscLogObjectParent(p,c)
411b0a32e0cSBarry Smith #define PetscLogObjectParents(p,n,c)
412b0a32e0cSBarry Smith #define PetscLogObjectCreate(h)
413b0a32e0cSBarry Smith #define PetscLogObjectDestroy(h)
414b0a32e0cSBarry Smith #define PetscLogObjectMemory(p,m)
415b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
416b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
417b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
418b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
419b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
420b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
421b0a32e0cSBarry Smith #define PetscLogBegin()                     0
422b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
423b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
424b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
425b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
4265291dbe9SBarry Smith #define PetscLogEventRegister(a,b,c,d)      0
427f80b7eb0SBarry Smith EXTERN int PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
428ce6058e1SBarry Smith 
429aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
430ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
431ce6058e1SBarry Smith 
432ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
433ce6058e1SBarry Smith 
434ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
435ca161407SBarry Smith 
436aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4376daaf66cSBarry Smith 
438435da068SBarry Smith extern PetscTruth PetscPreLoadingUsed;       /* true if we are or have done preloading */
439435da068SBarry Smith extern PetscTruth PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
4401d1367b7SBarry Smith 
4418e58c17dSMatthew Knepley #define PreLoadBegin(flag,name) {PetscTruth PreLoading = flag; \
4428e58c17dSMatthew Knepley                                  int        PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\
4436e491fe6SBarry Smith                                  _3_ierr = PetscOptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
4441d1367b7SBarry Smith                                  PreLoadMax = (int)(PreLoading);PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
445e7592fafSBarry Smith                                  for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
446435da068SBarry Smith                                    PetscPreLoadingOn = PreLoading;\
4476e491fe6SBarry Smith                                    _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
4488e58c17dSMatthew Knepley                                    if (PreLoadIt>0) {\
4498e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4508e58c17dSMatthew Knepley                                    } else {\
4518e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4528e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageSetVisible(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4538e58c17dSMatthew Knepley                                    }\
4548e58c17dSMatthew Knepley                                    _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
4558e58c17dSMatthew Knepley 
4566e491fe6SBarry Smith #define PreLoadEnd()               _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);PreLoading = PETSC_FALSE;}}
4578e58c17dSMatthew Knepley 
4586e491fe6SBarry Smith #define PreLoadStage(name)         _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
4598e58c17dSMatthew Knepley                                    if (PreLoadIt>0) {\
4608e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4618e58c17dSMatthew Knepley                                    } else {\
4628e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4638e58c17dSMatthew Knepley                                      _3_ierr = PetscLogStageSetVisible(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4648e58c17dSMatthew Knepley                                    }\
4658e58c17dSMatthew Knepley                                    _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
46697bb86f7SLois Curfman McInnes #endif
467