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> 9*1c1ad86eSToby Isaac #include <petsclogtypes.h> 10c8d78d4dSSatish Balay 11*1c1ad86eSToby Isaac /* SUBMANSEC = Profiling */ 12ac09b921SBarry Smith 13fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 143ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4); 15fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 167d3de750SJacob Faibussowitsch #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__) 17fa2bb9feSLisandro Dalcin #else 183ba16761SJacob Faibussowitsch #define PetscInfo(A, ...) PETSC_SUCCESS 19fa2bb9feSLisandro Dalcin #endif 20e94e781bSJacob Faibussowitsch 21edd03b47SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 22edd03b47SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 23edd03b47SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 24edd03b47SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 25edd03b47SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 26edd03b47SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 27edd03b47SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 28edd03b47SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 29edd03b47SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 307d3de750SJacob Faibussowitsch 31e94e781bSJacob Faibussowitsch /*E 3216a05f60SBarry Smith PetscInfoCommFlag - Describes the method by which to filter information displayed by `PetscInfo()` by communicator size 33e94e781bSJacob Faibussowitsch 34667f096bSBarry Smith Values: 35d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on 368b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators) 37d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 38d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1 39e94e781bSJacob Faibussowitsch 40e94e781bSJacob Faibussowitsch Level: intermediate 41e94e781bSJacob Faibussowitsch 42667f096bSBarry Smith Note: 43667f096bSBarry Smith Used as an input for `PetscInfoSetFilterCommSelf()` 44667f096bSBarry Smith 45db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()` 46e94e781bSJacob Faibussowitsch E*/ 47e94e781bSJacob Faibussowitsch typedef enum { 48e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 49e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 50e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 51e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 52e94e781bSJacob Faibussowitsch 53e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[]; 54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 55fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[], const char[]); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **, FILE **); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool, PetscInt, const char *const *); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *); 638b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]); 64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 67fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 68fa2bb9feSLisandro Dalcin 698ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 70014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 7197bb86f7SLois Curfman McInnes 72*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *); 73*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack); 74*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int); 75*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *); 76*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *); 77*1c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool *); 78*1c1ad86eSToby Isaac 79c708d6e3SStefano Zampini /* Handle multithreading */ 80c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 81c708d6e3SStefano Zampini #if defined(__cplusplus) 82c708d6e3SStefano Zampini #define PETSC_TLS thread_local 83c708d6e3SStefano Zampini #else 84c708d6e3SStefano Zampini #define PETSC_TLS _Thread_local 85c708d6e3SStefano Zampini #endif 86c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC 87c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 88c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 89c708d6e3SStefano Zampini #else 90c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS PETSC_EXTERN 91c708d6e3SStefano Zampini #define PETSC_TLS 923ba16761SJacob Faibussowitsch #define PetscAddLogDouble(a, b, c) ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS))) 933ba16761SJacob Faibussowitsch #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e))) 94c708d6e3SStefano Zampini #endif 9519b02663SBarry Smith 96c60ec953SBarry Smith /* 97aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 98c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 99c60ec953SBarry Smith how much memory they use, etc. 100c60ec953SBarry Smith 101aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 102c60ec953SBarry Smith */ 1036a6a9b46SSatish Balay typedef struct { 104c60ec953SBarry Smith char *name; /* The class name */ 105c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 106aa213bdcSJed Brown } PetscClassRegInfo; 1076a6a9b46SSatish Balay 1086a6a9b46SSatish Balay typedef struct { 1090700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1106a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1116a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1124851f57dSBarry Smith PetscLogDouble mem; /* The total memory allocated by objects of this class; this is completely wrong and should possibly be removed */ 1134851f57dSBarry Smith PetscLogDouble descMem; /* The total memory allocated by descendents of these objects; this is completely wrong and should possibly be removed */ 114aa213bdcSJed Brown } PetscClassPerfInfo; 1156a6a9b46SSatish Balay 116aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 117aa213bdcSJed Brown struct _n_PetscClassRegLog { 118c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 119c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 120aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 121c60ec953SBarry Smith }; 1226a6a9b46SSatish Balay 123aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 124aa213bdcSJed Brown struct _n_PetscClassPerfLog { 125c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 126c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 127aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 128c60ec953SBarry Smith }; 12916a05f60SBarry Smith 130c60ec953SBarry Smith /* 131aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 132c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 133c60ec953SBarry Smith much time it takes, etc. 134c60ec953SBarry Smith 135aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 136c60ec953SBarry Smith of these for each stage. 137c60ec953SBarry Smith 138c60ec953SBarry Smith */ 1396a6a9b46SSatish Balay typedef struct { 1406a6a9b46SSatish Balay char *name; /* The name of this event */ 141c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 142217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 143a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS) 144a0c7f9aaSSamuel Khuvis void *timer; /* Associated external tool timer for this event */ 145a0c7f9aaSSamuel Khuvis #endif 1466a6a9b46SSatish Balay #if defined(PETSC_HAVE_MPE) 1476a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1486a6a9b46SSatish Balay int mpe_id_end; 1496a6a9b46SSatish Balay #endif 150aa213bdcSJed Brown } PetscEventRegInfo; 1516a6a9b46SSatish Balay 152aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 153aa213bdcSJed Brown struct _n_PetscEventRegLog { 1546a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1556a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 156aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1576a6a9b46SSatish Balay }; 1586a6a9b46SSatish Balay 159aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 160aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1616a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1626a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 163aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 1646a6a9b46SSatish Balay }; 16516a05f60SBarry Smith 166c60ec953SBarry Smith /* 167aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 1686a6a9b46SSatish Balay 169aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 170c60ec953SBarry Smith */ 171aa213bdcSJed Brown typedef struct _PetscStageInfo { 1726a6a9b46SSatish Balay char *name; /* The stage name */ 173ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 174aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 175aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 176aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 177a0c7f9aaSSamuel Khuvis #if defined(PETSC_HAVE_TAU_PERFSTUBS) 178a0c7f9aaSSamuel Khuvis void *timer; /* Associated external tool timer for this stage */ 179a0c7f9aaSSamuel Khuvis #endif 180aa213bdcSJed Brown } PetscStageInfo; 1816a6a9b46SSatish Balay 182aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 183aa213bdcSJed Brown struct _n_PetscStageLog { 1846a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 1856a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 186aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 187aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 188aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 189aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 190aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 1916a6a9b46SSatish Balay }; 192fee518ebSJed Brown 193edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectParent()", ) static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p) 194d71ae5a4SJacob Faibussowitsch { 1954f839811SJacob Faibussowitsch (void)o; 1964f839811SJacob Faibussowitsch (void)p; 1973ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1984dfa11a4SJacob Faibussowitsch } 1994dfa11a4SJacob Faibussowitsch 200edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectMemory()", ) static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m) 201d71ae5a4SJacob Faibussowitsch { 2024f839811SJacob Faibussowitsch (void)o; 2034f839811SJacob Faibussowitsch (void)m; 2043ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 2054dfa11a4SJacob Faibussowitsch } 2063bb1ff40SBarry Smith 207aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 208aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 209f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog *); 210f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog, int *); 211f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog, int, PetscEventPerfLog *); 212614700edSBarry Smith 213fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 21477c4ece6SBarry Smith 215aa482453SBarry Smith #if defined(PETSC_HAVE_MPE) 216014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 217014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 21877c4ece6SBarry Smith #endif 21977c4ece6SBarry Smith 220014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 221014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 222014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 223014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 22477c4ece6SBarry Smith 2259566063dSJacob Faibussowitsch #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));) 2263ba16761SJacob Faibussowitsch #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : PETSC_SUCCESS) 2273ba16761SJacob Faibussowitsch #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : PETSC_SUCCESS) 2283ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 229fa2bb9feSLisandro Dalcin 2308ba1e511SMatthew Knepley /* Initialization functions */ 231bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 232014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 233bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 235014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 237fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 2389371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 239fa2bb9feSLisandro Dalcin 2408ba1e511SMatthew Knepley /* Output functions */ 241014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 242f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 243014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 24431d06abdSBarry Smith 2454dd65854SConnor Ward /* Status checking functions */ 2464dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 2474dd65854SConnor Ward 248fa2bb9feSLisandro Dalcin /* Stage functions */ 249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 251014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 252014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 254014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 257f5d6ab90SLisandro Dalcin 2588ba1e511SMatthew Knepley /* Event functions */ 259014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 260217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 261fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 262fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 263014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 264014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 265c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 266c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 269014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 2708c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 27113230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *); 272891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 2735d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 2747a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPushCurrentEvent_Internal(PetscLogEvent); 2757a101e5eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogPopCurrentEvent_Internal(void); 2768ba1e511SMatthew Knepley 277e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 278e3ed9ee7SBarry Smith 279fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 28062872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 28162872c28SLisandro Dalcin 28262872c28SLisandro Dalcin #define PetscLogEventSync(e, comm) \ 2833ba16761SJacob 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))) 28477c4ece6SBarry Smith 28552e6d16bSBarry Smith #define PetscLogEventBegin(e, o1, o2, o3, o4) \ 2863ba16761SJacob 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)) 287043328b6SSatish Balay 28852e6d16bSBarry Smith #define PetscLogEventEnd(e, o1, o2, o3, o4) \ 2893ba16761SJacob 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)) 29077c4ece6SBarry Smith 291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble *); 292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 293003131ecSBarry Smith 294c708d6e3SStefano Zampini /* Global flop counter */ 295c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 296c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 297c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_ct; 298c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_ct; 299c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_ct; 300c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_irecv_len; 301c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_isend_len; 302c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_recv_len; 303c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_send_len; 304c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 305c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gather_ct; 306c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 307c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_ct; 308c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 309c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 310c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 311c708d6e3SStefano Zampini 312c708d6e3SStefano Zampini /* Thread local storage */ 313c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th; 314c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th; 315c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th; 316c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th; 317c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th; 318c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th; 319c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th; 320c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th; 321c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th; 322c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th; 323c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th; 324c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th; 325c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th; 326c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th; 327c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th; 328c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th; 329c708d6e3SStefano Zampini 330c708d6e3SStefano Zampini /* 331c708d6e3SStefano Zampini Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 332c708d6e3SStefano Zampini 333c708d6e3SStefano Zampini For the complex numbers version, note that 334c708d6e3SStefano Zampini 1 complex addition = 2 flops 335c708d6e3SStefano Zampini 1 complex multiplication = 6 flops, 336c708d6e3SStefano Zampini where we define 1 flop as that for a double precision scalar. We roughly approximate 337c708d6e3SStefano Zampini flop counting for complex numbers by multiplying the total flops by 4; this corresponds 338c708d6e3SStefano Zampini to the assumption that we're counting mostly additions and multiplications -- and 339c708d6e3SStefano Zampini roughly the same number of each. More accurate counting could be done by distinguishing 340c708d6e3SStefano Zampini among the various arithmetic operations. 341c708d6e3SStefano Zampini */ 342c708d6e3SStefano Zampini 343c708d6e3SStefano Zampini #if defined(PETSC_USE_COMPLEX) 344c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 4.0 345c708d6e3SStefano Zampini #else 346c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 1.0 347c708d6e3SStefano Zampini #endif 348c708d6e3SStefano Zampini 349c708d6e3SStefano Zampini /*@C 350c708d6e3SStefano Zampini PetscLogFlops - Log how many flops are performed in a calculation 351c708d6e3SStefano Zampini 352c708d6e3SStefano Zampini Input Parameter: 353c708d6e3SStefano Zampini . flops - the number of flops 354c708d6e3SStefano Zampini 355c708d6e3SStefano Zampini Level: intermediate 356c708d6e3SStefano Zampini 357c200f75eSSatish Balay Note: 358c200f75eSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 359c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 360c200f75eSSatish Balay 361c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()` 362c708d6e3SStefano Zampini @*/ 363c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 364c708d6e3SStefano Zampini { 365c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 366c708d6e3SStefano Zampini return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n); 367c708d6e3SStefano Zampini } 368c708d6e3SStefano Zampini 369ce85283eSBarry Smith /* 370f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 371f621e05eSBarry Smith their sizes. 372f621e05eSBarry Smith 373af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 374ce85283eSBarry Smith uses macros to defined the MPI operations. 37515308354SBarry Smith 37615308354SBarry Smith It does not work correctly from HP-UX because it processes the 377bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 378b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3797c1e34a4SSatish Balay 380f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 381ce85283eSBarry Smith */ 382d5bc873cSPierre Jolivet #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 38377a39924SBarry Smith /* 38477a39924SBarry Smith Logging of MPI activities 38577a39924SBarry Smith */ 386c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 387d71ae5a4SJacob Faibussowitsch { 388f12d10ccSJunchao Zhang PetscMPIInt typesize; 3895f80ce2aSJacob Faibussowitsch 3903ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 3919566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 392c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize)); 393f95db71bSBarry Smith } 39477a39924SBarry Smith 395c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 396d71ae5a4SJacob Faibussowitsch { 397f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 398c708d6e3SStefano Zampini PetscLogDouble l; 3993b9284c0SMatthew G Knepley 4003ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4019566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4029566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 403c708d6e3SStefano Zampini for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize); 404c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, l); 4053b9284c0SMatthew G Knepley } 4063b9284c0SMatthew G Knepley 40772b11a25SBarry Smith /* 40872b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 40972b11a25SBarry Smith */ 410d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 411d71ae5a4SJacob Faibussowitsch { 4129371c9d4SSatish Balay PetscMPIInt size; 4139371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4149371c9d4SSatish Balay return size > 1; 41572b11a25SBarry Smith } 41672b11a25SBarry Smith 417c708d6e3SStefano Zampini #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \ 418c708d6e3SStefano 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))) 41915308354SBarry Smith 420c708d6e3SStefano Zampini #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \ 421c708d6e3SStefano 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))) 422c87b50c4SJunchao Zhang 423c708d6e3SStefano Zampini #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \ 424c708d6e3SStefano 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))) 42515308354SBarry Smith 426c708d6e3SStefano Zampini #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \ 427c708d6e3SStefano 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))) 428c87b50c4SJunchao Zhang 429c708d6e3SStefano Zampini #define MPI_Startall_irecv(count, datatype, number, requests) \ 430c708d6e3SStefano 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)))) 4310d4b0b6cSBarry Smith 432c708d6e3SStefano Zampini #define MPI_Startall_isend(count, datatype, number, requests) \ 433c708d6e3SStefano 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)))) 4340d4b0b6cSBarry Smith 435c708d6e3SStefano 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))) 4360d4b0b6cSBarry Smith 437c708d6e3SStefano Zampini #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \ 438c708d6e3SStefano 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))) 43915308354SBarry Smith 440c708d6e3SStefano Zampini #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \ 441c708d6e3SStefano 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))) 442c87b50c4SJunchao Zhang 443c708d6e3SStefano Zampini #define MPI_Send(buf, count, datatype, dest, tag, comm) \ 444c708d6e3SStefano 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))) 44577a39924SBarry Smith 446c708d6e3SStefano Zampini #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \ 447c708d6e3SStefano 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))) 448c87b50c4SJunchao Zhang 449c708d6e3SStefano 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))) 45077a39924SBarry Smith 451c708d6e3SStefano 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))) 45277a39924SBarry Smith 453c708d6e3SStefano Zampini #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 454c708d6e3SStefano 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))) 45577a39924SBarry Smith 456c708d6e3SStefano 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))) 4573914022bSBarry Smith 458c708d6e3SStefano 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))) 45954fe5c21SBarry Smith 460c708d6e3SStefano Zampini #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \ 461c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 462d6e4c47cSJed Brown 4633b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 464c708d6e3SStefano 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))) 4653b9284c0SMatthew G Knepley 4663b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 467c708d6e3SStefano 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))) 4683b9284c0SMatthew G Knepley 469c708d6e3SStefano Zampini #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 470c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 47101faf4e4SMatthew Knepley 47201faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 473c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || 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) \ 476c708d6e3SStefano 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))) 47701faf4e4SMatthew Knepley 47801faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 479c708d6e3SStefano 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))) 48001faf4e4SMatthew Knepley 48101faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 482c708d6e3SStefano 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))) 48301faf4e4SMatthew Knepley 48401faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 485c708d6e3SStefano 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))) 486f12d10ccSJunchao Zhang 487f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 488c708d6e3SStefano 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))) 489f12d10ccSJunchao Zhang 490f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 491c708d6e3SStefano 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))) 492f12d10ccSJunchao Zhang 493f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 494c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || 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) \ 497c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || 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) \ 500c708d6e3SStefano 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))) 501f12d10ccSJunchao Zhang 502f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 503c708d6e3SStefano 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))) 504f12d10ccSJunchao Zhang 505f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 506c708d6e3SStefano 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))) 507f12d10ccSJunchao Zhang 508f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 509c708d6e3SStefano 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))) 510f12d10ccSJunchao Zhang 511715b587bSJunchao Zhang #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \ 512715b587bSJunchao 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))) 513715b587bSJunchao Zhang 514715b587bSJunchao Zhang #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \ 515715b587bSJunchao 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))) 516715b587bSJunchao Zhang 517715b587bSJunchao Zhang #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \ 518715b587bSJunchao 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))) 519715b587bSJunchao Zhang 520715b587bSJunchao Zhang #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \ 521715b587bSJunchao 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))) 522715b587bSJunchao Zhang 523715b587bSJunchao Zhang #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \ 524715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 525715b587bSJunchao Zhang 526715b587bSJunchao 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))) 527715b587bSJunchao Zhang 528715b587bSJunchao Zhang #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \ 529715b587bSJunchao 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))) 5300d4b0b6cSBarry Smith #else 5310d4b0b6cSBarry Smith 5329371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5330d4b0b6cSBarry Smith 5349371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 5350d4b0b6cSBarry Smith 5369371c9d4SSatish Balay #define MPI_Start_isend(count, datatype, requests) (MPI_Start((requests))) 5370d4b0b6cSBarry Smith 538c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 539614700edSBarry Smith 540df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 541614700edSBarry Smith 542e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 543e3ed9ee7SBarry Smith 5443ba16761SJacob Faibussowitsch #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS) 5453ba16761SJacob Faibussowitsch #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS) 546614700edSBarry Smith 5473ba16761SJacob Faibussowitsch #define PetscLogStageRegister(a, b) PETSC_SUCCESS 5483ba16761SJacob Faibussowitsch #define PetscLogStagePush(a) PETSC_SUCCESS 5493ba16761SJacob Faibussowitsch #define PetscLogStagePop() PETSC_SUCCESS 5503ba16761SJacob Faibussowitsch #define PetscLogStageSetActive(a, b) PETSC_SUCCESS 5513ba16761SJacob Faibussowitsch #define PetscLogStageGetActive(a, b) PETSC_SUCCESS 5523ba16761SJacob Faibussowitsch #define PetscLogStageGetVisible(a, b) PETSC_SUCCESS 5533ba16761SJacob Faibussowitsch #define PetscLogStageSetVisible(a, b) PETSC_SUCCESS 5543ba16761SJacob Faibussowitsch #define PetscLogStageGetId(a, b) (*(b) = 0, PETSC_SUCCESS) 555f5d6ab90SLisandro Dalcin 5563ba16761SJacob Faibussowitsch #define PetscLogEventRegister(a, b, c) PETSC_SUCCESS 5573ba16761SJacob Faibussowitsch #define PetscLogEventSetCollective(a, b) PETSC_SUCCESS 5583ba16761SJacob Faibussowitsch #define PetscLogEventIncludeClass(a) PETSC_SUCCESS 5593ba16761SJacob Faibussowitsch #define PetscLogEventExcludeClass(a) PETSC_SUCCESS 5603ba16761SJacob Faibussowitsch #define PetscLogEventActivate(a) PETSC_SUCCESS 5613ba16761SJacob Faibussowitsch #define PetscLogEventDeactivate(a) PETSC_SUCCESS 5623ba16761SJacob Faibussowitsch #define PetscLogEventDeactivatePush(a) PETSC_SUCCESS 5633ba16761SJacob Faibussowitsch #define PetscLogEventDeactivatePop(a) PETSC_SUCCESS 5643ba16761SJacob Faibussowitsch #define PetscLogEventActivateClass(a) PETSC_SUCCESS 5653ba16761SJacob Faibussowitsch #define PetscLogEventDeactivateClass(a) PETSC_SUCCESS 5663ba16761SJacob Faibussowitsch #define PetscLogEventSetActiveAll(a, b) PETSC_SUCCESS 5673ba16761SJacob Faibussowitsch #define PetscLogEventGetId(a, b) (*(b) = 0, PETSC_SUCCESS) 5683ba16761SJacob Faibussowitsch #define PetscLogEventGetPerfInfo(a, b, c) PETSC_SUCCESS 5693ba16761SJacob Faibussowitsch #define PetscLogEventSetDof(a, b, c) PETSC_SUCCESS 5703ba16761SJacob Faibussowitsch #define PetscLogEventSetError(a, b, c) PETSC_SUCCESS 57177c4ece6SBarry Smith 5723ba16761SJacob Faibussowitsch #define PetscLogPLB PETSC_SUCCESS 5733ba16761SJacob Faibussowitsch #define PetscLogPLE PETSC_SUCCESS 5743ba16761SJacob Faibussowitsch #define PetscLogPHC PETSC_SUCCESS 5753ba16761SJacob Faibussowitsch #define PetscLogPHD PETSC_SUCCESS 576f5d6ab90SLisandro Dalcin 5773ba16761SJacob Faibussowitsch #define PetscLogObjectParents(p, n, c) PETSC_SUCCESS 5783ba16761SJacob Faibussowitsch #define PetscLogObjectCreate(h) PETSC_SUCCESS 5793ba16761SJacob Faibussowitsch #define PetscLogObjectDestroy(h) PETSC_SUCCESS 5803ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 581fa2bb9feSLisandro Dalcin 5823ba16761SJacob Faibussowitsch #define PetscLogDefaultBegin() PETSC_SUCCESS 5833ba16761SJacob Faibussowitsch #define PetscLogAllBegin() PETSC_SUCCESS 5843ba16761SJacob Faibussowitsch #define PetscLogNestedBegin() PETSC_SUCCESS 5853ba16761SJacob Faibussowitsch #define PetscLogTraceBegin(file) PETSC_SUCCESS 5863ba16761SJacob Faibussowitsch #define PetscLogActions(a) PETSC_SUCCESS 5873ba16761SJacob Faibussowitsch #define PetscLogObjects(a) PETSC_SUCCESS 5883ba16761SJacob Faibussowitsch #define PetscLogSetThreshold(a, b) PETSC_SUCCESS 5893ba16761SJacob Faibussowitsch #define PetscLogSet(lb, le) PETSC_SUCCESS 5903ba16761SJacob Faibussowitsch #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, PETSC_SUCCESS) 591fa2bb9feSLisandro Dalcin 5923ba16761SJacob Faibussowitsch #define PetscLogView(viewer) PETSC_SUCCESS 5933ba16761SJacob Faibussowitsch #define PetscLogViewFromOptions() PETSC_SUCCESS 5943ba16761SJacob Faibussowitsch #define PetscLogDump(c) PETSC_SUCCESS 595fa2bb9feSLisandro Dalcin 5963ba16761SJacob Faibussowitsch #define PetscLogEventSync(e, comm) PETSC_SUCCESS 5973ba16761SJacob Faibussowitsch #define PetscLogEventBegin(e, o1, o2, o3, o4) PETSC_SUCCESS 5983ba16761SJacob Faibussowitsch #define PetscLogEventEnd(e, o1, o2, o3, o4) PETSC_SUCCESS 599ce6058e1SBarry Smith 60023c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 60123c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 60223c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 60323c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 60423c86b1bSSatish Balay 60523c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 60623c86b1bSSatish Balay 607204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 608204a6943SJed Brown do { \ 609204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 610204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 611166c7f25SBarry Smith PetscLogStage _stageNum; \ 6129566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 613204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 614204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 615204a6943SJed Brown for (PetscPreLoadIt = 0; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 616204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading; \ 6179566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 6189566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 6199566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 6209566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 621a8f51744SPierre Jolivet PetscCall(PetscLogStagePush(_stageNum)) 6228e58c17dSMatthew Knepley 623204a6943SJed Brown #define PetscPreLoadEnd() \ 6249566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 625204a6943SJed Brown PetscPreLoading = PETSC_FALSE; \ 626043328b6SSatish Balay } \ 6279371c9d4SSatish Balay } \ 6289371c9d4SSatish Balay while (0) 6298e58c17dSMatthew Knepley 6309371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 6319371c9d4SSatish Balay do { \ 6329566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 6339566063dSJacob Faibussowitsch if (PetscPreLoadIt > 0) PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 6349566063dSJacob Faibussowitsch else PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 6359566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 6369566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 637204a6943SJed Brown } while (0) 638e9fa29b7SSatish Balay 639ad14c47eSJed Brown /* some vars for logging */ 640ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 641ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 642ad14c47eSJed Brown 643c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 644c708d6e3SStefano Zampini 645c708d6e3SStefano Zampini /* Global GPU counters */ 646c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 647c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 648c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 649c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 650c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 651c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 652c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 653c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 654c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gflops; 655c708d6e3SStefano Zampini PETSC_EXTERN PetscLogDouble petsc_gtime; 656c708d6e3SStefano Zampini 657c708d6e3SStefano Zampini /* Thread local storage */ 658c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th; 659c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th; 660c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th; 661c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th; 662c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th; 663c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th; 664c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th; 665c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th; 666c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th; 667c708d6e3SStefano Zampini PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th; 668c708d6e3SStefano Zampini 669c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 670c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 671c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 672c708d6e3SStefano Zampini 673c708d6e3SStefano Zampini /*@C 674c708d6e3SStefano Zampini PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 675c708d6e3SStefano Zampini 676c708d6e3SStefano Zampini Input Parameter: 677c708d6e3SStefano Zampini . flops - the number of flops 678c708d6e3SStefano Zampini 679c200f75eSSatish Balay Level: intermediate 680c200f75eSSatish Balay 681c708d6e3SStefano Zampini Notes: 682c708d6e3SStefano Zampini To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 683c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 684c708d6e3SStefano Zampini 685c708d6e3SStefano 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 686c708d6e3SStefano Zampini just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 687c708d6e3SStefano Zampini 688c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 689c708d6e3SStefano Zampini @*/ 690c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 691c708d6e3SStefano Zampini { 692c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 6933ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n)); 6943ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n)); 6953ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 696c708d6e3SStefano Zampini } 697c708d6e3SStefano Zampini 698c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 699c708d6e3SStefano Zampini { 7003ba16761SJacob Faibussowitsch return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t); 701c708d6e3SStefano Zampini } 702c708d6e3SStefano Zampini 703c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 704c708d6e3SStefano Zampini { 7053ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size); 706c708d6e3SStefano Zampini } 707c708d6e3SStefano Zampini 708c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 709c708d6e3SStefano Zampini { 7103ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size); 711c708d6e3SStefano Zampini } 712c708d6e3SStefano Zampini 713c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 714c708d6e3SStefano Zampini { 7153ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size); 716c708d6e3SStefano Zampini } 717c708d6e3SStefano Zampini 718c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 719c708d6e3SStefano Zampini { 7203ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size); 721c708d6e3SStefano Zampini } 722c708d6e3SStefano Zampini #else 723c708d6e3SStefano Zampini 7243ba16761SJacob Faibussowitsch #define PetscLogCpuToGpu(a) PETSC_SUCCESS 7253ba16761SJacob Faibussowitsch #define PetscLogGpuToCpu(a) PETSC_SUCCESS 7263ba16761SJacob Faibussowitsch #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS 7273ba16761SJacob Faibussowitsch #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS 7283ba16761SJacob Faibussowitsch #define PetscLogGpuFlops(a) PETSC_SUCCESS 7293ba16761SJacob Faibussowitsch #define PetscLogGpuTime() PETSC_SUCCESS 7303ba16761SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) PETSC_SUCCESS 7313ba16761SJacob Faibussowitsch #define PetscLogGpuTimeBegin() PETSC_SUCCESS 7323ba16761SJacob Faibussowitsch #define PetscLogGpuTimeEnd() PETSC_SUCCESS 733c708d6e3SStefano Zampini 734c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 735c708d6e3SStefano Zampini 736c708d6e3SStefano Zampini /* remove TLS defines */ 737c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS 738c708d6e3SStefano Zampini #undef PETSC_TLS 739c708d6e3SStefano Zampini 74097bb86f7SLois Curfman McInnes #endif 741