xref: /petsc/include/petsclog.h (revision 773a650995f8edbaaa469116c71e2cd628c844d3)
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"
56b0a32e0cSBarry Smith EXTERN int        PetscLogMPEBegin(void);
57b0a32e0cSBarry Smith EXTERN int        PetscLogMPEDump(const char[]);
5835d8aa7fSBarry Smith extern PetscTruth UseMPE;
59043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \
6074968b1dSMatthew Knepley   if(UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) \
6144451550SSatish Balay     MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,"");
62043328b6SSatish Balay 
63043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \
6474968b1dSMatthew Knepley   if(UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) \
6544451550SSatish Balay     MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,"");
66043328b6SSatish Balay 
67614700edSBarry Smith #else
68043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e)
69043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e)
7077c4ece6SBarry Smith #endif
7177c4ece6SBarry Smith 
72b0a32e0cSBarry Smith EXTERN int (*_PetscLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject);
73b0a32e0cSBarry Smith EXTERN int (*_PetscLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject);
74b0a32e0cSBarry Smith EXTERN int (*_PetscLogPHC)(PetscObject);
75b0a32e0cSBarry Smith EXTERN int (*_PetscLogPHD)(PetscObject);
7677c4ece6SBarry Smith 
77043328b6SSatish Balay #define PetscLogObjectParent(p,c) \
78043328b6SSatish Balay   if (c) {\
79043328b6SSatish Balay     PetscValidHeader((PetscObject)(c));\
808ba1e511SMatthew Knepley     PetscValidHeader((PetscObject)(p));\
818ba1e511SMatthew Knepley     ((PetscObject)(c))->parent = (PetscObject)(p);\
82043328b6SSatish Balay     ((PetscObject)(c))->parentid = ((PetscObject)p)->id;\
83043328b6SSatish Balay   }
84043328b6SSatish Balay #define PetscLogObjectParents(p,n,d) {int _i; for (_i=0; _i<n; _i++) PetscLogObjectParent(p,(d)[_i]);}
858ba1e511SMatthew Knepley #define PetscLogObjectCreate(h)      {if (_PetscLogPHC) (*_PetscLogPHC)((PetscObject)h);}
868ba1e511SMatthew Knepley #define PetscLogObjectDestroy(h)     {if (_PetscLogPHD) (*_PetscLogPHD)((PetscObject)h);}
87043328b6SSatish Balay #define PetscLogObjectMemory(p,m)    {PetscValidHeader((PetscObject)p);((PetscObject)(p))->mem += (m);}
888ba1e511SMatthew Knepley /* Initialization functions */
898ba1e511SMatthew Knepley EXTERN int PetscLogBegin(void);
908ba1e511SMatthew Knepley EXTERN int PetscLogAllBegin(void);
918ba1e511SMatthew Knepley EXTERN int PetscLogTraceBegin(FILE *);
928ba1e511SMatthew Knepley /* General functions */
93043328b6SSatish Balay EXTERN int PetscLogGetRGBColor(char **);
948ba1e511SMatthew Knepley EXTERN int PetscLogDestroy(void);
958ba1e511SMatthew Knepley EXTERN int PetscLogSet(int (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
968ba1e511SMatthew Knepley                    int (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
97f80b7eb0SBarry Smith EXTERN int PetscLogObjectState(PetscObject, const char[], ...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
988ba1e511SMatthew Knepley /* Output functions */
998ba1e511SMatthew Knepley EXTERN int PetscLogPrintSummary(MPI_Comm, const char[]);
1008ba1e511SMatthew Knepley EXTERN int PetscLogDump(const char[]);
1018ba1e511SMatthew Knepley /* Counter functions */
1028ba1e511SMatthew Knepley EXTERN int PetscGetFlops(PetscLogDouble *);
1038ba1e511SMatthew Knepley /* Stage functions */
1048ba1e511SMatthew Knepley EXTERN int PetscLogStageRegister(int *, const char[]);
1058ba1e511SMatthew Knepley EXTERN int PetscLogStagePush(int);
1068ba1e511SMatthew Knepley EXTERN int PetscLogStagePop(void);
107*773a6509SMatthew Knepley EXTERN int PetscLogStageSetActive(int, PetscTruth);
108*773a6509SMatthew Knepley EXTERN int PetscLogStageGetActive(int, PetscTruth *);
1098ba1e511SMatthew Knepley EXTERN int PetscLogStageSetVisible(int, PetscTruth);
1108ba1e511SMatthew Knepley EXTERN int PetscLogStageGetVisible(int, PetscTruth *);
1118e58c17dSMatthew Knepley EXTERN int PetscLogStageGetId(const char [], int *);
1128ba1e511SMatthew Knepley /* Event functions */
113043328b6SSatish Balay EXTERN int PetscLogEventRegister(int *, const char[], int);
1148ba1e511SMatthew Knepley EXTERN int PetscLogEventActivate(int);
1158ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivate(int);
1168ba1e511SMatthew Knepley EXTERN int PetscLogEventActivateClass(int);
1178ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivateClass(int);
1188ba1e511SMatthew Knepley /* Class functions */
1198ba1e511SMatthew Knepley EXTERN int PetscLogClassRegister(int *, const char []);
1208ba1e511SMatthew Knepley 
1218ba1e511SMatthew Knepley /* Global counters */
1228ba1e511SMatthew Knepley extern PetscLogDouble irecv_ct,  isend_ct,  recv_ct,  send_ct;
1238ba1e511SMatthew Knepley extern PetscLogDouble irecv_len, isend_len, recv_len, send_len;
1248ba1e511SMatthew Knepley extern PetscLogDouble allreduce_ct;
1258ba1e511SMatthew Knepley extern PetscLogDouble wait_ct, wait_any_ct, wait_all_ct, sum_of_waits_ct;
1268ba1e511SMatthew Knepley extern int            PETSC_DUMMY, PETSC_DUMMY_SIZE;
1278ba1e511SMatthew Knepley 
1288ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event
1298ba1e511SMatthew Knepley    activation flags in the PetscLogEventBegin/End() macros. If we forced a
1308ba1e511SMatthew Knepley    function call each time, we could leave these structures in plog.h
1318ba1e511SMatthew Knepley */
132e855f6f8SMatthew Knepley /* Default log */
133e855f6f8SMatthew Knepley typedef struct _StageLog *StageLog;
134e855f6f8SMatthew Knepley extern StageLog _stageLog;
135e855f6f8SMatthew Knepley 
136e855f6f8SMatthew Knepley /* A simple stack (should replace) */
137e855f6f8SMatthew Knepley typedef struct _IntStack *IntStack;
138e855f6f8SMatthew Knepley 
139e855f6f8SMatthew Knepley /* The structures for logging performance */
140af80a1fbSMatthew Knepley typedef struct _EventPerfInfo {
141e855f6f8SMatthew Knepley   int            id;            /* The integer identifying this section */
142800883a5SMatthew Knepley   PetscTruth     active;        /* The flag to activate logging */
143800883a5SMatthew Knepley   PetscTruth     visible;       /* The flag to print info in summary */
1448ba1e511SMatthew Knepley   int            depth;         /* The nesting depth of the event call */
1458ba1e511SMatthew Knepley   int            count;         /* The number of times this section was executed */
1468ba1e511SMatthew Knepley   PetscLogDouble flops;         /* The flops used in this section */
1478ba1e511SMatthew Knepley   PetscLogDouble time;          /* The time taken for this section */
1488ba1e511SMatthew Knepley   PetscLogDouble numMessages;   /* The number of messages in this section */
1498ba1e511SMatthew Knepley   PetscLogDouble messageLength; /* The total message lengths in this section */
1508ba1e511SMatthew Knepley   PetscLogDouble numReductions; /* The number of reductions in this section */
151af80a1fbSMatthew Knepley } EventPerfInfo;
1528ba1e511SMatthew Knepley 
153e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo {
154e855f6f8SMatthew Knepley   int            id;           /* The integer identifying this class */
1558ba1e511SMatthew Knepley   int            creations;    /* The number of objects of this class created */
1568ba1e511SMatthew Knepley   int            destructions; /* The number of objects of this class destroyed */
1578ba1e511SMatthew Knepley   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1588ba1e511SMatthew Knepley   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
159e855f6f8SMatthew Knepley } ClassPerfInfo;
1608ba1e511SMatthew Knepley 
161e855f6f8SMatthew Knepley /* The structures for logging registration */
162e855f6f8SMatthew Knepley typedef struct _ClassRegInfo {
163e855f6f8SMatthew Knepley   char *name;   /* The class name */
164e855f6f8SMatthew Knepley   int   cookie; /* The integer identifying this class */
165e855f6f8SMatthew Knepley } ClassRegInfo;
166e855f6f8SMatthew Knepley 
167e855f6f8SMatthew Knepley typedef struct _EventRegInfo {
168e855f6f8SMatthew Knepley   char *name;   /* The name of this event */
169e855f6f8SMatthew Knepley   int   cookie; /* The class id for this event (should maybe give class ID instead) */
17044451550SSatish Balay #if defined (PETSC_HAVE_MPE)
17144451550SSatish Balay   int   mpe_id_begin; /* MPE IDs that define the event */
17244451550SSatish Balay   int   mpe_id_end;
17344451550SSatish Balay #endif
174e855f6f8SMatthew Knepley } EventRegInfo;
175e855f6f8SMatthew Knepley 
176e855f6f8SMatthew Knepley /* The structure for logging events */
177e855f6f8SMatthew Knepley typedef int PetscEvent;
178e855f6f8SMatthew Knepley 
179e855f6f8SMatthew Knepley typedef struct _EventRegLog *EventRegLog;
180e855f6f8SMatthew Knepley struct _EventRegLog {
181e855f6f8SMatthew Knepley   int           numEvents; /* The number of registered events */
182e855f6f8SMatthew Knepley   int           maxEvents; /* The maximum number of events */
183e855f6f8SMatthew Knepley   EventRegInfo *eventInfo; /* The registration information for each event */
1848ba1e511SMatthew Knepley };
1858ba1e511SMatthew Knepley 
186e855f6f8SMatthew Knepley typedef struct _EventPerfLog *EventPerfLog;
187e855f6f8SMatthew Knepley struct _EventPerfLog {
188e855f6f8SMatthew Knepley   int            numEvents; /* The number of logging events */
189e855f6f8SMatthew Knepley   int            maxEvents; /* The maximum number of events */
190af80a1fbSMatthew Knepley   EventPerfInfo *eventInfo; /* The performance information for each event */
191e855f6f8SMatthew Knepley };
1928ba1e511SMatthew Knepley 
193e855f6f8SMatthew Knepley /* The structure for logging class information */
194e855f6f8SMatthew Knepley typedef struct _ClassRegLog *ClassRegLog;
195e855f6f8SMatthew Knepley struct _ClassRegLog {
196e855f6f8SMatthew Knepley   int           numClasses; /* The number of classes registered */
197e855f6f8SMatthew Knepley   int           maxClasses; /* The maximum number of classes */
198e855f6f8SMatthew Knepley   ClassRegInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
199e855f6f8SMatthew Knepley };
200e855f6f8SMatthew Knepley 
201e855f6f8SMatthew Knepley typedef struct _ClassPerfLog *ClassPerfLog;
202e855f6f8SMatthew Knepley struct _ClassPerfLog {
203e855f6f8SMatthew Knepley   int            numClasses; /* The number of logging classes */
204e855f6f8SMatthew Knepley   int            maxClasses; /* The maximum number of classes */
205e855f6f8SMatthew Knepley   ClassPerfInfo *classInfo;  /* The structure for class information (cookies are monotonicly increasing) */
206e855f6f8SMatthew Knepley };
207e855f6f8SMatthew Knepley 
208e855f6f8SMatthew Knepley /* The structures for logging in stages */
209e855f6f8SMatthew Knepley typedef struct _StageInfo {
210e855f6f8SMatthew Knepley   char         *name;     /* The stage name */
211*773a6509SMatthew Knepley   PetscTruth    used;     /* The stage was pushed on this processor */
212af80a1fbSMatthew Knepley   EventPerfInfo perfInfo; /* The stage performance information */
213e855f6f8SMatthew Knepley   EventPerfLog  eventLog; /* The event information for this stage */
214e855f6f8SMatthew Knepley   ClassPerfLog  classLog; /* The class information for this stage */
215e855f6f8SMatthew Knepley } StageInfo;
216e855f6f8SMatthew Knepley 
2178ba1e511SMatthew Knepley struct _StageLog {
2188ba1e511SMatthew Knepley   /* Size information */
2198ba1e511SMatthew Knepley   int         numStages; /* The number of registered stages */
2208ba1e511SMatthew Knepley   int         maxStages; /* The maximum number of stages */
2218ba1e511SMatthew Knepley   /* Runtime information */
2228ba1e511SMatthew Knepley   IntStack    stack;     /* The stack for active stages */
2238ba1e511SMatthew Knepley   int         curStage;  /* The current stage (only used in macros so we don't call StackTop) */
2248ba1e511SMatthew Knepley   /* Stage specific information */
225e855f6f8SMatthew Knepley   StageInfo  *stageInfo; /* The information for each stage */
226e855f6f8SMatthew Knepley   EventRegLog eventLog;  /* The registered events */
227e855f6f8SMatthew Knepley   ClassRegLog classLog;  /* The registered classes */
2288ba1e511SMatthew Knepley };
2298ba1e511SMatthew Knepley 
230043328b6SSatish Balay #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0; \
231043328b6SSatish Balay {\
232043328b6SSatish Balay   int _2_ierr;\
233*773a6509SMatthew Knepley   if (_PetscLogPLB && \
234*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
235*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
2366e491fe6SBarry Smith     _2_ierr = PetscLogEventBegin((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\
2376e491fe6SBarry Smith     _2_ierr = MPI_Barrier(cm);CHKERRQ(_2_ierr);\
2386e491fe6SBarry Smith     _2_ierr = PetscLogEventEnd((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\
239005c665bSBarry Smith   }\
2406e491fe6SBarry Smith   _2_ierr = PetscLogEventBegin((e)+1,o1,o2,o3,o4);CHKERRQ(_2_ierr);\
241005c665bSBarry Smith }
24277c4ece6SBarry Smith 
243043328b6SSatish Balay #define PetscLogEventBegin(e,o1,o2,o3,o4) 0; \
244043328b6SSatish Balay {\
245*773a6509SMatthew Knepley   if (_PetscLogPLB && \
246*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
247*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
248043328b6SSatish Balay     (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\
249043328b6SSatish Balay   }\
250043328b6SSatish Balay   PETSC_LOG_EVENT_MPE_BEGIN(e); \
251a1b5d808SSatish Balay }
252043328b6SSatish Balay 
253b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
254043328b6SSatish Balay 
255043328b6SSatish Balay #define PetscLogEventEnd(e,o1,o2,o3,o4) 0; \
256043328b6SSatish Balay {\
257*773a6509SMatthew Knepley   if (_PetscLogPLE && \
258*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && \
259*773a6509SMatthew Knepley       _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\
260043328b6SSatish Balay     (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\
261043328b6SSatish Balay   }\
262043328b6SSatish Balay   PETSC_LOG_EVENT_MPE_END(e); \
263a1b5d808SSatish Balay }
26477c4ece6SBarry Smith 
265ce85283eSBarry Smith /*
26684cb2905SBarry Smith      This does not work for MPI-Uni because our src/mpiuni/mpi.h file
267ce85283eSBarry Smith    uses macros to defined the MPI operations.
26815308354SBarry Smith 
26915308354SBarry Smith      It does not work correctly from HP-UX because it processes the
270bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
271b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
2727c1e34a4SSatish Balay 
2737c1e34a4SSatish Balay      It does not work with Windows NT because winmpich lacks MPI_Type_size()
274ce85283eSBarry Smith */
275b6410449SSatish Balay #if !defined(PETSC_HAVE_MPI_UNI) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
27677a39924SBarry Smith /*
27777a39924SBarry Smith    Logging of MPI activities
27877a39924SBarry Smith */
27977a39924SBarry Smith 
28077a39924SBarry Smith #define TypeSize(buff,count,type) \
281ca161407SBarry Smith (\
282b0a32e0cSBarry Smith   MPI_Type_size(type,&PETSC_DUMMY_SIZE),buff += ((PetscLogDouble) ((count)*PETSC_DUMMY_SIZE))\
283ca161407SBarry Smith )
28477a39924SBarry Smith 
28577a39924SBarry Smith #define MPI_Irecv(buf,count, datatype,source,tag,comm,request) \
286ca161407SBarry Smith (\
287ca161407SBarry Smith   PETSC_DUMMY = MPI_Irecv(buf,count, datatype,source,tag,comm,request),\
288ca161407SBarry Smith   irecv_ct++,TypeSize(irecv_len,count,datatype),PETSC_DUMMY\
289ca161407SBarry Smith )
29015308354SBarry Smith 
29177a39924SBarry Smith #define MPI_Isend(buf,count, datatype,dest,tag,comm,request) \
292ca161407SBarry Smith (\
293ca161407SBarry Smith   PETSC_DUMMY = MPI_Isend(buf,count, datatype,dest,tag,comm,request),\
294ca161407SBarry Smith   isend_ct++,  TypeSize(isend_len,count,datatype),PETSC_DUMMY\
295ca161407SBarry Smith )
29615308354SBarry Smith 
2970d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
298ca161407SBarry Smith (\
299ca161407SBarry Smith   PETSC_DUMMY = MPI_Startall(number,requests),\
30087828ca2SBarry Smith   irecv_ct += (PetscLogDouble)(number),irecv_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\
301ca161407SBarry Smith )
3020d4b0b6cSBarry Smith 
3030d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
304ca161407SBarry Smith (\
305ca161407SBarry Smith   PETSC_DUMMY = MPI_Startall(number,requests),\
30687828ca2SBarry Smith   isend_ct += (PetscLogDouble)(number),isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\
307ca161407SBarry Smith )
3080d4b0b6cSBarry Smith 
3090d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \
310ca161407SBarry Smith (\
311ca161407SBarry Smith   PETSC_DUMMY = MPI_Start(requests),\
31287828ca2SBarry Smith   isend_ct++,isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\
313ca161407SBarry Smith )
3140d4b0b6cSBarry Smith 
315ce85283eSBarry Smith #define MPI_Recv(buf,count, datatype,source,tag,comm,status) \
316ca161407SBarry Smith (\
317ca161407SBarry Smith   PETSC_DUMMY = MPI_Recv(buf,count, datatype,source,tag,comm,status),\
318ca161407SBarry Smith   recv_ct++,TypeSize(recv_len,count,datatype),PETSC_DUMMY\
319ca161407SBarry Smith )
32015308354SBarry Smith 
32177a39924SBarry Smith #define MPI_Send(buf,count, datatype,dest,tag,comm) \
322ca161407SBarry Smith (\
323ca161407SBarry Smith   PETSC_DUMMY = MPI_Send(buf,count, datatype,dest,tag,comm),\
324ca161407SBarry Smith   send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY\
325ca161407SBarry Smith )
32677a39924SBarry Smith 
32777a39924SBarry Smith #define MPI_Wait(request,status) \
32877a39924SBarry Smith (\
329e0937024SBarry Smith   wait_ct++,sum_of_waits_ct++,\
33077a39924SBarry Smith   MPI_Wait(request,status)\
33177a39924SBarry Smith )
33277a39924SBarry Smith 
33377a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
33477a39924SBarry Smith (\
335e0937024SBarry Smith   wait_any_ct++,sum_of_waits_ct++,\
33677a39924SBarry Smith   MPI_Waitany(a,b,c,d)\
33777a39924SBarry Smith )
33877a39924SBarry Smith 
33977a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
34077a39924SBarry Smith (\
341b0a32e0cSBarry Smith   wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),\
34277a39924SBarry Smith   MPI_Waitall(count,array_of_requests,array_of_statuses)\
34377a39924SBarry Smith )
34477a39924SBarry Smith 
34577a39924SBarry Smith #define MPI_Allreduce(sendbuf, recvbuf,count,datatype,op,comm) \
3460743b949SBarry Smith (\
3470743b949SBarry Smith   allreduce_ct++,MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)\
3480743b949SBarry Smith )
3493914022bSBarry Smith 
3500d4b0b6cSBarry Smith #else
3510d4b0b6cSBarry Smith 
3520d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
353ca161407SBarry Smith (\
354ca161407SBarry Smith   MPI_Startall(number,requests)\
355ca161407SBarry Smith )
3560d4b0b6cSBarry Smith 
3570d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
358ca161407SBarry Smith (\
359ca161407SBarry Smith   MPI_Startall(number,requests)\
360ca161407SBarry Smith )
3610d4b0b6cSBarry Smith 
3620d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \
363ca161407SBarry Smith (\
364ca161407SBarry Smith   MPI_Start(requests)\
365ca161407SBarry Smith )
3660d4b0b6cSBarry Smith 
367b6410449SSatish Balay #endif /* !PETSC_HAVE_MPI_UNI && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
368614700edSBarry Smith 
369df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
370614700edSBarry Smith 
371b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
372614700edSBarry Smith 
373df8cf0b5SBarry Smith /*
374df8cf0b5SBarry Smith      With logging turned off, then MPE has to be turned off
375df8cf0b5SBarry Smith */
376b0a32e0cSBarry Smith #define PetscLogMPEBegin()         0
377b0a32e0cSBarry Smith #define PetscLogMPEDump(a)         0
378614700edSBarry Smith 
379b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
380b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
381614700edSBarry Smith 
382b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
383b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
38477c4ece6SBarry Smith 
385b0a32e0cSBarry Smith #define _PetscLogPLB                        0
386b0a32e0cSBarry Smith #define _PetscLogPLE                        0
387b0a32e0cSBarry Smith #define _PetscLogPHC                        0
388b0a32e0cSBarry Smith #define _PetscLogPHD                        0
38999de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
390b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
391b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
392b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
393b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
394b0a32e0cSBarry Smith #define PetscLogObjectParent(p,c)
395b0a32e0cSBarry Smith #define PetscLogObjectParents(p,n,c)
396b0a32e0cSBarry Smith #define PetscLogObjectCreate(h)
397b0a32e0cSBarry Smith #define PetscLogObjectDestroy(h)
398b0a32e0cSBarry Smith #define PetscLogObjectMemory(p,m)
399b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
400b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
401b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
402b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
403b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
404b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file)     0
405b0a32e0cSBarry Smith #define PetscLogBegin()                     0
406b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
407b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
408b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
409b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
410043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
411f80b7eb0SBarry Smith EXTERN int PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
412ce6058e1SBarry Smith 
413aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
414ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
415ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
416ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
417ca161407SBarry Smith 
418aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4196daaf66cSBarry Smith 
420435da068SBarry Smith extern PetscTruth PetscPreLoadingUsed;       /* true if we are or have done preloading */
421435da068SBarry Smith extern PetscTruth PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
4221d1367b7SBarry Smith 
423043328b6SSatish Balay #define PreLoadBegin(flag,name) \
424043328b6SSatish Balay {\
425043328b6SSatish Balay   PetscTruth PreLoading = flag;\
4268e58c17dSMatthew Knepley   int        PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\
4276e491fe6SBarry Smith   _3_ierr = PetscOptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\
428043328b6SSatish Balay   PreLoadMax = (int)(PreLoading);\
429043328b6SSatish Balay   PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
430e7592fafSBarry Smith   for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\
431435da068SBarry Smith     PetscPreLoadingOn = PreLoading;\
4326e491fe6SBarry Smith     _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\
4338e58c17dSMatthew Knepley     if (PreLoadIt>0) {\
4348e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4358e58c17dSMatthew Knepley     } else {\
4368e58c17dSMatthew Knepley       _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4378e58c17dSMatthew Knepley     }\
438*773a6509SMatthew Knepley     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4398e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
4408e58c17dSMatthew Knepley 
441043328b6SSatish Balay #define PreLoadEnd() \
442043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
443043328b6SSatish Balay     PreLoading = PETSC_FALSE;\
444043328b6SSatish Balay   }\
445043328b6SSatish Balay }
4468e58c17dSMatthew Knepley 
447043328b6SSatish Balay #define PreLoadStage(name) \
448043328b6SSatish Balay   _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
4498e58c17dSMatthew Knepley   if (PreLoadIt>0) {\
4508e58c17dSMatthew Knepley     _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
4518e58c17dSMatthew Knepley   } else {\
4528e58c17dSMatthew Knepley     _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\
4538e58c17dSMatthew Knepley   }\
454*773a6509SMatthew Knepley   _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\
4558e58c17dSMatthew Knepley   _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
45697bb86f7SLois Curfman McInnes #endif
457