197bb86f7SLois Curfman McInnes /* 27588ac45SBarry Smith Defines profile/logging in PETSc. 397bb86f7SLois Curfman McInnes */ 426bd1501SBarry Smith #if !defined(PETSCLOG_H) 526bd1501SBarry Smith #define PETSCLOG_H 6ac09b921SBarry Smith 7aaa7dc30SBarry Smith #include <petscsys.h> 8958c4211Shannah_mairs #include <petsctime.h> 9c8d78d4dSSatish Balay 10ac09b921SBarry Smith /* SUBMANSEC = Sys */ 11ac09b921SBarry Smith 12fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 133ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4); 14fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 157d3de750SJacob Faibussowitsch #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__) 16fa2bb9feSLisandro Dalcin #else 177d3de750SJacob Faibussowitsch #define PetscInfo(A, ...) 0 18fa2bb9feSLisandro Dalcin #endif 19e94e781bSJacob Faibussowitsch 207d3de750SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 217d3de750SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 225899db6dSLisandro Dalcin #define PetscInfo3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 237d3de750SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 247d3de750SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 257d3de750SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 267d3de750SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 277d3de750SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 287d3de750SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 297d3de750SJacob Faibussowitsch 30e94e781bSJacob Faibussowitsch /*E 3187497f52SBarry Smith PetscInfoCommFlag - Describes the method by which to filter `PetscInfo()` by communicator size 32e94e781bSJacob Faibussowitsch 338b86dd2eSJacob Faibussowitsch Used as an input for `PetscInfoSetFilterCommSelf()` 34e94e781bSJacob Faibussowitsch 358b86dd2eSJacob Faibussowitsch $ `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on 368b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators) 378b86dd2eSJacob Faibussowitsch $ `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 388b86dd2eSJacob Faibussowitsch $ `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1 39e94e781bSJacob Faibussowitsch 40e94e781bSJacob Faibussowitsch Level: intermediate 41e94e781bSJacob Faibussowitsch 42db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()` 43e94e781bSJacob Faibussowitsch E*/ 44e94e781bSJacob Faibussowitsch typedef enum { 45e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 46e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 47e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 48e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 49e94e781bSJacob Faibussowitsch 50e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[]; 51fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 52fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 53e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 54e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[], const char[]); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **, FILE **); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool, PetscInt, const char *const *); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *); 608b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 64fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 65fa2bb9feSLisandro Dalcin 66b859824cSBarry Smith /*MC 67b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 68b859824cSBarry Smith code. 69b859824cSBarry Smith 70b859824cSBarry Smith Level: intermediate 71b859824cSBarry Smith 72db781477SPatrick Sanan .seealso: `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStage` 73b859824cSBarry Smith M*/ 74b859824cSBarry Smith typedef int PetscLogEvent; 75b859824cSBarry Smith 76b859824cSBarry Smith /*MC 77b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 78b859824cSBarry Smith 79b859824cSBarry Smith Level: intermediate 80b859824cSBarry Smith 81db781477SPatrick Sanan .seealso: `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEvent` 82b859824cSBarry Smith M*/ 83b859824cSBarry Smith typedef int PetscLogStage; 84b859824cSBarry Smith 858ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 86014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 8797bb86f7SLois Curfman McInnes 8819b02663SBarry Smith /* Global flop counter */ 89014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 90014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops; 9119b02663SBarry Smith 9231d06abdSBarry Smith /* We must make the following structures available to access the event 9331d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 9431d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 95d49d4b11SBarry Smith 96fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 9731d06abdSBarry Smith */ 98aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 996a6a9b46SSatish Balay 100217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 101c60ec953SBarry Smith /* 102aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 103c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 104c60ec953SBarry Smith how much memory they use, etc. 105c60ec953SBarry Smith 106aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 107c60ec953SBarry Smith */ 1086a6a9b46SSatish Balay typedef struct { 109c60ec953SBarry Smith char *name; /* The class name */ 110c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 111aa213bdcSJed Brown } PetscClassRegInfo; 1126a6a9b46SSatish Balay 1136a6a9b46SSatish Balay typedef struct { 1140700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1156a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1166a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1174851f57dSBarry Smith PetscLogDouble mem; /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */ 1184851f57dSBarry Smith PetscLogDouble descMem; /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */ 119aa213bdcSJed Brown } PetscClassPerfInfo; 1206a6a9b46SSatish Balay 121aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 122aa213bdcSJed Brown struct _n_PetscClassRegLog { 123c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 124c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 125aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 126c60ec953SBarry Smith }; 1276a6a9b46SSatish Balay 128aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 129aa213bdcSJed Brown struct _n_PetscClassPerfLog { 130c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 131c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 132aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 133c60ec953SBarry Smith }; 134c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/ 135c60ec953SBarry Smith /* 136aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 137c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 138c60ec953SBarry Smith much time it takes, etc. 139c60ec953SBarry Smith 140aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 141c60ec953SBarry Smith of these for each stage. 142c60ec953SBarry Smith 143c60ec953SBarry Smith */ 1446a6a9b46SSatish Balay typedef struct { 1456a6a9b46SSatish Balay char *name; /* The name of this event */ 146c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 147217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 1486a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE) 1496a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1506a6a9b46SSatish Balay int mpe_id_end; 1516a6a9b46SSatish Balay #endif 152aa213bdcSJed Brown } PetscEventRegInfo; 1536a6a9b46SSatish Balay 154c60ec953SBarry Smith typedef struct { 155c60ec953SBarry Smith int id; /* The integer identifying this event */ 156ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 157ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 158c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 159c60ec953SBarry Smith int count; /* The number of times this event was executed */ 160a42e5b54SMatthew G Knepley PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */ 161a42e5b54SMatthew G Knepley PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 162217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 163891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1645d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 165c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 166c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 167c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 168e3ed9ee7SBarry Smith PetscLogDouble memIncrease; /* How much the resident memory has increased in this event */ 169e3ed9ee7SBarry Smith PetscLogDouble mallocIncrease; /* How much the maximum malloced space has increased in this event */ 170e3ed9ee7SBarry Smith PetscLogDouble mallocSpace; /* How much the space was malloced and kept during this event */ 171e3ed9ee7SBarry Smith PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */ 172091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 173bec0b493Shannah_mairs PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */ 174bec0b493Shannah_mairs PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */ 175bec0b493Shannah_mairs PetscLogDouble CpuToGpuSize; /* The total size of CPU to GPU copies */ 176bec0b493Shannah_mairs PetscLogDouble GpuToCpuSize; /* The total size of GPU to CPU copies */ 177958c4211Shannah_mairs PetscLogDouble GpuFlops; /* The flops done on a GPU in this event */ 178958c4211Shannah_mairs PetscLogDouble GpuTime; /* The time spent on a GPU in this event */ 179bec0b493Shannah_mairs #endif 180aa213bdcSJed Brown } PetscEventPerfInfo; 181c60ec953SBarry Smith 182aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 183aa213bdcSJed Brown struct _n_PetscEventRegLog { 1846a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1856a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 186aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1876a6a9b46SSatish Balay }; 1886a6a9b46SSatish Balay 189aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 190aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1916a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1926a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 193aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 1946a6a9b46SSatish Balay }; 195c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/ 196c60ec953SBarry Smith /* 197aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 1986a6a9b46SSatish Balay 199aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 200c60ec953SBarry Smith */ 201aa213bdcSJed Brown typedef struct _PetscStageInfo { 2026a6a9b46SSatish Balay char *name; /* The stage name */ 203ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 204aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 205aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 206aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 207aa213bdcSJed Brown } PetscStageInfo; 2086a6a9b46SSatish Balay 209aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 210aa213bdcSJed Brown struct _n_PetscStageLog { 2116a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 2126a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 213aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 214aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 215aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 216aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 217aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 2186a6a9b46SSatish Balay }; 219217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 220fee518ebSJed Brown 221*4dfa11a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectParent() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p) { 222*4dfa11a4SJacob Faibussowitsch return 0; 223*4dfa11a4SJacob Faibussowitsch } 224*4dfa11a4SJacob Faibussowitsch 225*4dfa11a4SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION("PetscLogObjectMemory() is deprecated (since version 3.18)") static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m) { 226*4dfa11a4SJacob Faibussowitsch return 0; 227*4dfa11a4SJacob Faibussowitsch } 2283bb1ff40SBarry Smith 229aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 230aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 231f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *); 232f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *); 233f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *); 234614700edSBarry Smith 235da63de55SLois Curfman McInnes /* 236da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 237da63de55SLois Curfman McInnes 238da63de55SLois Curfman McInnes For the complex numbers version, note that 239da63de55SLois Curfman McInnes 1 complex addition = 2 flops 240da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 241da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 242da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 243da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 244da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 245da63de55SLois Curfman McInnes among the various arithmetic operations. 246da63de55SLois Curfman McInnes */ 247da63de55SLois Curfman McInnes 248aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 249542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 250da63de55SLois Curfman McInnes #else 251542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 252bf3909cdSBarry Smith #endif 253bf3909cdSBarry Smith 254f8bfbb56SSatish Balay /*@C 255ca0c957dSBarry Smith PetscLogFlops - Log how many flops are performed in a calculation 256ca0c957dSBarry Smith 257c3b874c4SJose E. Roman Input Parameter: 258c3b874c4SJose E. Roman . flops - the number of flops 259ca0c957dSBarry Smith 260ca0c957dSBarry Smith Notes: 261ca0c957dSBarry Smith To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 262ca0c957dSBarry Smith not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 263ca0c957dSBarry Smith 264ca0c957dSBarry Smith Level: intermediate 265ca0c957dSBarry Smith 266db781477SPatrick Sanan .seealso: `PetscLogView()`, `PetscLogGpuFlops()` 267ca0c957dSBarry Smith @*/ 268ca0c957dSBarry Smith 2699371c9d4SSatish Balay static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) { 270dd19b90bSBarry Smith PetscFunctionBegin; 271bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 2722c71b3e2SJacob Faibussowitsch PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 273da63de55SLois Curfman McInnes #endif 274dd19b90bSBarry Smith petsc_TotalFlops += PETSC_FLOPS_PER_OP * n; 275dd19b90bSBarry Smith PetscFunctionReturn(0); 276dd19b90bSBarry Smith } 277fa2bb9feSLisandro Dalcin 278fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 27977c4ece6SBarry Smith 280aa482453SBarry Smith #if defined(PETSC_HAVE_MPE) 281014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 282014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 28377c4ece6SBarry Smith #endif 28477c4ece6SBarry Smith 285014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 286014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 287014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 288014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 28977c4ece6SBarry Smith 2909566063dSJacob Faibussowitsch #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));) 291fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0) 292fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0) 2933ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 294fa2bb9feSLisandro Dalcin 2958ba1e511SMatthew Knepley /* Initialization functions */ 296bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 298bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 299014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 300014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 302fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 3039371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 304fa2bb9feSLisandro Dalcin 3058ba1e511SMatthew Knepley /* Output functions */ 306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 307f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 308014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 30931d06abdSBarry Smith 3104dd65854SConnor Ward /* Status checking functions */ 3114dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 3124dd65854SConnor Ward 313fa2bb9feSLisandro Dalcin /* Stage functions */ 314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 321014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 322f5d6ab90SLisandro Dalcin 3238ba1e511SMatthew Knepley /* Event functions */ 324014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 325217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 326fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 327fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 328014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 329014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 330c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 331c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 332014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 333014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 334014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3358c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 33613230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *); 337891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3385d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 3397a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent); 3407a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void); 3418ba1e511SMatthew Knepley 3428ba1e511SMatthew Knepley /* Global counters */ 343014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 344014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct; 345014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct; 346014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct; 347014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len; 348014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len; 349014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len; 350014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len; 351014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 352014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct; 353014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 354014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct; 355014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 356014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 357014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 3588ba1e511SMatthew Knepley 359e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 360e3ed9ee7SBarry Smith 361fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 36262872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 36362872c28SLisandro Dalcin 36462872c28SLisandro Dalcin #define PetscLogEventSync(e, comm) \ 3659371c9d4SSatish Balay (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? PetscLogEventSynchronize((e), (comm)) : 0)) 36677c4ece6SBarry Smith 36752e6d16bSBarry Smith #define PetscLogEventBegin(e, o1, o2, o3, o4) \ 3689371c9d4SSatish Balay ((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (((*PetscLogPLB)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPushCurrentEvent_Internal(e)) : 0) 369043328b6SSatish Balay 37052e6d16bSBarry Smith #define PetscLogEventEnd(e, o1, o2, o3, o4) \ 3719371c9d4SSatish Balay ((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (((*PetscLogPLE)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPopCurrentEvent_Internal()) : 0) 37277c4ece6SBarry Smith 373014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *); 374014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 375003131ecSBarry Smith 376ce85283eSBarry Smith /* 377f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 378f621e05eSBarry Smith their sizes. 379f621e05eSBarry Smith 380af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 381ce85283eSBarry Smith uses macros to defined the MPI operations. 38215308354SBarry Smith 38315308354SBarry Smith It does not work correctly from HP-UX because it processes the 384bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 385b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3867c1e34a4SSatish Balay 387f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 388ce85283eSBarry Smith */ 389c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined(PETSC_HAVE_MPI_MISSING_TYPESIZE) 39077a39924SBarry Smith /* 39177a39924SBarry Smith Logging of MPI activities 39277a39924SBarry Smith */ 3939371c9d4SSatish Balay static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length) { 394f12d10ccSJunchao Zhang PetscMPIInt typesize; 3955f80ce2aSJacob Faibussowitsch 3967d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 3979566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 398f12d10ccSJunchao Zhang *length += (PetscLogDouble)(count * typesize); 3999c72ff1eSSatish Balay return 0; 400f95db71bSBarry Smith } 40177a39924SBarry Smith 4029371c9d4SSatish Balay static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length) { 403f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 4043b9284c0SMatthew G Knepley 4057d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 4069566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4079566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 4085f80ce2aSJacob Faibussowitsch for (p = 0; p < size; ++p) *length += (PetscLogDouble)(counts[p] * typesize); 409f12d10ccSJunchao Zhang return 0; 410f12d10ccSJunchao Zhang } 411f12d10ccSJunchao Zhang 4129371c9d4SSatish Balay static inline PetscErrorCode PetscMPITypeSizeCount(PetscInt n, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length) { 413f12d10ccSJunchao Zhang PetscMPIInt typesize, p; 414f12d10ccSJunchao Zhang 415f12d10ccSJunchao Zhang if (type == MPI_DATATYPE_NULL) return 0; 4169566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 4175f80ce2aSJacob Faibussowitsch for (p = 0; p < n; ++p) *length += (PetscLogDouble)(counts[p] * typesize); 4183b9284c0SMatthew G Knepley return 0; 4193b9284c0SMatthew G Knepley } 4203b9284c0SMatthew G Knepley 42172b11a25SBarry Smith /* 42272b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 42372b11a25SBarry Smith */ 4249371c9d4SSatish Balay static inline int PetscMPIParallelComm(MPI_Comm comm) { 4259371c9d4SSatish Balay PetscMPIInt size; 4269371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4279371c9d4SSatish Balay return size > 1; 42872b11a25SBarry Smith } 42972b11a25SBarry Smith 4309371c9d4SSatish Balay #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) ((petsc_irecv_ct++, 0) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len)) || MPI_Irecv((buf), (count), (datatype), (source), (tag), (comm), (request))) 43115308354SBarry Smith 4329371c9d4SSatish Balay #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) ((petsc_irecv_ct++, 0) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len)) || MPI_Irecv_c((buf), (count), (datatype), (source), (tag), (comm), (request))) 433c87b50c4SJunchao Zhang 4349371c9d4SSatish Balay #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) ((petsc_isend_ct++, 0) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len)) || MPI_Isend((buf), (count), (datatype), (dest), (tag), (comm), (request))) 43515308354SBarry Smith 4369371c9d4SSatish Balay #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) ((petsc_isend_ct++, 0) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len)) || MPI_Isend_c((buf), (count), (datatype), (dest), (tag), (comm), (request))) 437c87b50c4SJunchao Zhang 4389371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((petsc_irecv_ct += (PetscLogDouble)(number), 0) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len)) || ((number) && MPI_Startall((number), (requests)))) 4390d4b0b6cSBarry Smith 4409371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((petsc_isend_ct += (PetscLogDouble)(number), 0) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len)) || ((number) && MPI_Startall((number), (requests)))) 4410d4b0b6cSBarry Smith 4429371c9d4SSatish Balay #define MPI_Start_isend(count, datatype, requests) ((petsc_isend_ct++, 0) || PetscMPITypeSize((count), (datatype), (&petsc_isend_len)) || MPI_Start((requests))) 4430d4b0b6cSBarry Smith 4449371c9d4SSatish Balay #define MPI_Recv(buf, count, datatype, source, tag, comm, status) ((petsc_recv_ct++, 0) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len)) || MPI_Recv((buf), (count), (datatype), (source), (tag), (comm), (status))) 44515308354SBarry Smith 4469371c9d4SSatish Balay #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) ((petsc_recv_ct++, 0) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len)) || MPI_Recv_c((buf), (count), (datatype), (source), (tag), (comm), (status))) 447c87b50c4SJunchao Zhang 4489371c9d4SSatish Balay #define MPI_Send(buf, count, datatype, dest, tag, comm) ((petsc_send_ct++, 0) || PetscMPITypeSize((count), (datatype), (&petsc_send_len)) || MPI_Send((buf), (count), (datatype), (dest), (tag), (comm))) 44977a39924SBarry Smith 4509371c9d4SSatish Balay #define MPI_Send_c(buf, count, datatype, dest, tag, comm) ((petsc_send_ct++, 0) || PetscMPITypeSize((count), (datatype), (&petsc_send_len)) || MPI_Send_c((buf), (count), (datatype), (dest), (tag), (comm))) 451c87b50c4SJunchao Zhang 4529371c9d4SSatish Balay #define MPI_Wait(request, status) ((petsc_wait_ct++, petsc_sum_of_waits_ct++, 0) || MPI_Wait((request), (status))) 45377a39924SBarry Smith 4549371c9d4SSatish Balay #define MPI_Waitany(a, b, c, d) ((petsc_wait_any_ct++, petsc_sum_of_waits_ct++, 0) || MPI_Waitany((a), (b), (c), (d))) 45577a39924SBarry Smith 4569371c9d4SSatish Balay #define MPI_Waitall(count, array_of_requests, array_of_statuses) ((petsc_wait_all_ct++, petsc_sum_of_waits_ct += (PetscLogDouble)(count), 0) || MPI_Waitall((count), (array_of_requests), (array_of_statuses))) 45777a39924SBarry Smith 4589371c9d4SSatish Balay #define MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm) (petsc_allreduce_ct += PetscMPIParallelComm((comm)), MPI_Allreduce((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 4593914022bSBarry Smith 4609371c9d4SSatish Balay #define MPI_Bcast(buffer, count, datatype, root, comm) ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || MPI_Bcast((buffer), (count), (datatype), (root), (comm))) 46154fe5c21SBarry Smith 4629371c9d4SSatish Balay #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 463d6e4c47cSJed Brown 4643b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 465f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Alltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 4663b9284c0SMatthew G Knepley 4673b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 468f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len)) || MPI_Alltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm))) 4693b9284c0SMatthew G Knepley 4709371c9d4SSatish Balay #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) ((petsc_gather_ct += PetscMPIParallelComm((comm)), 0) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 47101faf4e4SMatthew Knepley 47201faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 4735fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)), 0) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm))) 47401faf4e4SMatthew Knepley 47501faf4e4SMatthew Knepley #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 476f12d10ccSJunchao Zhang ((petsc_gather_ct++, 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Gather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 47701faf4e4SMatthew Knepley 47801faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 479f12d10ccSJunchao Zhang ((petsc_gather_ct++, 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Gatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm))) 48001faf4e4SMatthew Knepley 48101faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 482f12d10ccSJunchao Zhang ((petsc_scatter_ct++, 0) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len)) || MPI_Scatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 48301faf4e4SMatthew Knepley 48401faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 485f12d10ccSJunchao Zhang ((petsc_scatter_ct++, 0) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len)) || MPI_Scatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 486f12d10ccSJunchao Zhang 487f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 488f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Ialltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 489f12d10ccSJunchao Zhang 490f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 491f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)), 0) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len)) || MPI_Ialltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm), (request))) 492f12d10ccSJunchao Zhang 493f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 494f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)), 0) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 495f12d10ccSJunchao Zhang 496f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \ 497f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)), 0) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request))) 498f12d10ccSJunchao Zhang 499f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 500f12d10ccSJunchao Zhang ((petsc_gather_ct++, 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Igather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 501f12d10ccSJunchao Zhang 502f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 503f12d10ccSJunchao Zhang ((petsc_gather_ct++, 0) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len)) || MPI_Igatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm), (request))) 504f12d10ccSJunchao Zhang 505f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 506f12d10ccSJunchao Zhang ((petsc_scatter_ct++, 0) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len)) || MPI_Iscatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 507f12d10ccSJunchao Zhang 508f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 509f12d10ccSJunchao Zhang ((petsc_scatter_ct++, 0) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len)) || MPI_Iscatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 510f12d10ccSJunchao Zhang 5110d4b0b6cSBarry Smith #else 5120d4b0b6cSBarry Smith 5139371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5140d4b0b6cSBarry Smith 5159371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5160d4b0b6cSBarry Smith 5179371c9d4SSatish Balay #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests))) 5180d4b0b6cSBarry Smith 519c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 520614700edSBarry Smith 521df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 522614700edSBarry Smith 523e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 524e3ed9ee7SBarry Smith 525b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 526fa2bb9feSLisandro Dalcin #define PetscGetFlops(a) (*(a) = 0.0, 0) 527614700edSBarry Smith 528fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a, b) 0 529fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a) 0 530fa2bb9feSLisandro Dalcin #define PetscLogStagePop() 0 531f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a, b) 0 532f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a, b) 0 533f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a, b) 0 534f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a, b) 0 535f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a, b) (*(b) = 0, 0) 536f5d6ab90SLisandro Dalcin 537fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a, b, c) 0 538fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a, b) 0 539fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a) 0 540fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a) 0 541b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 542b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 543c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a) 0 544c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a) 0 545b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 546b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 547e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a, b) 0 54846eb3cd7SSatish Balay #define PetscLogEventGetId(a, b) (*(b) = 0, 0) 549561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a, b, c) 0 5509c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a, b, c) 0 5519c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a, b, c) 0 55277c4ece6SBarry Smith 5538b5db460SBarry Smith #define PetscLogPLB 0 5548b5db460SBarry Smith #define PetscLogPLE 0 5558b5db460SBarry Smith #define PetscLogPHC 0 5568b5db460SBarry Smith #define PetscLogPHD 0 557f5d6ab90SLisandro Dalcin 558efee365bSSatish Balay #define PetscLogObjectParents(p, n, c) 0 55952e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 56052e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 5613ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 562fa2bb9feSLisandro Dalcin 563bb1d7374SBarry Smith #define PetscLogDefaultBegin() 0 564b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 565bb1d7374SBarry Smith #define PetscLogNestedBegin() 0 566fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file) 0 56773fda44aSBarry Smith #define PetscLogActions(a) 0 568fa2bb9feSLisandro Dalcin #define PetscLogObjects(a) 0 569fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a, b) 0 570fa2bb9feSLisandro Dalcin #define PetscLogSet(lb, le) 0 571340002ceSLawrence Mitchell #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, 0) 572fa2bb9feSLisandro Dalcin 573fa2bb9feSLisandro Dalcin #define PetscLogView(viewer) 0 574fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions() 0 575fa2bb9feSLisandro Dalcin #define PetscLogDump(c) 0 576fa2bb9feSLisandro Dalcin 57762872c28SLisandro Dalcin #define PetscLogEventSync(e, comm) 0 578fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e, o1, o2, o3, o4) 0 579fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e, o1, o2, o3, o4) 0 580ce6058e1SBarry Smith 58123c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 58223c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 58323c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 58423c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 58523c86b1bSSatish Balay 58623c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 58723c86b1bSSatish Balay 58823c86b1bSSatish Balay #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 58923c86b1bSSatish Balay 59023c86b1bSSatish Balay /* Global GPU counters */ 59123c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 59223c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 59323c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 59423c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 59523c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 59623c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 59723c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 59823c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 59923c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gflops; 60023c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtime; 60123c86b1bSSatish Balay 6029371c9d4SSatish Balay static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) { 60323c86b1bSSatish Balay PetscFunctionBegin; 60423c86b1bSSatish Balay petsc_ctog_ct += 1; 60523c86b1bSSatish Balay petsc_ctog_sz += size; 60623c86b1bSSatish Balay PetscFunctionReturn(0); 60723c86b1bSSatish Balay } 60823c86b1bSSatish Balay 6099371c9d4SSatish Balay static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) { 61023c86b1bSSatish Balay PetscFunctionBegin; 61123c86b1bSSatish Balay petsc_gtoc_ct += 1; 61223c86b1bSSatish Balay petsc_gtoc_sz += size; 61323c86b1bSSatish Balay PetscFunctionReturn(0); 61423c86b1bSSatish Balay } 61523c86b1bSSatish Balay 6169371c9d4SSatish Balay static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) { 61723c86b1bSSatish Balay PetscFunctionBegin; 61823c86b1bSSatish Balay petsc_ctog_ct_scalar += 1; 61923c86b1bSSatish Balay petsc_ctog_sz_scalar += size; 62023c86b1bSSatish Balay PetscFunctionReturn(0); 62123c86b1bSSatish Balay } 62223c86b1bSSatish Balay 6239371c9d4SSatish Balay static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) { 62423c86b1bSSatish Balay PetscFunctionBegin; 62523c86b1bSSatish Balay petsc_gtoc_ct_scalar += 1; 62623c86b1bSSatish Balay petsc_gtoc_sz_scalar += size; 62723c86b1bSSatish Balay PetscFunctionReturn(0); 62823c86b1bSSatish Balay } 62923c86b1bSSatish Balay 63023c86b1bSSatish Balay /*@C 63123c86b1bSSatish Balay PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 63223c86b1bSSatish Balay 63323c86b1bSSatish Balay Input Parameter: 63423c86b1bSSatish Balay . flops - the number of flops 63523c86b1bSSatish Balay 63623c86b1bSSatish Balay Notes: 63723c86b1bSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 63823c86b1bSSatish Balay not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 63923c86b1bSSatish Balay 6404851f57dSBarry Smith The values are also added to the total flop count for the MPI rank that is set with `PetscLogFlops()`; hence the number of flops 6414851f57dSBarry Smith just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 6424851f57dSBarry Smith 64323c86b1bSSatish Balay Level: intermediate 64423c86b1bSSatish Balay 645db781477SPatrick Sanan .seealso: `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 64623c86b1bSSatish Balay @*/ 6479371c9d4SSatish Balay static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) { 64823c86b1bSSatish Balay PetscFunctionBegin; 6492c71b3e2SJacob Faibussowitsch PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 65023c86b1bSSatish Balay petsc_TotalFlops += PETSC_FLOPS_PER_OP * n; 65123c86b1bSSatish Balay petsc_gflops += PETSC_FLOPS_PER_OP * n; 65223c86b1bSSatish Balay PetscFunctionReturn(0); 65323c86b1bSSatish Balay } 65423c86b1bSSatish Balay 6559371c9d4SSatish Balay static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) { 65623c86b1bSSatish Balay PetscFunctionBegin; 65723c86b1bSSatish Balay petsc_gtime += t; 65823c86b1bSSatish Balay PetscFunctionReturn(0); 65923c86b1bSSatish Balay } 66023c86b1bSSatish Balay 661156b51fbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 66223c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 66323c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 66423c86b1bSSatish Balay 66523c86b1bSSatish Balay #else 66623c86b1bSSatish Balay 6678157aad8SJunchao Zhang #define PetscLogCpuToGpu(a) 0 6688157aad8SJunchao Zhang #define PetscLogGpuToCpu(a) 0 66945c4b7c1SBarry Smith #define PetscLogCpuToGpuScalar(a) 0 67045c4b7c1SBarry Smith #define PetscLogGpuToCpuScalar(a) 0 6718157aad8SJunchao Zhang #define PetscLogGpuFlops(a) 0 6727a101e5eSJacob Faibussowitsch #define PetscLogGpuTime() 0 67353b96e71SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) 0 6748157aad8SJunchao Zhang #define PetscLogGpuTimeBegin() 0 6758157aad8SJunchao Zhang #define PetscLogGpuTimeEnd() 0 6768157aad8SJunchao Zhang 67723c86b1bSSatish Balay #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 6786daaf66cSBarry Smith 679204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 680204a6943SJed Brown do { \ 681204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 682204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 683166c7f25SBarry Smith PetscLogStage _stageNum; \ 6849566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 685204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 686204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 687204a6943SJed Brown for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 688204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading; \ 6899566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 6909566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 6919566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 6929566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 6939566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); 6948e58c17dSMatthew Knepley 695204a6943SJed Brown #define PetscPreLoadEnd() \ 6969566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 697204a6943SJed Brown PetscPreLoading = PETSC_FALSE; \ 698043328b6SSatish Balay } \ 6999371c9d4SSatish Balay } \ 7009371c9d4SSatish Balay while (0) 7018e58c17dSMatthew Knepley 7029371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 7039371c9d4SSatish Balay do { \ 7049566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 7059566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 7069566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 7079566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 7089566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 709204a6943SJed Brown } while (0) 710e9fa29b7SSatish Balay 711ad14c47eSJed Brown /* some vars for logging */ 712ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 713ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 714ad14c47eSJed Brown 71597bb86f7SLois Curfman McInnes #endif 716