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 9c8d78d4dSSatish Balay 108ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 116849ba73SBarry Smith extern PetscEvent PETSC_LARGEST_EVENT; 1297bb86f7SLois Curfman McInnes 138ba1e511SMatthew Knepley /* Events for the Petsc standard library */ 14ff73aad6SKris Buschelman extern PetscEvent PETSC_DLLEXPORT PETSC_Barrier; 1597bb86f7SLois Curfman McInnes 1619b02663SBarry Smith /* Global flop counter */ 17ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops; 1819b02663SBarry Smith 19edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 2009f3b4e5SSatish Balay EXTERN PetscErrorCode PETSC_DLLEXPORT PetscVerboseInfo_Private(void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 215bcf5ddbSSatish Balay #if defined(PETSC_USE_VERBOSE) 2209f3b4e5SSatish Balay #define PetscVerboseInfo(A) PetscVerboseInfo_Private A 2363ba0a88SBarry Smith #else 2409f3b4e5SSatish Balay #define PetscVerboseInfo(A) 0 2563ba0a88SBarry Smith #endif 2609f3b4e5SSatish Balay EXTERN PetscErrorCode PETSC_DLLEXPORT PetscVerboseInfoDeactivateClass(PetscCookie); 2709f3b4e5SSatish Balay EXTERN PetscErrorCode PETSC_DLLEXPORT PetscVerboseInfoActivateClass(PetscCookie); 2809f3b4e5SSatish Balay extern PetscTruth PETSC_DLLEXPORT PetscLogPrintInfo; /* if true, indicates PetscVerboseInfo() is turned on */ 29614700edSBarry Smith 30aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 31614700edSBarry Smith 32da63de55SLois Curfman McInnes /* 33da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 34da63de55SLois Curfman McInnes 35da63de55SLois Curfman McInnes For the complex numbers version, note that 36da63de55SLois Curfman McInnes 1 complex addition = 2 flops 37da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 38da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 39da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 40da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 41da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 42da63de55SLois Curfman McInnes among the various arithmetic operations. 43da63de55SLois Curfman McInnes */ 44da63de55SLois Curfman McInnes 45aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 46b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (4*n),0) 47da63de55SLois Curfman McInnes #else 48b0a32e0cSBarry Smith #define PetscLogFlops(n) (_TotalFlops += (n),0) 49da63de55SLois Curfman McInnes #endif 5077c4ece6SBarry Smith 51aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 5277c4ece6SBarry Smith #include "mpe.h" 53ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEBegin(void); 54ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEDump(const char[]); 5535d8aa7fSBarry Smith extern PetscTruth UseMPE; 56043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \ 57335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 58a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,NULL) : 0) 59043328b6SSatish Balay 60043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \ 61335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 62a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,NULL) : 0) 63043328b6SSatish Balay 64614700edSBarry Smith #else 6552e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0 6652e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e) 0 6777c4ece6SBarry Smith #endif 6877c4ece6SBarry Smith 69ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 70ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 71ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject); 72ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject); 7377c4ece6SBarry Smith 74043328b6SSatish Balay #define PetscLogObjectParent(p,c) \ 7552e6d16bSBarry Smith ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0) 7652e6d16bSBarry Smith 77efee365bSSatish Balay #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}} 78d38fa0fbSBarry Smith #define PetscLogObjectCreate(h) ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0) 79d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h) ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0) 8052e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) (((PetscObject)(p))->mem += (m),0) 818ba1e511SMatthew Knepley /* Initialization functions */ 82ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void); 83ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void); 84ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *); 85ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth); 86ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth); 878ba1e511SMatthew Knepley /* General functions */ 88ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]); 89ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void); 90ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 916849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 92ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...) PETSC_PRINTF_FORMAT_CHECK(2,3); 938ba1e511SMatthew Knepley /* Output functions */ 94ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]); 95ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]); 968ba1e511SMatthew Knepley /* Counter functions */ 97ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *); 988ba1e511SMatthew Knepley /* Stage functions */ 99ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(int*, const char[]); 100ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(int); 101ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void); 102ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(int, PetscTruth); 103ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(int, PetscTruth *); 104ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(int, PetscTruth); 105ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(int, PetscTruth *); 106ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], int *); 1078ba1e511SMatthew Knepley /* Event functions */ 108ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(PetscEvent*, const char[], PetscCookie); 109ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscEvent); 110ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscEvent); 111ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscEvent, PetscTruth); 112ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie); 113ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie); 1148ba1e511SMatthew Knepley /* Class functions */ 115ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogClassRegister(PetscCookie*, const char []); 1168ba1e511SMatthew Knepley 1178ba1e511SMatthew Knepley /* Global counters */ 118ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct; 119ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct; 120ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct; 121ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct; 122ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len; 123ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len; 124ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len; 125ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len; 126ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct; 127ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct; 128ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct; 129ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct; 130ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct; 131ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_SIZE; 132ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_COUNT; 1338ba1e511SMatthew Knepley 1348ba1e511SMatthew Knepley /* We must make these structures available if we are to access the event 1358ba1e511SMatthew Knepley activation flags in the PetscLogEventBegin/End() macros. If we forced a 1368ba1e511SMatthew Knepley function call each time, we could leave these structures in plog.h 1378ba1e511SMatthew Knepley */ 138e855f6f8SMatthew Knepley /* Default log */ 13995fbd943SSatish Balay typedef struct _n_StageLog *StageLog; 140ff73aad6SKris Buschelman extern PETSC_DLLEXPORT StageLog _stageLog; 141e855f6f8SMatthew Knepley 142e855f6f8SMatthew Knepley /* A simple stack (should replace) */ 14395fbd943SSatish Balay typedef struct _n_IntStack *IntStack; 144e855f6f8SMatthew Knepley 145e855f6f8SMatthew Knepley /* The structures for logging performance */ 146af80a1fbSMatthew Knepley typedef struct _EventPerfInfo { 147e855f6f8SMatthew Knepley int id; /* The integer identifying this section */ 148800883a5SMatthew Knepley PetscTruth active; /* The flag to activate logging */ 149800883a5SMatthew Knepley PetscTruth visible; /* The flag to print info in summary */ 1508ba1e511SMatthew Knepley int depth; /* The nesting depth of the event call */ 1518ba1e511SMatthew Knepley int count; /* The number of times this section was executed */ 1528ba1e511SMatthew Knepley PetscLogDouble flops; /* The flops used in this section */ 1538ba1e511SMatthew Knepley PetscLogDouble time; /* The time taken for this section */ 1548ba1e511SMatthew Knepley PetscLogDouble numMessages; /* The number of messages in this section */ 1558ba1e511SMatthew Knepley PetscLogDouble messageLength; /* The total message lengths in this section */ 1568ba1e511SMatthew Knepley PetscLogDouble numReductions; /* The number of reductions in this section */ 157af80a1fbSMatthew Knepley } EventPerfInfo; 1588ba1e511SMatthew Knepley 159e855f6f8SMatthew Knepley typedef struct _ClassPerfInfo { 160e855f6f8SMatthew Knepley int id; /* The integer identifying this class */ 1618ba1e511SMatthew Knepley int creations; /* The number of objects of this class created */ 1628ba1e511SMatthew Knepley int destructions; /* The number of objects of this class destroyed */ 1638ba1e511SMatthew Knepley PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1648ba1e511SMatthew Knepley PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 165e855f6f8SMatthew Knepley } ClassPerfInfo; 1668ba1e511SMatthew Knepley 167e855f6f8SMatthew Knepley /* The structures for logging registration */ 168e855f6f8SMatthew Knepley typedef struct _ClassRegInfo { 169e855f6f8SMatthew Knepley char *name; /* The class name */ 1706849ba73SBarry Smith PetscCookie cookie; /* The integer identifying this class */ 171e855f6f8SMatthew Knepley } ClassRegInfo; 172e855f6f8SMatthew Knepley 173e855f6f8SMatthew Knepley typedef struct _EventRegInfo { 174e855f6f8SMatthew Knepley char *name; /* The name of this event */ 1756849ba73SBarry Smith PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */ 17644451550SSatish Balay #if defined (PETSC_HAVE_MPE) 17744451550SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 17844451550SSatish Balay int mpe_id_end; 17944451550SSatish Balay #endif 180e855f6f8SMatthew Knepley } EventRegInfo; 181e855f6f8SMatthew Knepley 18295fbd943SSatish Balay typedef struct _n_EventRegLog *EventRegLog; 18395fbd943SSatish Balay struct _n_EventRegLog { 184e855f6f8SMatthew Knepley int numEvents; /* The number of registered events */ 185e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 186e855f6f8SMatthew Knepley EventRegInfo *eventInfo; /* The registration information for each event */ 1878ba1e511SMatthew Knepley }; 1888ba1e511SMatthew Knepley 18995fbd943SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog; 19095fbd943SSatish Balay struct _n_EventPerfLog { 191e855f6f8SMatthew Knepley int numEvents; /* The number of logging events */ 192e855f6f8SMatthew Knepley int maxEvents; /* The maximum number of events */ 193af80a1fbSMatthew Knepley EventPerfInfo *eventInfo; /* The performance information for each event */ 194e855f6f8SMatthew Knepley }; 1958ba1e511SMatthew Knepley 196e855f6f8SMatthew Knepley /* The structure for logging class information */ 19795fbd943SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog; 19895fbd943SSatish Balay struct _n_ClassRegLog { 199e855f6f8SMatthew Knepley int numClasses; /* The number of classes registered */ 200e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 201e855f6f8SMatthew Knepley ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 202e855f6f8SMatthew Knepley }; 203e855f6f8SMatthew Knepley 20495fbd943SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog; 20595fbd943SSatish Balay struct _n_ClassPerfLog { 206e855f6f8SMatthew Knepley int numClasses; /* The number of logging classes */ 207e855f6f8SMatthew Knepley int maxClasses; /* The maximum number of classes */ 208e855f6f8SMatthew Knepley ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 209e855f6f8SMatthew Knepley }; 210e855f6f8SMatthew Knepley 211e855f6f8SMatthew Knepley /* The structures for logging in stages */ 212e855f6f8SMatthew Knepley typedef struct _StageInfo { 213e855f6f8SMatthew Knepley char *name; /* The stage name */ 214773a6509SMatthew Knepley PetscTruth used; /* The stage was pushed on this processor */ 215af80a1fbSMatthew Knepley EventPerfInfo perfInfo; /* The stage performance information */ 216e855f6f8SMatthew Knepley EventPerfLog eventLog; /* The event information for this stage */ 217e855f6f8SMatthew Knepley ClassPerfLog classLog; /* The class information for this stage */ 218e855f6f8SMatthew Knepley } StageInfo; 219e855f6f8SMatthew Knepley 22095fbd943SSatish Balay struct _n_StageLog { 2218ba1e511SMatthew Knepley /* Size information */ 2228ba1e511SMatthew Knepley int numStages; /* The number of registered stages */ 2238ba1e511SMatthew Knepley int maxStages; /* The maximum number of stages */ 2248ba1e511SMatthew Knepley /* Runtime information */ 2258ba1e511SMatthew Knepley IntStack stack; /* The stack for active stages */ 2268ba1e511SMatthew Knepley int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 2278ba1e511SMatthew Knepley /* Stage specific information */ 228e855f6f8SMatthew Knepley StageInfo *stageInfo; /* The information for each stage */ 229e855f6f8SMatthew Knepley EventRegLog eventLog; /* The registered events */ 230e855f6f8SMatthew Knepley ClassRegLog classLog; /* The registered classes */ 2318ba1e511SMatthew Knepley }; 2328ba1e511SMatthew Knepley 23352e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 23452e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 23552e6d16bSBarry Smith (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \ 23652e6d16bSBarry Smith PetscLogEventBegin((e)+1,o1,o2,o3,o4)) 23777c4ece6SBarry Smith 23852e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 23952e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 24052e6d16bSBarry Smith (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 24152e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_BEGIN(e)) 242043328b6SSatish Balay 243b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 244043328b6SSatish Balay 24552e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 24652e6d16bSBarry Smith (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 24752e6d16bSBarry Smith (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 24852e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_END(e)) 24977c4ece6SBarry Smith 250f141ce34SMatthew Knepley /* Creation and destruction functions */ 251ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *); 252ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog); 253f141ce34SMatthew Knepley /* Registration functions */ 254ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *); 255f141ce34SMatthew Knepley /* Runtime functions */ 256ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *); 257ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int); 258ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog); 259ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *); 260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth); 261ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *); 262ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth); 263ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *); 264ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *); 265ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *); 266ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *); 267ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *); 268ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *); 269f141ce34SMatthew Knepley 270ce85283eSBarry Smith /* 2713c94ec11SBarry Smith This does not work for MPI-Uni because our include/mpiuni/mpi.h file 272ce85283eSBarry Smith uses macros to defined the MPI operations. 27315308354SBarry Smith 27415308354SBarry Smith It does not work correctly from HP-UX because it processes the 275bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 276b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 2777c1e34a4SSatish Balay 278f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 279ce85283eSBarry Smith */ 280f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 28177a39924SBarry Smith /* 28277a39924SBarry Smith Logging of MPI activities 28377a39924SBarry Smith */ 28477a39924SBarry Smith #define TypeSize(buff,count,type) \ 2855e3723c6SSatish Balay (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0)) 28677a39924SBarry Smith 28777a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 2885e3723c6SSatish 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)) 28915308354SBarry Smith 29077a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 2915e3723c6SSatish 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)) 29215308354SBarry Smith 2930d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 2945e3723c6SSatish Balay ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 2950d4b0b6cSBarry Smith 2960d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 2975e3723c6SSatish Balay ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 2980d4b0b6cSBarry Smith 2990d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3005e3723c6SSatish Balay ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests)) 3010d4b0b6cSBarry Smith 302ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 3035e3723c6SSatish 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)) 30415308354SBarry Smith 30577a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 3065e3723c6SSatish 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)) 30777a39924SBarry Smith 30877a39924SBarry Smith #define MPI_Wait(request,status) \ 3095e3723c6SSatish Balay ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status)) 31077a39924SBarry Smith 31177a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 3125e3723c6SSatish Balay ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d)) 31377a39924SBarry Smith 31477a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 3155e3723c6SSatish 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)) 31677a39924SBarry Smith 31777a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 3185e3723c6SSatish Balay ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)) 3193914022bSBarry Smith 3200d4b0b6cSBarry Smith #else 3210d4b0b6cSBarry Smith 3220d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 3235e3723c6SSatish Balay (MPI_Startall(number,requests)) 3240d4b0b6cSBarry Smith 3250d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 3265e3723c6SSatish Balay (MPI_Startall(number,requests)) 3270d4b0b6cSBarry Smith 3280d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3295e3723c6SSatish Balay (MPI_Start(requests)) 3300d4b0b6cSBarry Smith 331f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 332614700edSBarry Smith 333df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 334614700edSBarry Smith 335b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 336614700edSBarry Smith 337df8cf0b5SBarry Smith /* 338df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 339df8cf0b5SBarry Smith */ 340b0a32e0cSBarry Smith #define PetscLogMPEBegin() 0 341b0a32e0cSBarry Smith #define PetscLogMPEDump(a) 0 342614700edSBarry Smith 343b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 344b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 345614700edSBarry Smith 346b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 347b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 348e8e7597cSSatish Balay #define PetscLogClassRegister(a,b) 0 349e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 35077c4ece6SBarry Smith 351b0a32e0cSBarry Smith #define _PetscLogPLB 0 352b0a32e0cSBarry Smith #define _PetscLogPLE 0 353b0a32e0cSBarry Smith #define _PetscLogPHC 0 354b0a32e0cSBarry Smith #define _PetscLogPHD 0 35599de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 356b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 357b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 358b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 359b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 36052e6d16bSBarry Smith #define PetscLogObjectParent(p,c) 0 361efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 36252e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 36352e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 36452e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) 0 365b0a32e0cSBarry Smith #define PetscLogDestroy() 0 366b0a32e0cSBarry Smith #define PetscLogStagePush(a) 0 367b0a32e0cSBarry Smith #define PetscLogStagePop() 0 368b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b) 0 369b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg) 0 370b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file) 0 371b0a32e0cSBarry Smith #define PetscLogBegin() 0 372b0a32e0cSBarry Smith #define PetscLogTraceBegin(file) 0 373b0a32e0cSBarry Smith #define PetscLogSet(lb,le) 0 374b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 375b0a32e0cSBarry Smith #define PetscLogDump(c) 0 376043328b6SSatish Balay #define PetscLogEventRegister(a,b,c) 0 37773fda44aSBarry Smith #define PetscLogObjects(a) 0 37873fda44aSBarry Smith #define PetscLogActions(a) 0 379ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 380ce6058e1SBarry Smith 381aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 382ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 383ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 384ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests) 385ca161407SBarry Smith 386f141ce34SMatthew Knepley /* Creation and destruction functions */ 387f141ce34SMatthew Knepley #define StageLogCreate(stageLog) 0 388f141ce34SMatthew Knepley #define StageLogDestroy(stageLog) 0 389f141ce34SMatthew Knepley /* Registration functions */ 390f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage) 0 391f141ce34SMatthew Knepley /* Runtime functions */ 392f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog) 0 393f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage) 0 394f141ce34SMatthew Knepley #define StageLogPop(stageLog) 0 395f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage) 0 396f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active) 0 397f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active) 0 398f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0 399f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0 400f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage) 0 401*fad68dfaSSatish Balay #define PetscLogStageGetId(a,b) (*(b)=0,0) 402*fad68dfaSSatish Balay #define PetscLogStageSetActive(a,b) 0 403f141ce34SMatthew Knepley 404aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4056daaf66cSBarry Smith 406043328b6SSatish Balay #define PreLoadBegin(flag,name) \ 407043328b6SSatish Balay {\ 408c4411e17SBarry Smith PetscTruth PreLoading = flag;\ 4098e58c17dSMatthew Knepley int PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\ 4104dc4c822SBarry Smith _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 411043328b6SSatish Balay PreLoadMax = (int)(PreLoading);\ 412043328b6SSatish Balay PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 413e7592fafSBarry Smith for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 414435da068SBarry Smith PetscPreLoadingOn = PreLoading;\ 4156e491fe6SBarry Smith _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 4168e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4178e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4188e58c17dSMatthew Knepley } else {\ 4198e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4208e58c17dSMatthew Knepley }\ 421773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4228e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 4238e58c17dSMatthew Knepley 424043328b6SSatish Balay #define PreLoadEnd() \ 425043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 426043328b6SSatish Balay PreLoading = PETSC_FALSE;\ 427043328b6SSatish Balay }\ 428043328b6SSatish Balay } 4298e58c17dSMatthew Knepley 430043328b6SSatish Balay #define PreLoadStage(name) \ 431043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 4328e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4338e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4348e58c17dSMatthew Knepley } else {\ 4358e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4368e58c17dSMatthew Knepley }\ 437773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4388e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 439e9fa29b7SSatish Balay 440e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 44197bb86f7SLois Curfman McInnes #endif 442