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 */ 20ff73aad6SKris Buschelman extern PetscEvent PETSC_DLLEXPORT PETSC_Barrier; 2197bb86f7SLois Curfman McInnes 2219b02663SBarry Smith /* Global flop counter */ 23ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops; 2419b02663SBarry Smith 25edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 26ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfo_Private(void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 2763ba0a88SBarry Smith #if defined(PETSC_USE_DEBUG) 2863ba0a88SBarry Smith #define PetscLogInfo(A) PetscLogInfo_Private A 2963ba0a88SBarry Smith #else 3063ba0a88SBarry Smith #define PetscLogInfo(A) 0 3163ba0a88SBarry Smith #endif 32ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfoDeactivateClass(PetscCookie); 33ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogInfoActivateClass(PetscCookie); 34ff73aad6SKris Buschelman extern PetscTruth PETSC_DLLEXPORT PetscLogPrintInfo; /* if true, indicates PetscLogInfo() is turned on */ 35614700edSBarry Smith 36aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 37614700edSBarry Smith 38da63de55SLois Curfman McInnes /* 39da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 40da63de55SLois Curfman McInnes 41da63de55SLois Curfman McInnes For the complex numbers version, note that 42da63de55SLois Curfman McInnes 1 complex addition = 2 flops 43da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 44da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 45da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 46da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 47da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 48da63de55SLois Curfman McInnes among the various arithmetic operations. 49da63de55SLois Curfman McInnes */ 50da63de55SLois Curfman McInnes 51aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 52b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (4*n),0) 53da63de55SLois Curfman McInnes #else 54b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (n),0) 55da63de55SLois Curfman McInnes #endif 5677c4ece6SBarry Smith 57aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 5877c4ece6SBarry Smith #include "mpe.h" 59ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEBegin(void); 60ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEDump(const char[]); 6135d8aa7fSBarry Smith extern PetscTruth UseMPE; 62043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \ 6352e6d16bSBarry Smith ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? 6452e6d16bSBarry Smith MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,(char*)"") : 0) 65043328b6SSatish Balay 66043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \ 6752e6d16bSBarry Smith ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? 6852e6d16bSBarry Smith MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,(char*)"") : 0) 69043328b6SSatish Balay 70614700edSBarry Smith #else 7152e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0 7252e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e) 0 7377c4ece6SBarry Smith #endif 7477c4ece6SBarry Smith 75ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 76ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 77ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject); 78ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject); 7977c4ece6SBarry Smith 80043328b6SSatish Balay #define PetscLogObjectParent(p,c) \ 8152e6d16bSBarry Smith ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0) 8252e6d16bSBarry Smith 83efee365bSSatish Balay #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}} 84d38fa0fbSBarry Smith #define PetscLogObjectCreate(h) ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0) 85d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h) ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0) 8652e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) (((PetscObject)(p))->mem += (m),0) 878ba1e511SMatthew Knepley /* Initialization functions */ 88ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void); 89ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void); 90ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *); 91ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth); 92ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth); 938ba1e511SMatthew Knepley /* General functions */ 94ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]); 95ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void); 96ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 976849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 98ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...) PETSC_PRINTF_FORMAT_CHECK(2,3); 998ba1e511SMatthew Knepley /* Output functions */ 100ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]); 101ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]); 1028ba1e511SMatthew Knepley /* Counter functions */ 103ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *); 1048ba1e511SMatthew Knepley /* Stage functions */ 105ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(int*, const char[]); 106ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(int); 107ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void); 108ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(int, PetscTruth); 109ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(int, PetscTruth *); 110ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(int, PetscTruth); 111ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(int, PetscTruth *); 112ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], int *); 1138ba1e511SMatthew Knepley /* Event functions */ 114ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(PetscEvent*, const char[], PetscCookie); 115ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscEvent); 116ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscEvent); 117ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscEvent, PetscTruth); 118ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie); 119ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie); 1208ba1e511SMatthew Knepley /* Class functions */ 121ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogClassRegister(PetscCookie*, const char []); 1228ba1e511SMatthew Knepley 1238ba1e511SMatthew Knepley /* Global counters */ 124ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct; 125ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct; 126ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct; 127ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct; 128ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len; 129ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len; 130ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len; 131ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len; 132ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct; 133ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct; 134ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct; 135ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct; 136ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct; 137ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_SIZE; 138ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_COUNT; 1398ba1e511SMatthew Knepley 1408ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event 1418ba1e511SMatthew Knepley activation flags in the PetscLogEventBegin/End() macros. If we forced a 1428ba1e511SMatthew Knepley function call each time, we could leave these structures in plog.h 1438ba1e511SMatthew Knepley */ 144e855f6f8SMatthew Knepley /* Default log */ 145*95fbd943SSatish Balay typedef struct _n_StageLog *StageLog; 146ff73aad6SKris Buschelman extern PETSC_DLLEXPORT StageLog _stageLog; 147e855f6f8SMatthew Knepley 148e855f6f8SMatthew Knepley /* A simple stack (should replace) */ 149*95fbd943SSatish Balay typedef struct _n_IntStack *IntStack; 150e855f6f8SMatthew Knepley 151e855f6f8SMatthew Knepley /* The structures for logging performance */ 152af80a1fbSMatthew Knepley typedef struct _EventPerfInfo { 153e855f6f8SMatthew Knepley int id; /* The integer identifying this section */ 154800883a5SMatthew Knepley PetscTruth active; /* The flag to activate logging */ 155800883a5SMatthew Knepley PetscTruth visible; /* The flag to print info in summary */ 1568ba1e511SMatthew Knepley int depth; /* The nesting depth of the event call */ 1578ba1e511SMatthew Knepley int count; /* The number of times this section was executed */ 1588ba1e511SMatthew Knepley PetscLogDouble flops; /* The flops used in this section */ 1598ba1e511SMatthew Knepley PetscLogDouble time; /* The time taken for this section */ 1608ba1e511SMatthew Knepley PetscLogDouble numMessages; /* The number of messages in this section */ 1618ba1e511SMatthew Knepley PetscLogDouble messageLength; /* The total message lengths in this section */ 1628ba1e511SMatthew Knepley PetscLogDouble numReductions; /* The number of reductions in this section */ 163af80a1fbSMatthew Knepley } EventPerfInfo; 1648ba1e511SMatthew Knepley 165e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo { 166e855f6f8SMatthew Knepley int id; /* The integer identifying this class */ 1678ba1e511SMatthew Knepley int creations; /* The number of objects of this class created */ 1688ba1e511SMatthew Knepley int destructions; /* The number of objects of this class destroyed */ 1698ba1e511SMatthew Knepley PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1708ba1e511SMatthew Knepley PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 171e855f6f8SMatthew Knepley } ClassPerfInfo; 1728ba1e511SMatthew Knepley 173e855f6f8SMatthew Knepley /* The structures for logging registration */ 174e855f6f8SMatthew Knepley typedef struct _ClassRegInfo { 175e855f6f8SMatthew Knepley char *name; /* The class name */ 1766849ba73SBarry Smith PetscCookie cookie; /* The integer identifying this class */ 177e855f6f8SMatthew Knepley } ClassRegInfo; 178e855f6f8SMatthew Knepley 179e855f6f8SMatthew Knepley typedef struct _EventRegInfo { 180e855f6f8SMatthew Knepley char *name; /* The name of this event */ 1816849ba73SBarry Smith PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */ 18244451550SSatish Balay #if defined (PETSC_HAVE_MPE) 18344451550SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 18444451550SSatish Balay int mpe_id_end; 18544451550SSatish Balay #endif 186e855f6f8SMatthew Knepley } EventRegInfo; 187e855f6f8SMatthew Knepley 188*95fbd943SSatish Balay typedef struct _n_EventRegLog *EventRegLog; 189*95fbd943SSatish Balay struct _n_EventRegLog { 190e855f6f8SMatthew Knepley int numEvents; /* The number of registered events */ 191e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 192e855f6f8SMatthew Knepley EventRegInfo *eventInfo; /* The registration information for each event */ 1938ba1e511SMatthew Knepley }; 1948ba1e511SMatthew Knepley 195*95fbd943SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog; 196*95fbd943SSatish Balay struct _n_EventPerfLog { 197e855f6f8SMatthew Knepley int numEvents; /* The number of logging events */ 198e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 199af80a1fbSMatthew Knepley EventPerfInfo *eventInfo; /* The performance information for each event */ 200e855f6f8SMatthew Knepley }; 2018ba1e511SMatthew Knepley 202e855f6f8SMatthew Knepley /* The structure for logging class information */ 203*95fbd943SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog; 204*95fbd943SSatish Balay struct _n_ClassRegLog { 205e855f6f8SMatthew Knepley int numClasses; /* The number of classes registered */ 206e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 207e855f6f8SMatthew Knepley ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 208e855f6f8SMatthew Knepley }; 209e855f6f8SMatthew Knepley 210*95fbd943SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog; 211*95fbd943SSatish Balay struct _n_ClassPerfLog { 212e855f6f8SMatthew Knepley int numClasses; /* The number of logging classes */ 213e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 214e855f6f8SMatthew Knepley ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 215e855f6f8SMatthew Knepley }; 216e855f6f8SMatthew Knepley 217e855f6f8SMatthew Knepley /* The structures for logging in stages */ 218e855f6f8SMatthew Knepley typedef struct _StageInfo { 219e855f6f8SMatthew Knepley char *name; /* The stage name */ 220773a6509SMatthew Knepley PetscTruth used; /* The stage was pushed on this processor */ 221af80a1fbSMatthew Knepley EventPerfInfo perfInfo; /* The stage performance information */ 222e855f6f8SMatthew Knepley EventPerfLog eventLog; /* The event information for this stage */ 223e855f6f8SMatthew Knepley ClassPerfLog classLog; /* The class information for this stage */ 224e855f6f8SMatthew Knepley } StageInfo; 225e855f6f8SMatthew Knepley 226*95fbd943SSatish Balay struct _n_StageLog { 2278ba1e511SMatthew Knepley /* Size information */ 2288ba1e511SMatthew Knepley int numStages; /* The number of registered stages */ 2298ba1e511SMatthew Knepley int maxStages; /* The maximum number of stages */ 2308ba1e511SMatthew Knepley /* Runtime information */ 2318ba1e511SMatthew Knepley IntStack stack; /* The stack for active stages */ 2328ba1e511SMatthew Knepley int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 2338ba1e511SMatthew Knepley /* Stage specific information */ 234e855f6f8SMatthew Knepley StageInfo *stageInfo; /* The information for each stage */ 235e855f6f8SMatthew Knepley EventRegLog eventLog; /* The registered events */ 236e855f6f8SMatthew Knepley ClassRegLog classLog; /* The registered classes */ 2378ba1e511SMatthew Knepley }; 2388ba1e511SMatthew Knepley 23952e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 24052e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 24152e6d16bSBarry Smith (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \ 24252e6d16bSBarry Smith PetscLogEventBegin((e)+1,o1,o2,o3,o4)) 24377c4ece6SBarry Smith 24452e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 24552e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 24652e6d16bSBarry Smith (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 24752e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_BEGIN(e)) 248043328b6SSatish Balay 249b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 250043328b6SSatish Balay 25152e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 25252e6d16bSBarry Smith (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 25352e6d16bSBarry Smith (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 25452e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_END(e)) 25577c4ece6SBarry Smith 256f141ce34SMatthew Knepley /* Creation and destruction functions */ 257ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *); 258ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog); 259f141ce34SMatthew Knepley /* Registration functions */ 260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *); 261f141ce34SMatthew Knepley /* Runtime functions */ 262ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *); 263ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int); 264ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog); 265ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *); 266ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth); 267ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *); 268ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth); 269ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *); 270ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *); 271ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *); 272ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *); 273ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *); 274ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *); 275f141ce34SMatthew Knepley 276ce85283eSBarry Smith /* 2773c94ec11SBarry Smith This does not work for MPI-Uni because our include/mpiuni/mpi.h file 278ce85283eSBarry Smith uses macros to defined the MPI operations. 27915308354SBarry Smith 28015308354SBarry Smith It does not work correctly from HP-UX because it processes the 281bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 282b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 2837c1e34a4SSatish Balay 284f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 285ce85283eSBarry Smith */ 286f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 28777a39924SBarry Smith /* 28877a39924SBarry Smith Logging of MPI activities 28977a39924SBarry Smith */ 29077a39924SBarry Smith #define TypeSize(buff,count,type) \ 2915e3723c6SSatish Balay (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0)) 29277a39924SBarry Smith 29377a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 2945e3723c6SSatish 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)) 29515308354SBarry Smith 29677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 2975e3723c6SSatish 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)) 29815308354SBarry Smith 2990d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 3005e3723c6SSatish Balay ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3010d4b0b6cSBarry Smith 3020d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 3035e3723c6SSatish Balay ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3040d4b0b6cSBarry Smith 3050d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3065e3723c6SSatish Balay ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests)) 3070d4b0b6cSBarry Smith 308ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 3095e3723c6SSatish 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)) 31015308354SBarry Smith 31177a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 3125e3723c6SSatish 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)) 31377a39924SBarry Smith 31477a39924SBarry Smith #define MPI_Wait(request,status) \ 3155e3723c6SSatish Balay ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status)) 31677a39924SBarry Smith 31777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 3185e3723c6SSatish Balay ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d)) 31977a39924SBarry Smith 32077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 3215e3723c6SSatish 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)) 32277a39924SBarry Smith 32377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 3245e3723c6SSatish Balay ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)) 3253914022bSBarry Smith 3260d4b0b6cSBarry Smith #else 3270d4b0b6cSBarry Smith 3280d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 3295e3723c6SSatish Balay (MPI_Startall(number,requests)) 3300d4b0b6cSBarry Smith 3310d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 3325e3723c6SSatish Balay (MPI_Startall(number,requests)) 3330d4b0b6cSBarry Smith 3340d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3355e3723c6SSatish Balay (MPI_Start(requests)) 3360d4b0b6cSBarry Smith 337f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 338614700edSBarry Smith 339df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 340614700edSBarry Smith 341b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 342614700edSBarry Smith 343df8cf0b5SBarry Smith /* 344df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 345df8cf0b5SBarry Smith */ 346b0a32e0cSBarry Smith #define PetscLogMPEBegin() 0 347b0a32e0cSBarry Smith #define PetscLogMPEDump(a) 0 348614700edSBarry Smith 349b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 350b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 351614700edSBarry Smith 352b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 353b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 35477c4ece6SBarry Smith 355b0a32e0cSBarry Smith #define _PetscLogPLB 0 356b0a32e0cSBarry Smith #define _PetscLogPLE 0 357b0a32e0cSBarry Smith #define _PetscLogPHC 0 358b0a32e0cSBarry Smith #define _PetscLogPHD 0 35999de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 360b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 361b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 362b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 363b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 36452e6d16bSBarry Smith #define PetscLogObjectParent(p,c) 0 365efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 36652e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 36752e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 36852e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) 0 369b0a32e0cSBarry Smith #define PetscLogDestroy() 0 370b0a32e0cSBarry Smith #define PetscLogStagePush(a) 0 371b0a32e0cSBarry Smith #define PetscLogStagePop() 0 372b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b) 0 373b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg) 0 374b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file) 0 375b0a32e0cSBarry Smith #define PetscLogBegin() 0 376b0a32e0cSBarry Smith #define PetscLogTraceBegin(file) 0 377b0a32e0cSBarry Smith #define PetscLogSet(lb,le) 0 378b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 379b0a32e0cSBarry Smith #define PetscLogDump(c) 0 380043328b6SSatish Balay #define PetscLogEventRegister(a,b,c) 0 38173fda44aSBarry Smith #define PetscLogObjects(a) 0 38273fda44aSBarry Smith #define PetscLogActions(a) 0 383ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 384ce6058e1SBarry Smith 385aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 386ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 387ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 388ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests) 389ca161407SBarry Smith 390f141ce34SMatthew Knepley /* Creation and destruction functions */ 391f141ce34SMatthew Knepley #define StageLogCreate(stageLog) 0 392f141ce34SMatthew Knepley #define StageLogDestroy(stageLog) 0 393f141ce34SMatthew Knepley /* Registration functions */ 394f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage) 0 395f141ce34SMatthew Knepley /* Runtime functions */ 396f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog) 0 397f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage) 0 398f141ce34SMatthew Knepley #define StageLogPop(stageLog) 0 399f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage) 0 400f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active) 0 401f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active) 0 402f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0 403f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0 404f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage) 0 405f141ce34SMatthew Knepley 406aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4076daaf66cSBarry Smith 408ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscTruth PetscPreLoadingUsed; /* true if we are or have done preloading */ 409ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscTruth PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 4101d1367b7SBarry Smith 411043328b6SSatish Balay #define PreLoadBegin(flag,name) \ 412043328b6SSatish Balay {\ 413c4411e17SBarry Smith PetscTruth PreLoading = flag;\ 4148e58c17dSMatthew Knepley int PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\ 4154dc4c822SBarry Smith _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 416043328b6SSatish Balay PreLoadMax = (int)(PreLoading);\ 417043328b6SSatish Balay PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 418e7592fafSBarry Smith for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 419435da068SBarry Smith PetscPreLoadingOn = PreLoading;\ 4206e491fe6SBarry Smith _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 4218e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4228e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4238e58c17dSMatthew Knepley } else {\ 4248e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4258e58c17dSMatthew Knepley }\ 426773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4278e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 4288e58c17dSMatthew Knepley 429043328b6SSatish Balay #define PreLoadEnd() \ 430043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 431043328b6SSatish Balay PreLoading = PETSC_FALSE;\ 432043328b6SSatish Balay }\ 433043328b6SSatish Balay } 4348e58c17dSMatthew Knepley 435043328b6SSatish Balay #define PreLoadStage(name) \ 436043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 4378e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4388e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4398e58c17dSMatthew Knepley } else {\ 4408e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4418e58c17dSMatthew Knepley }\ 442773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4438e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 444e9fa29b7SSatish Balay 445e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 44697bb86f7SLois Curfman McInnes #endif 447