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 1319b02663SBarry Smith /* Global flop counter */ 14ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops; 1519b02663SBarry Smith 16edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 17ae15b995SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfo_Private(const char[],void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 186cf91177SBarry Smith #if defined(PETSC_USE_INFO) 19ae15b995SBarry Smith #define PetscInfo(A,S) PetscInfo_Private(__FUNCT__,A,S) 20ae15b995SBarry Smith #define PetscInfo1(A,S,a1) PetscInfo_Private(__FUNCT__,A,S,a1) 21ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2) PetscInfo_Private(__FUNCT__,A,S,a1,a2) 22ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3) 23ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4) 24ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5) 25ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6) 26ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6,a7) 2763ba0a88SBarry Smith #else 28ae15b995SBarry Smith #define PetscInfo(A,S) 0 29ae15b995SBarry Smith #define PetscInfo1(A,S,a1) 0 30ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2) 0 31ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3) 0 32ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4) 0 33ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 34ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 35ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 3663ba0a88SBarry Smith #endif 376cf91177SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoDeactivateClass(PetscCookie); 386cf91177SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoActivateClass(PetscCookie); 396cf91177SBarry Smith extern PetscTruth PETSC_DLLEXPORT PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 40614700edSBarry Smith 416a6a9b46SSatish Balay /* We must make these structures available if we are to access the event 426a6a9b46SSatish Balay activation flags in the PetscLogEventBegin/End() macros. If we forced a 436a6a9b46SSatish Balay function call each time, we could make these private. 446a6a9b46SSatish Balay */ 456a6a9b46SSatish Balay /* Default log */ 466a6a9b46SSatish Balay typedef struct _n_StageLog *StageLog; 476a6a9b46SSatish Balay extern PETSC_DLLEXPORT StageLog _stageLog; 486a6a9b46SSatish Balay 496a6a9b46SSatish Balay /* A simple stack (should replace) */ 506a6a9b46SSatish Balay typedef struct _n_IntStack *IntStack; 516a6a9b46SSatish Balay 526a6a9b46SSatish Balay /* The structures for logging performance */ 536a6a9b46SSatish Balay typedef struct { 546a6a9b46SSatish Balay int id; /* The integer identifying this section */ 556a6a9b46SSatish Balay PetscTruth active; /* The flag to activate logging */ 566a6a9b46SSatish Balay PetscTruth visible; /* The flag to print info in summary */ 576a6a9b46SSatish Balay int depth; /* The nesting depth of the event call */ 586a6a9b46SSatish Balay int count; /* The number of times this section was executed */ 596a6a9b46SSatish Balay PetscLogDouble flops; /* The flops used in this section */ 606a6a9b46SSatish Balay PetscLogDouble time; /* The time taken for this section */ 616a6a9b46SSatish Balay PetscLogDouble numMessages; /* The number of messages in this section */ 626a6a9b46SSatish Balay PetscLogDouble messageLength; /* The total message lengths in this section */ 636a6a9b46SSatish Balay PetscLogDouble numReductions; /* The number of reductions in this section */ 646a6a9b46SSatish Balay } EventPerfInfo; 656a6a9b46SSatish Balay 666a6a9b46SSatish Balay typedef struct { 676a6a9b46SSatish Balay int id; /* The integer identifying this class */ 686a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 696a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 706a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 716a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 726a6a9b46SSatish Balay } ClassPerfInfo; 736a6a9b46SSatish Balay 746a6a9b46SSatish Balay /* The structures for logging registration */ 756a6a9b46SSatish Balay typedef struct { 766a6a9b46SSatish Balay char *name; /* The class name */ 776a6a9b46SSatish Balay PetscCookie cookie; /* The integer identifying this class */ 786a6a9b46SSatish Balay } ClassRegInfo; 796a6a9b46SSatish Balay 806a6a9b46SSatish Balay typedef struct { 816a6a9b46SSatish Balay char *name; /* The name of this event */ 826a6a9b46SSatish Balay PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */ 836a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 846a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 856a6a9b46SSatish Balay int mpe_id_end; 866a6a9b46SSatish Balay #endif 876a6a9b46SSatish Balay } EventRegInfo; 886a6a9b46SSatish Balay 896a6a9b46SSatish Balay typedef struct _n_EventRegLog *EventRegLog; 906a6a9b46SSatish Balay struct _n_EventRegLog { 916a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 926a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 936a6a9b46SSatish Balay EventRegInfo *eventInfo; /* The registration information for each event */ 946a6a9b46SSatish Balay }; 956a6a9b46SSatish Balay 966a6a9b46SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog; 976a6a9b46SSatish Balay struct _n_EventPerfLog { 986a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 996a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 1006a6a9b46SSatish Balay EventPerfInfo *eventInfo; /* The performance information for each event */ 1016a6a9b46SSatish Balay }; 1026a6a9b46SSatish Balay 1036a6a9b46SSatish Balay /* The structure for logging class information */ 1046a6a9b46SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog; 1056a6a9b46SSatish Balay struct _n_ClassRegLog { 1066a6a9b46SSatish Balay int numClasses; /* The number of classes registered */ 1076a6a9b46SSatish Balay int maxClasses; /* The maximum number of classes */ 1086a6a9b46SSatish Balay ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 1096a6a9b46SSatish Balay }; 1106a6a9b46SSatish Balay 1116a6a9b46SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog; 1126a6a9b46SSatish Balay struct _n_ClassPerfLog { 1136a6a9b46SSatish Balay int numClasses; /* The number of logging classes */ 1146a6a9b46SSatish Balay int maxClasses; /* The maximum number of classes */ 1156a6a9b46SSatish Balay ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 1166a6a9b46SSatish Balay }; 1176a6a9b46SSatish Balay 1186a6a9b46SSatish Balay /* The structures for logging in stages */ 1196a6a9b46SSatish Balay typedef struct _StageInfo { 1206a6a9b46SSatish Balay char *name; /* The stage name */ 1216a6a9b46SSatish Balay PetscTruth used; /* The stage was pushed on this processor */ 1226a6a9b46SSatish Balay EventPerfInfo perfInfo; /* The stage performance information */ 1236a6a9b46SSatish Balay EventPerfLog eventLog; /* The event information for this stage */ 1246a6a9b46SSatish Balay ClassPerfLog classLog; /* The class information for this stage */ 1256a6a9b46SSatish Balay } StageInfo; 1266a6a9b46SSatish Balay 1276a6a9b46SSatish Balay struct _n_StageLog { 1286a6a9b46SSatish Balay /* Size information */ 1296a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 1306a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 1316a6a9b46SSatish Balay /* Runtime information */ 1326a6a9b46SSatish Balay IntStack stack; /* The stack for active stages */ 1336a6a9b46SSatish Balay int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 1346a6a9b46SSatish Balay /* Stage specific information */ 1356a6a9b46SSatish Balay StageInfo *stageInfo; /* The information for each stage */ 1366a6a9b46SSatish Balay EventRegLog eventLog; /* The registered events */ 1376a6a9b46SSatish Balay ClassRegLog classLog; /* The registered classes */ 1386a6a9b46SSatish Balay }; 1396a6a9b46SSatish Balay 140aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 141614700edSBarry Smith 142da63de55SLois Curfman McInnes /* 143da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 144da63de55SLois Curfman McInnes 145da63de55SLois Curfman McInnes For the complex numbers version, note that 146da63de55SLois Curfman McInnes 1 complex addition = 2 flops 147da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 148da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 149da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 150da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 151da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 152da63de55SLois Curfman McInnes among the various arithmetic operations. 153da63de55SLois Curfman McInnes */ 154da63de55SLois Curfman McInnes 155aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 156468ad900SMatthew Knepley #define PetscLogFlopsNoCheck(n) (_TotalFlops += (4*n),0) 1572f85c6a5SSatish Balay #define PetscLogFlops(n) 0; \ 1582f85c6a5SSatish Balay {\ 1592f85c6a5SSatish Balay PetscLogDouble _tmp_flops = (n); \ 160*dedd8130SLisandro Dalcin if (_tmp_flops < 0) { SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"PetscLogFlops: flop-count given is negative: %5.2f", _tmp_flops); } \ 1612f85c6a5SSatish Balay _TotalFlops += 4*_tmp_flops; \ 1622f85c6a5SSatish Balay } 163da63de55SLois Curfman McInnes #else 164468ad900SMatthew Knepley #define PetscLogFlopsNoCheck(n) (_TotalFlops += (n),0) 1652f85c6a5SSatish Balay #define PetscLogFlops(n) 0; \ 1662f85c6a5SSatish Balay {\ 1672f85c6a5SSatish Balay PetscLogDouble _tmp_flops = (n); \ 168*dedd8130SLisandro Dalcin if (_tmp_flops < 0) { SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"PetscLogFlops: flop-count given is negative: %5.2f", _tmp_flops); } \ 1692f85c6a5SSatish Balay _TotalFlops += _tmp_flops; \ 1702f85c6a5SSatish Balay } 171da63de55SLois Curfman McInnes #endif 17277c4ece6SBarry Smith 173aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 17477c4ece6SBarry Smith #include "mpe.h" 175ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEBegin(void); 176ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEDump(const char[]); 17735d8aa7fSBarry Smith extern PetscTruth UseMPE; 178043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \ 179335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 180a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,NULL) : 0) 181043328b6SSatish Balay 182043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \ 183335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 184a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,NULL) : 0) 185043328b6SSatish Balay 186614700edSBarry Smith #else 18752e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0 18852e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e) 0 18977c4ece6SBarry Smith #endif 19077c4ece6SBarry Smith 191ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 192ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 193ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject); 194ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject); 19577c4ece6SBarry Smith 196043328b6SSatish Balay #define PetscLogObjectParent(p,c) \ 19752e6d16bSBarry Smith ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0) 19852e6d16bSBarry Smith 199efee365bSSatish Balay #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}} 200d38fa0fbSBarry Smith #define PetscLogObjectCreate(h) ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0) 201d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h) ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0) 20252e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) (((PetscObject)(p))->mem += (m),0) 2038ba1e511SMatthew Knepley /* Initialization functions */ 204ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void); 205ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void); 206ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *); 207ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth); 208ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth); 2098ba1e511SMatthew Knepley /* General functions */ 210ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]); 211ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void); 212ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 2136849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 214ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...) PETSC_PRINTF_FORMAT_CHECK(2,3); 2158ba1e511SMatthew Knepley /* Output functions */ 216ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]); 21778392ef1SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintDetailed(MPI_Comm, const char[]); 218ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]); 2198ba1e511SMatthew Knepley /* Counter functions */ 220ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *); 2218ba1e511SMatthew Knepley /* Stage functions */ 222ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(int*, const char[]); 223ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(int); 224ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void); 225ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(int, PetscTruth); 226ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(int, PetscTruth *); 227ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(int, PetscTruth); 228ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(int, PetscTruth *); 229ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], int *); 2308ba1e511SMatthew Knepley /* Event functions */ 231ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(PetscEvent*, const char[], PetscCookie); 232ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscEvent); 233ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscEvent); 234ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscEvent, PetscTruth); 235ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie); 236ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie); 2378ba1e511SMatthew Knepley /* Class functions */ 238ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogClassRegister(PetscCookie*, const char []); 2398ba1e511SMatthew Knepley 2408ba1e511SMatthew Knepley /* Global counters */ 241ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct; 242ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct; 243ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct; 244ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct; 245ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len; 246ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len; 247ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len; 248ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len; 249ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct; 250ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct; 251ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct; 252ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct; 253ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct; 254ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_SIZE; 255ff73aad6SKris Buschelman extern PETSC_DLLEXPORT int PETSC_DUMMY_COUNT; 2568ba1e511SMatthew Knepley 25752e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 25852e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 25952e6d16bSBarry Smith (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \ 26052e6d16bSBarry Smith PetscLogEventBegin((e)+1,o1,o2,o3,o4)) 26177c4ece6SBarry Smith 26252e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 26352e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 26452e6d16bSBarry Smith (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 26552e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_BEGIN(e)) 266043328b6SSatish Balay 267b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 268043328b6SSatish Balay 26952e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 27052e6d16bSBarry Smith (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 27152e6d16bSBarry Smith (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 27252e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_END(e)) 27377c4ece6SBarry Smith 274f141ce34SMatthew Knepley /* Creation and destruction functions */ 275ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *); 276ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog); 277f141ce34SMatthew Knepley /* Registration functions */ 278ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *); 279f141ce34SMatthew Knepley /* Runtime functions */ 280ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *); 281ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int); 282ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog); 283ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *); 284ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth); 285ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *); 286ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth); 287ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *); 288ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *); 289ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *); 290ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *); 291ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *); 292ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *); 293f141ce34SMatthew Knepley 294ce85283eSBarry Smith /* 295f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 296f621e05eSBarry Smith their sizes. 297f621e05eSBarry Smith 2983c94ec11SBarry Smith This does not work for MPI-Uni because our include/mpiuni/mpi.h file 299ce85283eSBarry Smith uses macros to defined the MPI operations. 30015308354SBarry Smith 30115308354SBarry Smith It does not work correctly from HP-UX because it processes the 302bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 303b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3047c1e34a4SSatish Balay 305f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 306ce85283eSBarry Smith */ 307f35a08a5SSatish Balay #if !defined(_petsc_mpi_uni) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 30877a39924SBarry Smith /* 30977a39924SBarry Smith Logging of MPI activities 31077a39924SBarry Smith */ 31177a39924SBarry Smith #define TypeSize(buff,count,type) \ 3125e3723c6SSatish Balay (MPI_Type_size(type,&PETSC_DUMMY_SIZE) || (buff += (PetscLogDouble) ((count)*PETSC_DUMMY_SIZE),0)) 31377a39924SBarry Smith 31477a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 3155e3723c6SSatish 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)) 31615308354SBarry Smith 31777a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 3185e3723c6SSatish 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)) 31915308354SBarry Smith 3200d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 3215e3723c6SSatish Balay ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3220d4b0b6cSBarry Smith 3230d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 3245e3723c6SSatish Balay ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3250d4b0b6cSBarry Smith 3260d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3275e3723c6SSatish Balay ((isend_ct++,0) || TypeSize(isend_len,count,MPIU_SCALAR) || MPI_Start(requests)) 3280d4b0b6cSBarry Smith 329ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 3305e3723c6SSatish 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)) 33115308354SBarry Smith 33277a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 3335e3723c6SSatish 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)) 33477a39924SBarry Smith 33577a39924SBarry Smith #define MPI_Wait(request,status) \ 3365e3723c6SSatish Balay ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status)) 33777a39924SBarry Smith 33877a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 3395e3723c6SSatish Balay ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d)) 34077a39924SBarry Smith 34177a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 3425e3723c6SSatish 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)) 34377a39924SBarry Smith 34477a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 3455e3723c6SSatish Balay ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)) 3463914022bSBarry Smith 3470d4b0b6cSBarry Smith #else 3480d4b0b6cSBarry Smith 3490d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 3505e3723c6SSatish Balay (MPI_Startall(number,requests)) 3510d4b0b6cSBarry Smith 3520d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 3535e3723c6SSatish Balay (MPI_Startall(number,requests)) 3540d4b0b6cSBarry Smith 3550d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 3565e3723c6SSatish Balay (MPI_Start(requests)) 3570d4b0b6cSBarry Smith 358f35a08a5SSatish Balay #endif /* !_petsc_mpi_uni && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 359614700edSBarry Smith 360df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 361614700edSBarry Smith 362b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 363028cd4eaSSatish Balay #define PetscLogFlopsNoCheck(n) 364614700edSBarry Smith 365df8cf0b5SBarry Smith /* 366df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 367df8cf0b5SBarry Smith */ 368b0a32e0cSBarry Smith #define PetscLogMPEBegin() 0 369b0a32e0cSBarry Smith #define PetscLogMPEDump(a) 0 370614700edSBarry Smith 371b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 372b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 373614700edSBarry Smith 374b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 375b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 37661867fcfSSatish Balay #define PetscLogClassRegister(a,b) PetscCookieRegister(a) 377e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 37877c4ece6SBarry Smith 379b0a32e0cSBarry Smith #define _PetscLogPLB 0 380b0a32e0cSBarry Smith #define _PetscLogPLE 0 381b0a32e0cSBarry Smith #define _PetscLogPHC 0 382b0a32e0cSBarry Smith #define _PetscLogPHD 0 38399de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 384b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 385b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 386b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 387b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 38852e6d16bSBarry Smith #define PetscLogObjectParent(p,c) 0 389efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 39052e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 39152e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 39252e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) 0 393b0a32e0cSBarry Smith #define PetscLogDestroy() 0 394b0a32e0cSBarry Smith #define PetscLogStagePush(a) 0 395b0a32e0cSBarry Smith #define PetscLogStagePop() 0 396b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b) 0 397b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg) 0 398b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file) 0 39978392ef1SBarry Smith #define PetscLogPrintDetailed(comm,file) 0 400b0a32e0cSBarry Smith #define PetscLogBegin() 0 401b0a32e0cSBarry Smith #define PetscLogTraceBegin(file) 0 402b0a32e0cSBarry Smith #define PetscLogSet(lb,le) 0 403b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 404b0a32e0cSBarry Smith #define PetscLogDump(c) 0 405043328b6SSatish Balay #define PetscLogEventRegister(a,b,c) 0 40673fda44aSBarry Smith #define PetscLogObjects(a) 0 40773fda44aSBarry Smith #define PetscLogActions(a) 0 408ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 409ce6058e1SBarry Smith 410aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 411ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 412ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 413ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests) 414ca161407SBarry Smith 415f141ce34SMatthew Knepley /* Creation and destruction functions */ 416f141ce34SMatthew Knepley #define StageLogCreate(stageLog) 0 417f141ce34SMatthew Knepley #define StageLogDestroy(stageLog) 0 418f141ce34SMatthew Knepley /* Registration functions */ 419f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage) 0 420f141ce34SMatthew Knepley /* Runtime functions */ 421f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog) 0 422f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage) 0 423f141ce34SMatthew Knepley #define StageLogPop(stageLog) 0 424f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage) 0 425f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active) 0 426f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active) 0 427f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0 428f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0 429f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage) 0 430fad68dfaSSatish Balay #define PetscLogStageGetId(a,b) (*(b)=0,0) 431fad68dfaSSatish Balay #define PetscLogStageSetActive(a,b) 0 4326a6a9b46SSatish Balay #define PetscLogStageGetActive(a,b) 0 4336a6a9b46SSatish Balay #define PetscLogStageGetVisible(a,b) 0 4346a6a9b46SSatish Balay #define PetscLogStageSetVisible(a,b) 0 435f141ce34SMatthew Knepley 436aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4376daaf66cSBarry Smith 438043328b6SSatish Balay #define PreLoadBegin(flag,name) \ 439043328b6SSatish Balay {\ 440c4411e17SBarry Smith PetscTruth PreLoading = flag;\ 4418e58c17dSMatthew Knepley int PreLoadMax,PreLoadIt,_stageNum,_3_ierr;\ 4424dc4c822SBarry Smith _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 443043328b6SSatish Balay PreLoadMax = (int)(PreLoading);\ 444043328b6SSatish Balay PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 445e7592fafSBarry Smith for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 446435da068SBarry Smith PetscPreLoadingOn = PreLoading;\ 4476e491fe6SBarry Smith _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 4488e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4498e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4508e58c17dSMatthew Knepley } else {\ 4518e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4528e58c17dSMatthew Knepley }\ 453773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4548e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 4558e58c17dSMatthew Knepley 456043328b6SSatish Balay #define PreLoadEnd() \ 457043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 458043328b6SSatish Balay PreLoading = PETSC_FALSE;\ 459043328b6SSatish Balay }\ 460043328b6SSatish Balay } 4618e58c17dSMatthew Knepley 462043328b6SSatish Balay #define PreLoadStage(name) \ 463043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 4648e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 4658e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 4668e58c17dSMatthew Knepley } else {\ 4678e58c17dSMatthew Knepley _3_ierr = PetscLogStageRegister(&_stageNum,name);CHKERRQ(_3_ierr);\ 4688e58c17dSMatthew Knepley }\ 469773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 4708e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 471e9fa29b7SSatish Balay 472e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 47397bb86f7SLois Curfman McInnes #endif 474