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) \ 61*44451550SSatish 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) \ 65*44451550SSatish 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); 1078ba1e511SMatthew Knepley EXTERN int PetscLogStageSetVisible(int, PetscTruth); 1088ba1e511SMatthew Knepley EXTERN int PetscLogStageGetVisible(int, PetscTruth *); 1098e58c17dSMatthew Knepley EXTERN int PetscLogStageGetId(const char [], int *); 1108ba1e511SMatthew Knepley /* Event functions */ 111043328b6SSatish Balay EXTERN int PetscLogEventRegister(int *, const char[], int); 1128ba1e511SMatthew Knepley EXTERN int PetscLogEventActivate(int); 1138ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivate(int); 1148ba1e511SMatthew Knepley EXTERN int PetscLogEventActivateClass(int); 1158ba1e511SMatthew Knepley EXTERN int PetscLogEventDeactivateClass(int); 1168ba1e511SMatthew Knepley /* Class functions */ 1178ba1e511SMatthew Knepley EXTERN int PetscLogClassRegister(int *, const char []); 1188ba1e511SMatthew Knepley 1198ba1e511SMatthew Knepley /* Global counters */ 1208ba1e511SMatthew Knepley extern PetscLogDouble irecv_ct, isend_ct, recv_ct, send_ct; 1218ba1e511SMatthew Knepley extern PetscLogDouble irecv_len, isend_len, recv_len, send_len; 1228ba1e511SMatthew Knepley extern PetscLogDouble allreduce_ct; 1238ba1e511SMatthew Knepley extern PetscLogDouble wait_ct, wait_any_ct, wait_all_ct, sum_of_waits_ct; 1248ba1e511SMatthew Knepley extern int PETSC_DUMMY, PETSC_DUMMY_SIZE; 1258ba1e511SMatthew Knepley 1268ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event 1278ba1e511SMatthew Knepley activation flags in the PetscLogEventBegin/End() macros. If we forced a 1288ba1e511SMatthew Knepley function call each time, we could leave these structures in plog.h 1298ba1e511SMatthew Knepley */ 130e855f6f8SMatthew Knepley /* Default log */ 131e855f6f8SMatthew Knepley typedef struct _StageLog *StageLog; 132e855f6f8SMatthew Knepley extern StageLog _stageLog; 133e855f6f8SMatthew Knepley 134e855f6f8SMatthew Knepley /* A simple stack (should replace) */ 135e855f6f8SMatthew Knepley typedef struct _IntStack *IntStack; 136e855f6f8SMatthew Knepley 137e855f6f8SMatthew Knepley /* The structures for logging performance */ 1388ba1e511SMatthew Knepley typedef struct _PerfInfo { 139e855f6f8SMatthew Knepley int id; /* The integer identifying this section */ 140800883a5SMatthew Knepley PetscTruth active; /* The flag to activate logging */ 141800883a5SMatthew Knepley PetscTruth visible; /* The flag to print info in summary */ 1428ba1e511SMatthew Knepley int depth; /* The nesting depth of the event call */ 1438ba1e511SMatthew Knepley int count; /* The number of times this section was executed */ 1448ba1e511SMatthew Knepley PetscLogDouble flops; /* The flops used in this section */ 1458ba1e511SMatthew Knepley PetscLogDouble time; /* The time taken for this section */ 1468ba1e511SMatthew Knepley PetscLogDouble numMessages; /* The number of messages in this section */ 1478ba1e511SMatthew Knepley PetscLogDouble messageLength; /* The total message lengths in this section */ 1488ba1e511SMatthew Knepley PetscLogDouble numReductions; /* The number of reductions in this section */ 1498ba1e511SMatthew Knepley } PerfInfo; 1508ba1e511SMatthew Knepley 151e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo { 152e855f6f8SMatthew Knepley int id; /* The integer identifying this class */ 1538ba1e511SMatthew Knepley int creations; /* The number of objects of this class created */ 1548ba1e511SMatthew Knepley int destructions; /* The number of objects of this class destroyed */ 1558ba1e511SMatthew Knepley PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1568ba1e511SMatthew Knepley PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 157e855f6f8SMatthew Knepley } ClassPerfInfo; 1588ba1e511SMatthew Knepley 159e855f6f8SMatthew Knepley /* The structures for logging registration */ 160e855f6f8SMatthew Knepley typedef struct _ClassRegInfo { 161e855f6f8SMatthew Knepley char *name; /* The class name */ 162e855f6f8SMatthew Knepley int cookie; /* The integer identifying this class */ 163e855f6f8SMatthew Knepley } ClassRegInfo; 164e855f6f8SMatthew Knepley 165e855f6f8SMatthew Knepley typedef struct _EventRegInfo { 166e855f6f8SMatthew Knepley char *name; /* The name of this event */ 167e855f6f8SMatthew Knepley int cookie; /* The class id for this event (should maybe give class ID instead) */ 168*44451550SSatish Balay #if defined (PETSC_HAVE_MPE) 169*44451550SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 170*44451550SSatish Balay int mpe_id_end; 171*44451550SSatish Balay #endif 172e855f6f8SMatthew Knepley } EventRegInfo; 173e855f6f8SMatthew Knepley 174e855f6f8SMatthew Knepley /* The structure for logging events */ 175e855f6f8SMatthew Knepley typedef int PetscEvent; 176e855f6f8SMatthew Knepley 177e855f6f8SMatthew Knepley typedef struct _EventRegLog *EventRegLog; 178e855f6f8SMatthew Knepley struct _EventRegLog { 179e855f6f8SMatthew Knepley int numEvents; /* The number of registered events */ 180e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 181e855f6f8SMatthew Knepley EventRegInfo *eventInfo; /* The registration information for each event */ 1828ba1e511SMatthew Knepley }; 1838ba1e511SMatthew Knepley 184e855f6f8SMatthew Knepley typedef struct _EventPerfLog *EventPerfLog; 185e855f6f8SMatthew Knepley struct _EventPerfLog { 186e855f6f8SMatthew Knepley int numEvents; /* The number of logging events */ 187e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 188e855f6f8SMatthew Knepley PerfInfo *eventInfo; /* The performance information for each event */ 189e855f6f8SMatthew Knepley }; 1908ba1e511SMatthew Knepley 191e855f6f8SMatthew Knepley /* The structure for logging class information */ 192e855f6f8SMatthew Knepley typedef struct _ClassRegLog *ClassRegLog; 193e855f6f8SMatthew Knepley struct _ClassRegLog { 194e855f6f8SMatthew Knepley int numClasses; /* The number of classes registered */ 195e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 196e855f6f8SMatthew Knepley ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 197e855f6f8SMatthew Knepley }; 198e855f6f8SMatthew Knepley 199e855f6f8SMatthew Knepley typedef struct _ClassPerfLog *ClassPerfLog; 200e855f6f8SMatthew Knepley struct _ClassPerfLog { 201e855f6f8SMatthew Knepley int numClasses; /* The number of logging classes */ 202e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 203e855f6f8SMatthew Knepley ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 204e855f6f8SMatthew Knepley }; 205e855f6f8SMatthew Knepley 206e855f6f8SMatthew Knepley /* The structures for logging in stages */ 207e855f6f8SMatthew Knepley typedef struct _StageInfo { 208e855f6f8SMatthew Knepley char *name; /* The stage name */ 209e855f6f8SMatthew Knepley PerfInfo perfInfo; /* The stage performance information */ 210e855f6f8SMatthew Knepley EventPerfLog eventLog; /* The event information for this stage */ 211e855f6f8SMatthew Knepley ClassPerfLog classLog; /* The class information for this stage */ 212e855f6f8SMatthew Knepley } StageInfo; 213e855f6f8SMatthew Knepley 2148ba1e511SMatthew Knepley struct _StageLog { 2158ba1e511SMatthew Knepley /* Size information */ 2168ba1e511SMatthew Knepley int numStages; /* The number of registered stages */ 2178ba1e511SMatthew Knepley int maxStages; /* The maximum number of stages */ 2188ba1e511SMatthew Knepley /* Runtime information */ 2198ba1e511SMatthew Knepley IntStack stack; /* The stack for active stages */ 2208ba1e511SMatthew Knepley int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 2218ba1e511SMatthew Knepley /* Stage specific information */ 222e855f6f8SMatthew Knepley StageInfo *stageInfo; /* The information for each stage */ 223e855f6f8SMatthew Knepley EventRegLog eventLog; /* The registered events */ 224e855f6f8SMatthew Knepley ClassRegLog classLog; /* The registered classes */ 2258ba1e511SMatthew Knepley }; 2268ba1e511SMatthew Knepley 227043328b6SSatish Balay #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0; \ 228043328b6SSatish Balay {\ 229043328b6SSatish Balay int _2_ierr;\ 230e855f6f8SMatthew Knepley if (_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\ 2316e491fe6SBarry Smith _2_ierr = PetscLogEventBegin((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\ 2326e491fe6SBarry Smith _2_ierr = MPI_Barrier(cm);CHKERRQ(_2_ierr);\ 2336e491fe6SBarry Smith _2_ierr = PetscLogEventEnd((e),o1,o2,o3,o4);CHKERRQ(_2_ierr);\ 234005c665bSBarry Smith }\ 2356e491fe6SBarry Smith _2_ierr = PetscLogEventBegin((e)+1,o1,o2,o3,o4);CHKERRQ(_2_ierr);\ 236005c665bSBarry Smith } 23777c4ece6SBarry Smith 238043328b6SSatish Balay #define PetscLogEventBegin(e,o1,o2,o3,o4) 0; \ 239043328b6SSatish Balay {\ 24074968b1dSMatthew Knepley if (_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\ 241043328b6SSatish Balay (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 242043328b6SSatish Balay }\ 243043328b6SSatish Balay PETSC_LOG_EVENT_MPE_BEGIN(e); \ 244a1b5d808SSatish Balay } 245043328b6SSatish Balay 246b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 247043328b6SSatish Balay 248043328b6SSatish Balay #define PetscLogEventEnd(e,o1,o2,o3,o4) 0; \ 249043328b6SSatish Balay {\ 25031949c63SMatthew Knepley if (_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) {\ 251043328b6SSatish Balay (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 252043328b6SSatish Balay }\ 253043328b6SSatish Balay PETSC_LOG_EVENT_MPE_END(e); \ 254a1b5d808SSatish Balay } 25577c4ece6SBarry Smith 256ce85283eSBarry Smith /* 25784cb2905SBarry Smith This does not work for MPI-Uni because our src/mpiuni/mpi.h file 258ce85283eSBarry Smith uses macros to defined the MPI operations. 25915308354SBarry Smith 26015308354SBarry Smith It does not work correctly from HP-UX because it processes the 261bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 262b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 2637c1e34a4SSatish Balay 2647c1e34a4SSatish Balay It does not work with Windows NT because winmpich lacks MPI_Type_size() 265ce85283eSBarry Smith */ 266b6410449SSatish Balay #if !defined(PETSC_HAVE_MPI_UNI) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 26777a39924SBarry Smith /* 26877a39924SBarry Smith Logging of MPI activities 26977a39924SBarry Smith */ 27077a39924SBarry Smith 27177a39924SBarry Smith #define TypeSize(buff,count,type) \ 272ca161407SBarry Smith (\ 273b0a32e0cSBarry Smith MPI_Type_size(type,&PETSC_DUMMY_SIZE),buff += ((PetscLogDouble) ((count)*PETSC_DUMMY_SIZE))\ 274ca161407SBarry Smith ) 27577a39924SBarry Smith 27677a39924SBarry Smith #define MPI_Irecv(buf,count, datatype,source,tag,comm,request) \ 277ca161407SBarry Smith (\ 278ca161407SBarry Smith PETSC_DUMMY = MPI_Irecv(buf,count, datatype,source,tag,comm,request),\ 279ca161407SBarry Smith irecv_ct++,TypeSize(irecv_len,count,datatype),PETSC_DUMMY\ 280ca161407SBarry Smith ) 28115308354SBarry Smith 28277a39924SBarry Smith #define MPI_Isend(buf,count, datatype,dest,tag,comm,request) \ 283ca161407SBarry Smith (\ 284ca161407SBarry Smith PETSC_DUMMY = MPI_Isend(buf,count, datatype,dest,tag,comm,request),\ 285ca161407SBarry Smith isend_ct++, TypeSize(isend_len,count,datatype),PETSC_DUMMY\ 286ca161407SBarry Smith ) 28715308354SBarry Smith 2880d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 289ca161407SBarry Smith (\ 290ca161407SBarry Smith PETSC_DUMMY = MPI_Startall(number,requests),\ 29187828ca2SBarry Smith irecv_ct += (PetscLogDouble)(number),irecv_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\ 292ca161407SBarry Smith ) 2930d4b0b6cSBarry Smith 2940d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 295ca161407SBarry Smith (\ 296ca161407SBarry Smith PETSC_DUMMY = MPI_Startall(number,requests),\ 29787828ca2SBarry Smith isend_ct += (PetscLogDouble)(number),isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\ 298ca161407SBarry Smith ) 2990d4b0b6cSBarry Smith 3000d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \ 301ca161407SBarry Smith (\ 302ca161407SBarry Smith PETSC_DUMMY = MPI_Start(requests),\ 30387828ca2SBarry Smith isend_ct++,isend_len += ((PetscLogDouble) ((count)*sizeof(PetscScalar))),PETSC_DUMMY\ 304ca161407SBarry Smith ) 3050d4b0b6cSBarry Smith 306ce85283eSBarry Smith #define MPI_Recv(buf,count, datatype,source,tag,comm,status) \ 307ca161407SBarry Smith (\ 308ca161407SBarry Smith PETSC_DUMMY = MPI_Recv(buf,count, datatype,source,tag,comm,status),\ 309ca161407SBarry Smith recv_ct++,TypeSize(recv_len,count,datatype),PETSC_DUMMY\ 310ca161407SBarry Smith ) 31115308354SBarry Smith 31277a39924SBarry Smith #define MPI_Send(buf,count, datatype,dest,tag,comm) \ 313ca161407SBarry Smith (\ 314ca161407SBarry Smith PETSC_DUMMY = MPI_Send(buf,count, datatype,dest,tag,comm),\ 315ca161407SBarry Smith send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY\ 316ca161407SBarry Smith ) 31777a39924SBarry Smith 31877a39924SBarry Smith #define MPI_Wait(request,status) \ 31977a39924SBarry Smith (\ 320e0937024SBarry Smith wait_ct++,sum_of_waits_ct++,\ 32177a39924SBarry Smith MPI_Wait(request,status)\ 32277a39924SBarry Smith ) 32377a39924SBarry Smith 32477a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 32577a39924SBarry Smith (\ 326e0937024SBarry Smith wait_any_ct++,sum_of_waits_ct++,\ 32777a39924SBarry Smith MPI_Waitany(a,b,c,d)\ 32877a39924SBarry Smith ) 32977a39924SBarry Smith 33077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 33177a39924SBarry Smith (\ 332b0a32e0cSBarry Smith wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),\ 33377a39924SBarry Smith MPI_Waitall(count,array_of_requests,array_of_statuses)\ 33477a39924SBarry Smith ) 33577a39924SBarry Smith 33677a39924SBarry Smith #define MPI_Allreduce(sendbuf, recvbuf,count,datatype,op,comm) \ 3370743b949SBarry Smith (\ 3380743b949SBarry Smith allreduce_ct++,MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)\ 3390743b949SBarry Smith ) 3403914022bSBarry Smith 3410d4b0b6cSBarry Smith #else 3420d4b0b6cSBarry Smith 3430d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 344ca161407SBarry Smith (\ 345ca161407SBarry Smith MPI_Startall(number,requests)\ 346ca161407SBarry Smith ) 3470d4b0b6cSBarry Smith 3480d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 349ca161407SBarry Smith (\ 350ca161407SBarry Smith MPI_Startall(number,requests)\ 351ca161407SBarry Smith ) 3520d4b0b6cSBarry Smith 3530d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \ 354ca161407SBarry Smith (\ 355ca161407SBarry Smith MPI_Start(requests)\ 356ca161407SBarry Smith ) 3570d4b0b6cSBarry Smith 358b6410449SSatish Balay #endif /* !PETSC_HAVE_MPI_UNI && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 359614700edSBarry Smith 360df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 361614700edSBarry Smith 362b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 363614700edSBarry Smith 364df8cf0b5SBarry Smith /* 365df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 366df8cf0b5SBarry Smith */ 367b0a32e0cSBarry Smith #define PetscLogMPEBegin() 0 368b0a32e0cSBarry Smith #define PetscLogMPEDump(a) 0 369614700edSBarry Smith 370b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 371b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 372614700edSBarry Smith 373b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 374b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 37577c4ece6SBarry Smith 376b0a32e0cSBarry Smith #define _PetscLogPLB 0 377b0a32e0cSBarry Smith #define _PetscLogPLE 0 378b0a32e0cSBarry Smith #define _PetscLogPHC 0 379b0a32e0cSBarry Smith #define _PetscLogPHD 0 38099de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 381b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 382b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 383b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 384b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 385b0a32e0cSBarry Smith #define PetscLogObjectParent(p,c) 386b0a32e0cSBarry Smith #define PetscLogObjectParents(p,n,c) 387b0a32e0cSBarry Smith #define PetscLogObjectCreate(h) 388b0a32e0cSBarry Smith #define PetscLogObjectDestroy(h) 389b0a32e0cSBarry Smith #define PetscLogObjectMemory(p,m) 390b0a32e0cSBarry Smith #define PetscLogDestroy() 0 391b0a32e0cSBarry Smith #define PetscLogStagePush(a) 0 392b0a32e0cSBarry Smith #define PetscLogStagePop() 0 393b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b) 0 394b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg) 0 395b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file) 0 396b0a32e0cSBarry Smith #define PetscLogBegin() 0 397b0a32e0cSBarry Smith #define PetscLogTraceBegin(file) 0 398b0a32e0cSBarry Smith #define PetscLogSet(lb,le) 0 399b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 400b0a32e0cSBarry Smith #define PetscLogDump(c) 0 401043328b6SSatish Balay #define PetscLogEventRegister(a,b,c) 0 402f80b7eb0SBarry Smith EXTERN int PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 403ce6058e1SBarry Smith 404aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 405ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 406ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 407ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests) 408ca161407SBarry Smith 409aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4106daaf66cSBarry Smith 411435da068SBarry Smith extern PetscTruth PetscPreLoadingUsed; /* true if we are or have done preloading */ 412435da068SBarry Smith extern PetscTruth PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 4131d1367b7SBarry Smith 414043328b6SSatish Balay #define PreLoadBegin(flag,name) \ 415043328b6SSatish Balay {\ 416043328b6SSatish Balay PetscTruth PreLoading = flag;\ 4178e58c17dSMatthew Knepley int PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\ 4186e491fe6SBarry Smith _3_ierr = PetscOptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 419043328b6SSatish Balay PreLoadMax = (int)(PreLoading);\ 420043328b6SSatish Balay PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 421e7592fafSBarry Smith for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 422435da068SBarry Smith PetscPreLoadingOn = PreLoading;\ 4236e491fe6SBarry Smith _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 4248e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4258e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4268e58c17dSMatthew Knepley } else {\ 4278e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4288e58c17dSMatthew Knepley _3_ierr = PetscLogStageSetVisible(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4298e58c17dSMatthew Knepley }\ 4308e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 4318e58c17dSMatthew Knepley 432043328b6SSatish Balay #define PreLoadEnd() \ 433043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 434043328b6SSatish Balay PreLoading = PETSC_FALSE;\ 435043328b6SSatish Balay }\ 436043328b6SSatish Balay } 4378e58c17dSMatthew Knepley 438043328b6SSatish Balay #define PreLoadStage(name) \ 439043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 4408e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4418e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4428e58c17dSMatthew Knepley } else {\ 4438e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4448e58c17dSMatthew Knepley _3_ierr = PetscLogStageSetVisible(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4458e58c17dSMatthew Knepley }\ 4468e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 44797bb86f7SLois Curfman McInnes #endif 448