197bb86f7SLois Curfman McInnes /* 27588ac45SBarry Smith Defines profile/logging in PETSc. 397bb86f7SLois Curfman McInnes */ 46524c165SJacob Faibussowitsch #ifndef 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 173ba16761SJacob Faibussowitsch #define PetscInfo(A, ...) PETSC_SUCCESS 18fa2bb9feSLisandro Dalcin #endif 19e94e781bSJacob Faibussowitsch 20*edd03b47SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 21*edd03b47SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 22*edd03b47SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 23*edd03b47SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 24*edd03b47SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 25*edd03b47SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 26*edd03b47SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 27*edd03b47SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 28*edd03b47SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 297d3de750SJacob Faibussowitsch 30e94e781bSJacob Faibussowitsch /*E 3116a05f60SBarry Smith PetscInfoCommFlag - Describes the method by which to filter information displayed by `PetscInfo()` by communicator size 32e94e781bSJacob Faibussowitsch 33667f096bSBarry Smith Values: 34d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on 358b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators) 36d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 37d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1 38e94e781bSJacob Faibussowitsch 39e94e781bSJacob Faibussowitsch Level: intermediate 40e94e781bSJacob Faibussowitsch 41667f096bSBarry Smith Note: 42667f096bSBarry Smith Used as an input for `PetscInfoSetFilterCommSelf()` 43667f096bSBarry Smith 44db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()` 45e94e781bSJacob Faibussowitsch E*/ 46e94e781bSJacob Faibussowitsch typedef enum { 47e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 48e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 49e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 50e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 51e94e781bSJacob Faibussowitsch 52e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[]; 53fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[], const char[]); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **, FILE **); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool, PetscInt, const char *const *); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *); 628b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]); 63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 66fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 67fa2bb9feSLisandro Dalcin 68b859824cSBarry Smith /*MC 69b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 70b859824cSBarry Smith code. 71b859824cSBarry Smith 72b859824cSBarry Smith Level: intermediate 73b859824cSBarry Smith 74d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStage` 75b859824cSBarry Smith M*/ 76b859824cSBarry Smith typedef int PetscLogEvent; 77b859824cSBarry Smith 78b859824cSBarry Smith /*MC 79b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 80b859824cSBarry Smith 81b859824cSBarry Smith Level: intermediate 82b859824cSBarry Smith 83d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEvent` 84b859824cSBarry Smith M*/ 85b859824cSBarry Smith typedef int PetscLogStage; 86b859824cSBarry Smith 878ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 88014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 8997bb86f7SLois Curfman McInnes 90c708d6e3SStefano Zampini /* Handle multithreading */ 91c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 92c708d6e3SStefano Zampini #if defined(__cplusplus) 93c708d6e3SStefano Zampini #define PETSC_TLS thread_local 94c708d6e3SStefano Zampini #else 95c708d6e3SStefano Zampini #define PETSC_TLS _Thread_local 96c708d6e3SStefano Zampini #endif 97c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC 98c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 99c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 100c708d6e3SStefano Zampini #else 101c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS PETSC_EXTERN 102c708d6e3SStefano Zampini #define PETSC_TLS 1033ba16761SJacob Faibussowitsch #define PetscAddLogDouble(a, b, c) ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS))) 1043ba16761SJacob Faibussowitsch #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e))) 105c708d6e3SStefano Zampini #endif 10619b02663SBarry Smith 10731d06abdSBarry Smith /* We must make the following structures available to access the event 10831d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 10931d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 110d49d4b11SBarry Smith 111fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 11231d06abdSBarry Smith */ 113aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 1146a6a9b46SSatish Balay 115c60ec953SBarry Smith /* 116aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 117c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 118c60ec953SBarry Smith how much memory they use, etc. 119c60ec953SBarry Smith 120aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 121c60ec953SBarry Smith */ 1226a6a9b46SSatish Balay typedef struct { 123c60ec953SBarry Smith char *name; /* The class name */ 124c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 125aa213bdcSJed Brown } PetscClassRegInfo; 1266a6a9b46SSatish Balay 1276a6a9b46SSatish Balay typedef struct { 1280700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1296a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1306a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1314851f57dSBarry Smith PetscLogDouble mem; /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */ 1324851f57dSBarry Smith PetscLogDouble descMem; /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */ 133aa213bdcSJed Brown } PetscClassPerfInfo; 1346a6a9b46SSatish Balay 135aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 136aa213bdcSJed Brown struct _n_PetscClassRegLog { 137c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 138c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 139aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 140c60ec953SBarry Smith }; 1416a6a9b46SSatish Balay 142aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 143aa213bdcSJed Brown struct _n_PetscClassPerfLog { 144c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 145c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 146aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 147c60ec953SBarry Smith }; 14816a05f60SBarry Smith 149c60ec953SBarry Smith /* 150aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 151c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 152c60ec953SBarry Smith much time it takes, etc. 153c60ec953SBarry Smith 154aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 155c60ec953SBarry Smith of these for each stage. 156c60ec953SBarry Smith 157c60ec953SBarry Smith */ 1586a6a9b46SSatish Balay typedef struct { 1596a6a9b46SSatish Balay char *name; /* The name of this event */ 160c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 161217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 162a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS) 163a0c7f9aaSSamuel Khuvis void *timer; /* Associated external tool timer for this event */ 164a0c7f9aaSSamuel Khuvis #endif 1656a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE) 1666a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1676a6a9b46SSatish Balay int mpe_id_end; 1686a6a9b46SSatish Balay #endif 169aa213bdcSJed Brown } PetscEventRegInfo; 1706a6a9b46SSatish Balay 171c60ec953SBarry Smith typedef struct { 172c60ec953SBarry Smith int id; /* The integer identifying this event */ 173ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 174ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 175c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 176c60ec953SBarry Smith int count; /* The number of times this event was executed */ 177c708d6e3SStefano Zampini PetscLogDouble flops; /* The flops used in this event */ 178c708d6e3SStefano Zampini PetscLogDouble flops2; /* The square of flops used in this event */ 179c708d6e3SStefano Zampini PetscLogDouble flopsTmp; /* The accumulator for flops used in this event */ 180c708d6e3SStefano Zampini PetscLogDouble time; /* The time taken for this event */ 181c708d6e3SStefano Zampini PetscLogDouble time2; /* The square of time taken for this event */ 182c708d6e3SStefano Zampini PetscLogDouble timeTmp; /* The accumulator for time taken for this event */ 183217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 184891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1855d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 186c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 187c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 188c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 189e3ed9ee7SBarry Smith PetscLogDouble memIncrease; /* How much the resident memory has increased in this event */ 190e3ed9ee7SBarry Smith PetscLogDouble mallocIncrease; /* How much the maximum malloced space has increased in this event */ 191e3ed9ee7SBarry Smith PetscLogDouble mallocSpace; /* How much the space was malloced and kept during this event */ 192e3ed9ee7SBarry Smith PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */ 193091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 194bec0b493Shannah_mairs PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */ 195bec0b493Shannah_mairs PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */ 196bec0b493Shannah_mairs PetscLogDouble CpuToGpuSize; /* The total size of CPU to GPU copies */ 197bec0b493Shannah_mairs PetscLogDouble GpuToCpuSize; /* The total size of GPU to CPU copies */ 198958c4211Shannah_mairs PetscLogDouble GpuFlops; /* The flops done on a GPU in this event */ 199958c4211Shannah_mairs PetscLogDouble GpuTime; /* The time spent on a GPU in this event */ 200bec0b493Shannah_mairs #endif 201aa213bdcSJed Brown } PetscEventPerfInfo; 202c60ec953SBarry Smith 203aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 204aa213bdcSJed Brown struct _n_PetscEventRegLog { 2056a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 2066a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 207aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 2086a6a9b46SSatish Balay }; 2096a6a9b46SSatish Balay 210aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 211aa213bdcSJed Brown struct _n_PetscEventPerfLog { 2126a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 2136a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 214aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 2156a6a9b46SSatish Balay }; 21616a05f60SBarry Smith 217c60ec953SBarry Smith /* 218aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 2196a6a9b46SSatish Balay 220aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 221c60ec953SBarry Smith */ 222aa213bdcSJed Brown typedef struct _PetscStageInfo { 2236a6a9b46SSatish Balay char *name; /* The stage name */ 224ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 225aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 226aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 227aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 228a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS) 229a0c7f9aaSSamuel Khuvis void *timer; /* Associated external tool timer for this stage */ 230a0c7f9aaSSamuel Khuvis #endif 231aa213bdcSJed Brown } PetscStageInfo; 2326a6a9b46SSatish Balay 233aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 234aa213bdcSJed Brown struct _n_PetscStageLog { 2356a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 2366a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 237aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 238aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 239aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 240aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 241aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 2426a6a9b46SSatish Balay }; 243fee518ebSJed Brown 244*edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectParent()", ) static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p) 245d71ae5a4SJacob Faibussowitsch { 2464f839811SJacob Faibussowitsch (void)o; 2474f839811SJacob Faibussowitsch (void)p; 2483ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 2494dfa11a4SJacob Faibussowitsch } 2504dfa11a4SJacob Faibussowitsch 251*edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectMemory()", ) static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m) 252d71ae5a4SJacob Faibussowitsch { 2534f839811SJacob Faibussowitsch (void)o; 2544f839811SJacob Faibussowitsch (void)m; 2553ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 2564dfa11a4SJacob Faibussowitsch } 2573bb1ff40SBarry Smith 258aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 259aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 260f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *); 261f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *); 262f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *); 263614700edSBarry Smith 264fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 26577c4ece6SBarry Smith 266aa482453SBarry Smith #if defined(PETSC_HAVE_MPE) 267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 26977c4ece6SBarry Smith #endif 27077c4ece6SBarry Smith 271014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 272014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 273014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 274014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 27577c4ece6SBarry Smith 2769566063dSJacob Faibussowitsch #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));) 2773ba16761SJacob Faibussowitsch #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : PETSC_SUCCESS) 2783ba16761SJacob Faibussowitsch #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : PETSC_SUCCESS) 2793ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 280fa2bb9feSLisandro Dalcin 2818ba1e511SMatthew Knepley /* Initialization functions */ 282bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 283014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 284bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 285014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 286014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 287014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 288fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 2899371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 290fa2bb9feSLisandro Dalcin 2918ba1e511SMatthew Knepley /* Output functions */ 292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 293f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 29531d06abdSBarry Smith 2964dd65854SConnor Ward /* Status checking functions */ 2974dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 2984dd65854SConnor Ward 299fa2bb9feSLisandro Dalcin /* Stage functions */ 300014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 302014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 304014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 308f5d6ab90SLisandro Dalcin 3098ba1e511SMatthew Knepley /* Event functions */ 310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 311217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 312fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 313fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 316c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 317c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 320014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3218c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 32213230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *); 323891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3245d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 3257a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent); 3267a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void); 3278ba1e511SMatthew Knepley 328e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 329e3ed9ee7SBarry Smith 330fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 33162872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 33262872c28SLisandro Dalcin 33362872c28SLisandro Dalcin #define PetscLogEventSync(e, comm) \ 3343ba16761SJacob Faibussowitsch ((PetscErrorCode)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? PetscLogEventSynchronize((e), (comm)) : PETSC_SUCCESS))) 33577c4ece6SBarry Smith 33652e6d16bSBarry Smith #define PetscLogEventBegin(e, o1, o2, o3, o4) \ 3373ba16761SJacob Faibussowitsch ((PetscErrorCode)((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (PetscErrorCode)(((*PetscLogPLB)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPushCurrentEvent_Internal(e)) : PETSC_SUCCESS)) 338043328b6SSatish Balay 33952e6d16bSBarry Smith #define PetscLogEventEnd(e, o1, o2, o3, o4) \ 3403ba16761SJacob Faibussowitsch ((PetscErrorCode)((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? (PetscErrorCode)(((*PetscLogPLE)((e), 0, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4))) || PetscLogPopCurrentEvent_Internal()) : PETSC_SUCCESS)) 34177c4ece6SBarry Smith 342014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *); 343014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 344003131ecSBarry Smith 345c708d6e3SStefano Zampini /* Global flop counter */ 346c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 347c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 348c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_ct; 349c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_ct; 350c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_ct; 351c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_len; 352c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_len; 353c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_len; 354c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_len; 355c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 356c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gather_ct; 357c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 358c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_ct; 359c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 360c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 361c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 362c708d6e3SStefano Zampini 363c708d6e3SStefano Zampini /* Thread local storage */ 364c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th; 365c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th; 366c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th; 367c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th; 368c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th; 369c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th; 370c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th; 371c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th; 372c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th; 373c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th; 374c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th; 375c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th; 376c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th; 377c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th; 378c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th; 379c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th; 380c708d6e3SStefano Zampini 381c708d6e3SStefano Zampini /* 382c708d6e3SStefano Zampini Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 383c708d6e3SStefano Zampini 384c708d6e3SStefano Zampini For the complex numbers version, note that 385c708d6e3SStefano Zampini 1 complex addition = 2 flops 386c708d6e3SStefano Zampini 1 complex multiplication = 6 flops, 387c708d6e3SStefano Zampini where we define 1 flop as that for a double precision scalar. We roughly approximate 388c708d6e3SStefano Zampini flop counting for complex numbers by multiplying the total flops by 4; this corresponds 389c708d6e3SStefano Zampini to the assumption that we're counting mostly additions and multiplications -- and 390c708d6e3SStefano Zampini roughly the same number of each. More accurate counting could be done by distinguishing 391c708d6e3SStefano Zampini among the various arithmetic operations. 392c708d6e3SStefano Zampini */ 393c708d6e3SStefano Zampini 394c708d6e3SStefano Zampini #if defined(PETSC_USE_COMPLEX) 395c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 4.0 396c708d6e3SStefano Zampini #else 397c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 1.0 398c708d6e3SStefano Zampini #endif 399c708d6e3SStefano Zampini 400c708d6e3SStefano Zampini /*@C 401c708d6e3SStefano Zampini PetscLogFlops - Log how many flops are performed in a calculation 402c708d6e3SStefano Zampini 403c708d6e3SStefano Zampini Input Parameter: 404c708d6e3SStefano Zampini . flops - the number of flops 405c708d6e3SStefano Zampini 406c708d6e3SStefano Zampini Level: intermediate 407c708d6e3SStefano Zampini 408c200f75eSSatish Balay Note: 409c200f75eSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 410c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 411c200f75eSSatish Balay 412c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()` 413c708d6e3SStefano Zampini @*/ 414c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 415c708d6e3SStefano Zampini { 416c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 417c708d6e3SStefano Zampini return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n); 418c708d6e3SStefano Zampini } 419c708d6e3SStefano Zampini 420ce85283eSBarry Smith /* 421f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 422f621e05eSBarry Smith their sizes. 423f621e05eSBarry Smith 424af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 425ce85283eSBarry Smith uses macros to defined the MPI operations. 42615308354SBarry Smith 42715308354SBarry Smith It does not work correctly from HP-UX because it processes the 428bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 429b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4307c1e34a4SSatish Balay 431f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 432ce85283eSBarry Smith */ 433d5bc873cSPierre Jolivet #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 43477a39924SBarry Smith /* 43577a39924SBarry Smith Logging of MPI activities 43677a39924SBarry Smith */ 437c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 438d71ae5a4SJacob Faibussowitsch { 439f12d10ccSJunchao Zhang PetscMPIInt typesize; 4405f80ce2aSJacob Faibussowitsch 4413ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4429566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 443c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize)); 444f95db71bSBarry Smith } 44577a39924SBarry Smith 446c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 447d71ae5a4SJacob Faibussowitsch { 448f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 449c708d6e3SStefano Zampini PetscLogDouble l; 4503b9284c0SMatthew G Knepley 4513ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4529566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4539566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 454c708d6e3SStefano Zampini for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize); 455c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, l); 4563b9284c0SMatthew G Knepley } 4573b9284c0SMatthew G Knepley 45872b11a25SBarry Smith /* 45972b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 46072b11a25SBarry Smith */ 461d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 462d71ae5a4SJacob Faibussowitsch { 4639371c9d4SSatish Balay PetscMPIInt size; 4649371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4659371c9d4SSatish Balay return size > 1; 46672b11a25SBarry Smith } 46772b11a25SBarry Smith 468c708d6e3SStefano Zampini #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \ 469c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPI_Irecv((buf), (count), (datatype), (source), (tag), (comm), (request))) 47015308354SBarry Smith 471c708d6e3SStefano Zampini #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \ 472c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPI_Irecv_c((buf), (count), (datatype), (source), (tag), (comm), (request))) 473c87b50c4SJunchao Zhang 474c708d6e3SStefano Zampini #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \ 475c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPI_Isend((buf), (count), (datatype), (dest), (tag), (comm), (request))) 47615308354SBarry Smith 477c708d6e3SStefano Zampini #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \ 478c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPI_Isend_c((buf), (count), (datatype), (dest), (tag), (comm), (request))) 479c87b50c4SJunchao Zhang 480c708d6e3SStefano Zampini #define MPI_Startall_irecv(count, datatype, number, requests) \ 481c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, number) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || ((number) && MPI_Startall((number), (requests)))) 4820d4b0b6cSBarry Smith 483c708d6e3SStefano Zampini #define MPI_Startall_isend(count, datatype, number, requests) \ 484c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, number) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || ((number) && MPI_Startall((number), (requests)))) 4850d4b0b6cSBarry Smith 486c708d6e3SStefano Zampini #define MPI_Start_isend(count, datatype, requests) (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_isend_len), (&petsc_isend_len_th)) || MPI_Start((requests))) 4870d4b0b6cSBarry Smith 488c708d6e3SStefano Zampini #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \ 489c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Recv((buf), (count), (datatype), (source), (tag), (comm), (status))) 49015308354SBarry Smith 491c708d6e3SStefano Zampini #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \ 492c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Recv_c((buf), (count), (datatype), (source), (tag), (comm), (status))) 493c87b50c4SJunchao Zhang 494c708d6e3SStefano Zampini #define MPI_Send(buf, count, datatype, dest, tag, comm) \ 495c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Send((buf), (count), (datatype), (dest), (tag), (comm))) 49677a39924SBarry Smith 497c708d6e3SStefano Zampini #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \ 498c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Send_c((buf), (count), (datatype), (dest), (tag), (comm))) 499c87b50c4SJunchao Zhang 500c708d6e3SStefano Zampini #define MPI_Wait(request, status) (PetscAddLogDouble(&petsc_wait_ct, &petsc_wait_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPI_Wait((request), (status))) 50177a39924SBarry Smith 502c708d6e3SStefano Zampini #define MPI_Waitany(a, b, c, d) (PetscAddLogDouble(&petsc_wait_any_ct, &petsc_wait_any_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPI_Waitany((a), (b), (c), (d))) 50377a39924SBarry Smith 504c708d6e3SStefano Zampini #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 505c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_wait_all_ct, &petsc_wait_all_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, count) || MPI_Waitall((count), (array_of_requests), (array_of_statuses))) 50677a39924SBarry Smith 507c708d6e3SStefano Zampini #define MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm) (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Allreduce((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 5083914022bSBarry Smith 509c708d6e3SStefano Zampini #define MPI_Bcast(buffer, count, datatype, root, comm) (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Bcast((buffer), (count), (datatype), (root), (comm))) 51054fe5c21SBarry Smith 511c708d6e3SStefano Zampini #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \ 512c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 513d6e4c47cSJed Brown 5143b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 515c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Alltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 5163b9284c0SMatthew G Knepley 5173b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 518c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Alltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm))) 5193b9284c0SMatthew G Knepley 520c708d6e3SStefano Zampini #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 521c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 52201faf4e4SMatthew Knepley 52301faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 524c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm))) 52501faf4e4SMatthew Knepley 52601faf4e4SMatthew Knepley #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 527c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Gather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 52801faf4e4SMatthew Knepley 52901faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 530c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Gatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm))) 53101faf4e4SMatthew Knepley 53201faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 533c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Scatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 53401faf4e4SMatthew Knepley 53501faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 536c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), &(petsc_recv_len_th)) || MPI_Scatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm))) 537f12d10ccSJunchao Zhang 538f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 539c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Ialltoall((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 540f12d10ccSJunchao Zhang 541f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 542c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || PetscMPITypeSizeComm((comm), (sendcnts), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Ialltoallv((sendbuf), (sendcnts), (sdispls), (sendtype), (recvbuf), (recvcnts), (rdispls), (recvtype), (comm), (request))) 543f12d10ccSJunchao Zhang 544f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 545c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 546f12d10ccSJunchao Zhang 547f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \ 548c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request))) 549f12d10ccSJunchao Zhang 550f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 551c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Igather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 552f12d10ccSJunchao Zhang 553f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 554c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, 1) || PetscMPITypeSize((sendcount), (sendtype), (&petsc_send_len), (&petsc_send_len_th)) || MPI_Igatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (root), (comm), (request))) 555f12d10ccSJunchao Zhang 556f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 557c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Iscatter((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 558f12d10ccSJunchao Zhang 559f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 560c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_scatter_ct, &petsc_scatter_ct_th, 1) || PetscMPITypeSize((recvcount), (recvtype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPI_Iscatterv((sendbuf), (sendcount), (displs), (sendtype), (recvbuf), (recvcount), (recvtype), (root), (comm), (request))) 561f12d10ccSJunchao Zhang 562715b587bSJunchao Zhang #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \ 563715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_send_len), (&petsc_send_len_th)) || MPIX_Send_enqueue((buf), (count), (datatype), (dest), (tag), (comm))) 564715b587bSJunchao Zhang 565715b587bSJunchao Zhang #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \ 566715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1) || PetscMPITypeSize((count), (datatype), (&petsc_recv_len), (&petsc_recv_len_th)) || MPIX_Recv_enqueue((buf), (count), (datatype), (source), (tag), (comm), (status))) 567715b587bSJunchao Zhang 568715b587bSJunchao Zhang #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \ 569715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_isend_ct, &petsc_isend_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_isend_len), &(petsc_isend_len_th)) || MPIX_Isend_enqueue((buf), (count), (datatype), (dest), (tag), (comm), (request))) 570715b587bSJunchao Zhang 571715b587bSJunchao Zhang #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \ 572715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_irecv_ct, &petsc_irecv_ct_th, 1) || PetscMPITypeSize((count), (datatype), &(petsc_irecv_len), &(petsc_irecv_len_th)) || MPIX_Irecv_enqueue((buf), (count), (datatype), (source), (tag), (comm), (request))) 573715b587bSJunchao Zhang 574715b587bSJunchao Zhang #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \ 575715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 576715b587bSJunchao Zhang 577715b587bSJunchao Zhang #define MPIX_Wait_enqueue(request, status) (PetscAddLogDouble(&petsc_wait_ct, &petsc_wait_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, 1) || MPIX_Wait_enqueue((request), (status))) 578715b587bSJunchao Zhang 579715b587bSJunchao Zhang #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \ 580715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_wait_all_ct, &petsc_wait_all_ct_th, 1) || PetscAddLogDouble(&petsc_sum_of_waits_ct, &petsc_sum_of_waits_ct_th, count) || MPIX_Waitall_enqueue((count), (array_of_requests), (array_of_statuses))) 5810d4b0b6cSBarry Smith #else 5820d4b0b6cSBarry Smith 5839371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5840d4b0b6cSBarry Smith 5859371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5860d4b0b6cSBarry Smith 5879371c9d4SSatish Balay #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests))) 5880d4b0b6cSBarry Smith 589c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 590614700edSBarry Smith 591df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 592614700edSBarry Smith 593e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 594e3ed9ee7SBarry Smith 5953ba16761SJacob Faibussowitsch #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS) 5963ba16761SJacob Faibussowitsch #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS) 597614700edSBarry Smith 5983ba16761SJacob Faibussowitsch #define PetscLogStageRegister(a, b) PETSC_SUCCESS 5993ba16761SJacob Faibussowitsch #define PetscLogStagePush(a) PETSC_SUCCESS 6003ba16761SJacob Faibussowitsch #define PetscLogStagePop() PETSC_SUCCESS 6013ba16761SJacob Faibussowitsch #define PetscLogStageSetActive(a, b) PETSC_SUCCESS 6023ba16761SJacob Faibussowitsch #define PetscLogStageGetActive(a, b) PETSC_SUCCESS 6033ba16761SJacob Faibussowitsch #define PetscLogStageGetVisible(a, b) PETSC_SUCCESS 6043ba16761SJacob Faibussowitsch #define PetscLogStageSetVisible(a, b) PETSC_SUCCESS 6053ba16761SJacob Faibussowitsch #define PetscLogStageGetId(a, b) (*(b) = 0, PETSC_SUCCESS) 606f5d6ab90SLisandro Dalcin 6073ba16761SJacob Faibussowitsch #define PetscLogEventRegister(a, b, c) PETSC_SUCCESS 6083ba16761SJacob Faibussowitsch #define PetscLogEventSetCollective(a, b) PETSC_SUCCESS 6093ba16761SJacob Faibussowitsch #define PetscLogEventIncludeClass(a) PETSC_SUCCESS 6103ba16761SJacob Faibussowitsch #define PetscLogEventExcludeClass(a) PETSC_SUCCESS 6113ba16761SJacob Faibussowitsch #define PetscLogEventActivate(a) PETSC_SUCCESS 6123ba16761SJacob Faibussowitsch #define PetscLogEventDeactivate(a) PETSC_SUCCESS 6133ba16761SJacob Faibussowitsch #define PetscLogEventDeactivatePush(a) PETSC_SUCCESS 6143ba16761SJacob Faibussowitsch #define PetscLogEventDeactivatePop(a) PETSC_SUCCESS 6153ba16761SJacob Faibussowitsch #define PetscLogEventActivateClass(a) PETSC_SUCCESS 6163ba16761SJacob Faibussowitsch #define PetscLogEventDeactivateClass(a) PETSC_SUCCESS 6173ba16761SJacob Faibussowitsch #define PetscLogEventSetActiveAll(a, b) PETSC_SUCCESS 6183ba16761SJacob Faibussowitsch #define PetscLogEventGetId(a, b) (*(b) = 0, PETSC_SUCCESS) 6193ba16761SJacob Faibussowitsch #define PetscLogEventGetPerfInfo(a, b, c) PETSC_SUCCESS 6203ba16761SJacob Faibussowitsch #define PetscLogEventSetDof(a, b, c) PETSC_SUCCESS 6213ba16761SJacob Faibussowitsch #define PetscLogEventSetError(a, b, c) PETSC_SUCCESS 62277c4ece6SBarry Smith 6233ba16761SJacob Faibussowitsch #define PetscLogPLB PETSC_SUCCESS 6243ba16761SJacob Faibussowitsch #define PetscLogPLE PETSC_SUCCESS 6253ba16761SJacob Faibussowitsch #define PetscLogPHC PETSC_SUCCESS 6263ba16761SJacob Faibussowitsch #define PetscLogPHD PETSC_SUCCESS 627f5d6ab90SLisandro Dalcin 6283ba16761SJacob Faibussowitsch #define PetscLogObjectParents(p, n, c) PETSC_SUCCESS 6293ba16761SJacob Faibussowitsch #define PetscLogObjectCreate(h) PETSC_SUCCESS 6303ba16761SJacob Faibussowitsch #define PetscLogObjectDestroy(h) PETSC_SUCCESS 6313ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 632fa2bb9feSLisandro Dalcin 6333ba16761SJacob Faibussowitsch #define PetscLogDefaultBegin() PETSC_SUCCESS 6343ba16761SJacob Faibussowitsch #define PetscLogAllBegin() PETSC_SUCCESS 6353ba16761SJacob Faibussowitsch #define PetscLogNestedBegin() PETSC_SUCCESS 6363ba16761SJacob Faibussowitsch #define PetscLogTraceBegin(file) PETSC_SUCCESS 6373ba16761SJacob Faibussowitsch #define PetscLogActions(a) PETSC_SUCCESS 6383ba16761SJacob Faibussowitsch #define PetscLogObjects(a) PETSC_SUCCESS 6393ba16761SJacob Faibussowitsch #define PetscLogSetThreshold(a, b) PETSC_SUCCESS 6403ba16761SJacob Faibussowitsch #define PetscLogSet(lb, le) PETSC_SUCCESS 6413ba16761SJacob Faibussowitsch #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, PETSC_SUCCESS) 642fa2bb9feSLisandro Dalcin 6433ba16761SJacob Faibussowitsch #define PetscLogView(viewer) PETSC_SUCCESS 6443ba16761SJacob Faibussowitsch #define PetscLogViewFromOptions() PETSC_SUCCESS 6453ba16761SJacob Faibussowitsch #define PetscLogDump(c) PETSC_SUCCESS 646fa2bb9feSLisandro Dalcin 6473ba16761SJacob Faibussowitsch #define PetscLogEventSync(e, comm) PETSC_SUCCESS 6483ba16761SJacob Faibussowitsch #define PetscLogEventBegin(e, o1, o2, o3, o4) PETSC_SUCCESS 6493ba16761SJacob Faibussowitsch #define PetscLogEventEnd(e, o1, o2, o3, o4) PETSC_SUCCESS 650ce6058e1SBarry Smith 65123c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 65223c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 65323c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 65423c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 65523c86b1bSSatish Balay 65623c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 65723c86b1bSSatish Balay 658204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 659204a6943SJed Brown do { \ 660204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 661204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 662166c7f25SBarry Smith PetscLogStage _stageNum; \ 6639566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 664204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 665204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 666204a6943SJed Brown for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 667204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading; \ 6689566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 6699566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 6709566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 6719566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 6729566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); 6738e58c17dSMatthew Knepley 674204a6943SJed Brown #define PetscPreLoadEnd() \ 6759566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 676204a6943SJed Brown PetscPreLoading = PETSC_FALSE; \ 677043328b6SSatish Balay } \ 6789371c9d4SSatish Balay } \ 6799371c9d4SSatish Balay while (0) 6808e58c17dSMatthew Knepley 6819371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 6829371c9d4SSatish Balay do { \ 6839566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 6849566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 6859566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 6869566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 6879566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 688204a6943SJed Brown } while (0) 689e9fa29b7SSatish Balay 690ad14c47eSJed Brown /* some vars for logging */ 691ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 692ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 693ad14c47eSJed Brown 694c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 695c708d6e3SStefano Zampini 696c708d6e3SStefano Zampini /* Global GPU counters */ 697c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 698c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 699c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 700c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 701c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 702c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 703c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 704c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 705c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gflops; 706c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtime; 707c708d6e3SStefano Zampini 708c708d6e3SStefano Zampini /* Thread local storage */ 709c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th; 710c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th; 711c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th; 712c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th; 713c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th; 714c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th; 715c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th; 716c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th; 717c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th; 718c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th; 719c708d6e3SStefano Zampini 720c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 721c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 722c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 723c708d6e3SStefano Zampini 724c708d6e3SStefano Zampini /*@C 725c708d6e3SStefano Zampini PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 726c708d6e3SStefano Zampini 727c708d6e3SStefano Zampini Input Parameter: 728c708d6e3SStefano Zampini . flops - the number of flops 729c708d6e3SStefano Zampini 730c200f75eSSatish Balay Level: intermediate 731c200f75eSSatish Balay 732c708d6e3SStefano Zampini Notes: 733c708d6e3SStefano Zampini To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 734c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 735c708d6e3SStefano Zampini 736c708d6e3SStefano Zampini The values are also added to the total flop count for the MPI rank that is set with `PetscLogFlops()`; hence the number of flops 737c708d6e3SStefano Zampini just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 738c708d6e3SStefano Zampini 739c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 740c708d6e3SStefano Zampini @*/ 741c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 742c708d6e3SStefano Zampini { 743c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 7443ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n)); 7453ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n)); 7463ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 747c708d6e3SStefano Zampini } 748c708d6e3SStefano Zampini 749c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 750c708d6e3SStefano Zampini { 7513ba16761SJacob Faibussowitsch return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t); 752c708d6e3SStefano Zampini } 753c708d6e3SStefano Zampini 754c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 755c708d6e3SStefano Zampini { 7563ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size); 757c708d6e3SStefano Zampini } 758c708d6e3SStefano Zampini 759c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 760c708d6e3SStefano Zampini { 7613ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size); 762c708d6e3SStefano Zampini } 763c708d6e3SStefano Zampini 764c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 765c708d6e3SStefano Zampini { 7663ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size); 767c708d6e3SStefano Zampini } 768c708d6e3SStefano Zampini 769c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 770c708d6e3SStefano Zampini { 7713ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size); 772c708d6e3SStefano Zampini } 773c708d6e3SStefano Zampini #else 774c708d6e3SStefano Zampini 7753ba16761SJacob Faibussowitsch #define PetscLogCpuToGpu(a) PETSC_SUCCESS 7763ba16761SJacob Faibussowitsch #define PetscLogGpuToCpu(a) PETSC_SUCCESS 7773ba16761SJacob Faibussowitsch #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS 7783ba16761SJacob Faibussowitsch #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS 7793ba16761SJacob Faibussowitsch #define PetscLogGpuFlops(a) PETSC_SUCCESS 7803ba16761SJacob Faibussowitsch #define PetscLogGpuTime() PETSC_SUCCESS 7813ba16761SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) PETSC_SUCCESS 7823ba16761SJacob Faibussowitsch #define PetscLogGpuTimeBegin() PETSC_SUCCESS 7833ba16761SJacob Faibussowitsch #define PetscLogGpuTimeEnd() PETSC_SUCCESS 784c708d6e3SStefano Zampini 785c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 786c708d6e3SStefano Zampini 787c708d6e3SStefano Zampini /* remove TLS defines */ 788c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS 789c708d6e3SStefano Zampini #undef PETSC_TLS 790c708d6e3SStefano Zampini 79197bb86f7SLois Curfman McInnes #endif 792