197bb86f7SLois Curfman McInnes /* 27588ac45SBarry Smith Defines profile/logging in PETSc. 397bb86f7SLois Curfman McInnes */ 4a4963045SJacob Faibussowitsch #pragma once 5ac09b921SBarry Smith 6aaa7dc30SBarry Smith #include <petscsys.h> 7958c4211Shannah_mairs #include <petsctime.h> 86873511fSToby Isaac #include <petscbt.h> 91c1ad86eSToby Isaac #include <petsclogtypes.h> 10c8d78d4dSSatish Balay 11ce78bad3SBarry Smith /* MANSEC = Sys */ 12ce78bad3SBarry Smith /* SUBMANSEC = Log */ 13ac09b921SBarry Smith 14fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 153ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4); 16fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 177d3de750SJacob Faibussowitsch #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__) 18fa2bb9feSLisandro Dalcin #else 193ba16761SJacob Faibussowitsch #define PetscInfo(A, ...) PETSC_SUCCESS 20fa2bb9feSLisandro Dalcin #endif 21e94e781bSJacob Faibussowitsch 22edd03b47SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 23edd03b47SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 24edd03b47SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 25edd03b47SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 26edd03b47SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 27edd03b47SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 28edd03b47SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 29edd03b47SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 30edd03b47SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 317d3de750SJacob Faibussowitsch 32e94e781bSJacob Faibussowitsch /*E 3316a05f60SBarry Smith PetscInfoCommFlag - Describes the method by which to filter information displayed by `PetscInfo()` by communicator size 34e94e781bSJacob Faibussowitsch 35667f096bSBarry Smith Values: 36d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on 378b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators) 38d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 39d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1 40e94e781bSJacob Faibussowitsch 41e94e781bSJacob Faibussowitsch Level: intermediate 42e94e781bSJacob Faibussowitsch 43667f096bSBarry Smith Note: 44667f096bSBarry Smith Used as an input for `PetscInfoSetFilterCommSelf()` 45667f096bSBarry Smith 46db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()` 47e94e781bSJacob Faibussowitsch E*/ 48e94e781bSJacob Faibussowitsch typedef enum { 49e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 50e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 51e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 52e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 53e94e781bSJacob Faibussowitsch 54e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[]; 55fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 56fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[], const char[]); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **, FILE **); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool, PetscInt, const char *const *); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *); 648b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 67e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 68fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 69fa2bb9feSLisandro Dalcin 701c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *); 711c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack); 721c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int); 731c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *); 741c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *); 751c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool *); 761c1ad86eSToby Isaac 776873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateCreate(PetscLogState *); 786873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateDestroy(PetscLogState *); 796873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetRegistry(PetscLogState, PetscLogRegistry *); 806873511fSToby Isaac 816873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassRegister(PetscLogState, const char[], PetscClassId, PetscLogStage *); 826873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassSetActive(PetscLogState, PetscLogStage, PetscClassId, PetscBool); 836873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassSetActiveAll(PetscLogState, PetscClassId, PetscBool); 846873511fSToby Isaac 856873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageRegister(PetscLogState, const char[], PetscLogStage *); 866873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStagePush(PetscLogState, PetscLogStage); 876873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStagePop(PetscLogState); 886873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageSetActive(PetscLogState, PetscLogStage, PetscBool); 896873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageGetActive(PetscLogState, PetscLogStage, PetscBool *); 906873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetCurrentStage(PetscLogState, PetscLogStage *); 916873511fSToby Isaac 926873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventRegister(PetscLogState, const char[], PetscClassId, PetscLogEvent *); 936873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetCollective(PetscLogState, PetscLogEvent, PetscBool); 946873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetActive(PetscLogState, PetscLogStage, PetscLogEvent, PetscBool); 956873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetActiveAll(PetscLogState, PetscLogEvent, PetscBool); 966873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventGetActive(PetscLogState, PetscLogStage, PetscLogEvent, PetscBool *); 976873511fSToby Isaac 986873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetEventFromName(PetscLogState, const char[], PetscLogEvent *); 996873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetStageFromName(PetscLogState, const char[], PetscLogStage *); 1006873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetClassFromName(PetscLogState, const char[], PetscLogClass *); 1016873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetClassFromClassId(PetscLogState, PetscClassId, PetscLogClass *); 1026873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumEvents(PetscLogState, PetscInt *); 1036873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumStages(PetscLogState, PetscInt *); 1046873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumClasses(PetscLogState, PetscInt *); 1056873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventGetInfo(PetscLogState, PetscLogEvent, PetscLogEventInfo *); 1066873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageGetInfo(PetscLogState, PetscLogStage, PetscLogStageInfo *); 1076873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassGetInfo(PetscLogState, PetscLogClass, PetscLogClassInfo *); 1086873511fSToby Isaac 10919ef957cSToby Isaac PETSC_EXTERN PetscClassId PETSCLOGHANDLER_CLASSID; 11019ef957cSToby Isaac 11119ef957cSToby Isaac PETSC_EXTERN PetscFunctionList PetscLogHandlerList; 11219ef957cSToby Isaac 11319ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerRegister(const char[], PetscErrorCode (*)(PetscLogHandler)); 11419ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *); 11519ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetType(PetscLogHandler, PetscLogHandlerType); 11619ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetType(PetscLogHandler, PetscLogHandlerType *); 11719ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerDestroy(PetscLogHandler *); 11819ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetState(PetscLogHandler, PetscLogState); 11919ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetState(PetscLogHandler, PetscLogState *); 12019ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventBegin(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 12119ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventEnd(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 12219ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventSync(PetscLogHandler, PetscLogEvent, MPI_Comm); 12319ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerObjectCreate(PetscLogHandler, PetscObject); 12419ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerObjectDestroy(PetscLogHandler, PetscObject); 12519ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStagePush(PetscLogHandler, PetscLogStage); 12619ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStagePop(PetscLogHandler, PetscLogStage); 12719ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerView(PetscLogHandler, PetscViewer); 12819ef957cSToby Isaac 129dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetEventPerfInfo(PetscLogHandler, PetscLogStage, PetscLogEvent, PetscEventPerfInfo **); 1308b08f494SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetStagePerfInfo(PetscLogHandler, PetscLogStage, PetscEventPerfInfo **); 131dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetLogActions(PetscLogHandler, PetscBool); 132dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetLogObjects(PetscLogHandler, PetscBool); 133dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerLogObjectState(PetscLogHandler, PetscObject, const char[], ...); 134dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetNumObjects(PetscLogHandler, PetscInt *); 135dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventDeactivatePush(PetscLogHandler, PetscLogStage, PetscLogEvent); 136dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventDeactivatePop(PetscLogHandler, PetscLogStage, PetscLogEvent); 137dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventsPause(PetscLogHandler); 138dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventsResume(PetscLogHandler); 139dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerDump(PetscLogHandler, const char[]); 140dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStageSetVisible(PetscLogHandler, PetscLogStage, PetscBool); 141dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStageGetVisible(PetscLogHandler, PetscLogStage, PetscBool *); 142dff009beSToby Isaac 1436467efc9SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerCreateTrace(MPI_Comm, FILE *, PetscLogHandler *); 144b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerCreateLegacy(MPI_Comm, PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscObject), PetscErrorCode (*)(PetscObject), PetscLogHandler *); 1456467efc9SToby Isaac 1466873511fSToby Isaac /* All events are inactive if an invalid stage is set, like if there have been more stage pops than stage pushes */ 1476873511fSToby Isaac #define PetscLogStateStageEventIsActive(state, stage, event) ((stage >= 0) && PetscBTLookup((state)->active, (stage)) && PetscBTLookup((state)->active, (stage) + (event + 1) * (state)->bt_num_stages)) 148b665b14eSToby Isaac #define PetscLogStateEventCurrentlyActive(state, event) ((state) && PetscLogStateStageEventIsActive(state, (state)->current_stage, event)) 1496873511fSToby Isaac 15053e0a2f3SToby Isaac /* PetscLogHandler with critical methods exposed for speed */ 15153e0a2f3SToby Isaac typedef struct _n_PetscLogHandlerHot { 15253e0a2f3SToby Isaac PetscLogHandler handler; 15353e0a2f3SToby Isaac PetscErrorCode (*eventBegin)(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 15453e0a2f3SToby Isaac PetscErrorCode (*eventEnd)(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 15553e0a2f3SToby Isaac PetscErrorCode (*eventSync)(PetscLogHandler, PetscLogEvent, MPI_Comm); 15653e0a2f3SToby Isaac PetscErrorCode (*objectCreate)(PetscLogHandler, PetscObject); 15753e0a2f3SToby Isaac PetscErrorCode (*objectDestroy)(PetscLogHandler, PetscObject); 15853e0a2f3SToby Isaac } PetscLogHandlerHot; 15953e0a2f3SToby Isaac 160c708d6e3SStefano Zampini /* Handle multithreading */ 161c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 162c708d6e3SStefano Zampini #if defined(__cplusplus) 163c708d6e3SStefano Zampini #define PETSC_TLS thread_local 164c708d6e3SStefano Zampini #else 165c708d6e3SStefano Zampini #define PETSC_TLS _Thread_local 166c708d6e3SStefano Zampini #endif 167c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC 168c708d6e3SStefano Zampini #else 169c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS PETSC_EXTERN 170c708d6e3SStefano Zampini #define PETSC_TLS 171cac61b71SSatish Balay #endif 172cac61b71SSatish Balay #if defined(PETSC_HAVE_THREADSAFETY) && defined(PETSC_USE_LOG) 173cac61b71SSatish Balay PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 174cac61b71SSatish Balay PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 175cac61b71SSatish Balay #else 1763ba16761SJacob Faibussowitsch #define PetscAddLogDouble(a, b, c) ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS))) 1773ba16761SJacob Faibussowitsch #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e))) 178c708d6e3SStefano Zampini #endif 17919b02663SBarry Smith 180edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectParent()", ) static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p) 181d71ae5a4SJacob Faibussowitsch { 1824f839811SJacob Faibussowitsch (void)o; 1834f839811SJacob Faibussowitsch (void)p; 1843ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1854dfa11a4SJacob Faibussowitsch } 1862611ad71SToby Isaac #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));) 1874dfa11a4SJacob Faibussowitsch 188edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectMemory()", ) static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m) 189d71ae5a4SJacob Faibussowitsch { 1904f839811SJacob Faibussowitsch (void)o; 1914f839811SJacob Faibussowitsch (void)m; 1923ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1934dfa11a4SJacob Faibussowitsch } 1943bb1ff40SBarry Smith 1952611ad71SToby Isaac /* Global flop counter */ 1962611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 1972611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 1982611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_isend_ct; 1992611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_recv_ct; 2002611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_send_ct; 2012611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_irecv_len; 2022611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_isend_len; 2032611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_recv_len; 2042611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_send_len; 2052611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 2062611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gather_ct; 2072611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 2082611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_ct; 2092611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 2102611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 2112611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 2122611ad71SToby Isaac 2132611ad71SToby Isaac /* Thread local storage */ 2142611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th; 2152611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th; 2162611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th; 2172611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th; 2182611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th; 2192611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th; 2202611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th; 2212611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th; 2222611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th; 2232611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th; 2242611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th; 2252611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th; 2262611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th; 2272611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th; 2282611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th; 2292611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th; 2302611ad71SToby Isaac 2312611ad71SToby Isaac /* Global GPU counters */ 2322611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 2332611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 2342611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 2352611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 2362611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 2372611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 2382611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 2392611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 2402611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gflops; 2412611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtime; 242*5268dc8aSHong Zhang PETSC_EXTERN PetscLogDouble petsc_genergy; 243*5268dc8aSHong Zhang PETSC_EXTERN PetscLogDouble petsc_genergy_meter; 2442611ad71SToby Isaac 2452611ad71SToby Isaac /* Thread local storage */ 2462611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th; 2472611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th; 2482611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th; 2492611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th; 2502611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th; 2512611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th; 2522611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th; 2532611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th; 2542611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th; 2552611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th; 2562611ad71SToby Isaac 2572611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogMemory; 2582611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 2592611ad71SToby Isaac 2602611ad71SToby Isaac PETSC_EXTERN PetscLogState petsc_log_state; 2612611ad71SToby Isaac 2622611ad71SToby Isaac #define PETSC_LOG_HANDLER_MAX 4 2632611ad71SToby Isaac PETSC_EXTERN PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX]; 2642611ad71SToby Isaac 265aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 266fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 26777c4ece6SBarry Smith 2683ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 269fa2bb9feSLisandro Dalcin 2708ba1e511SMatthew Knepley /* Initialization functions */ 271bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 272bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 273014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 2742611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 2752611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogPerfstubsBegin(void); 2762611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogLegacyCallbacksBegin(PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscObject), PetscErrorCode (*)(PetscObject)); 277014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 278014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 279fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 280fa2bb9feSLisandro Dalcin 2818ba1e511SMatthew Knepley /* Output functions */ 282014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 283f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 284014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 2852611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 28631d06abdSBarry Smith 28753e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetState(PetscLogState *); 288b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *); 28953e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStart(PetscLogHandler); 29053e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStop(PetscLogHandler); 29153e0a2f3SToby Isaac 2924dd65854SConnor Ward /* Status checking functions */ 2934dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 2944dd65854SConnor Ward 295fa2bb9feSLisandro Dalcin /* Stage functions */ 296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 298014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 299014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 300014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 302014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 30453e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetName(PetscLogEvent, const char **); 3058b08f494SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage, PetscEventPerfInfo *); 306f5d6ab90SLisandro Dalcin 3078ba1e511SMatthew Knepley /* Event functions */ 308014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 309217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 310fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 311fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 313014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 314c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 315c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 317014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 318014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3198c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 32053e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetName(PetscLogEvent, const char **); 32153e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage, PetscLogEvent, PetscEventPerfInfo *); 322891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3235d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 32453e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsPause(void); 32553e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsResume(void); 32653e0a2f3SToby Isaac 32753e0a2f3SToby Isaac /* Class functions */ 32853e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassGetClassId(const char[], PetscClassId *); 32953e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassIdGetName(PetscClassId, const char **); 3308ba1e511SMatthew Knepley 33152e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm) 332b665b14eSToby Isaac { 333b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 334b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 335b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 336b665b14eSToby Isaac if (h->eventSync) { 337f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventSync)(h->handler, e, comm); 338b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 339b665b14eSToby Isaac } 340b665b14eSToby Isaac } 341b665b14eSToby Isaac } 342b665b14eSToby Isaac return PETSC_SUCCESS; 343b665b14eSToby Isaac } 34462872c28SLisandro Dalcin 34552e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventBegin_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 346b665b14eSToby Isaac { 347b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 348b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 349b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 350b665b14eSToby Isaac if (h->eventBegin) { 351f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventBegin)(h->handler, e, o1, o2, o3, o4); 352b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 353b665b14eSToby Isaac } 354b665b14eSToby Isaac } 355b665b14eSToby Isaac } 356b665b14eSToby Isaac return PETSC_SUCCESS; 357b665b14eSToby Isaac } 358b665b14eSToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) PetscLogEventBegin_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 35977c4ece6SBarry Smith 36052e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventEnd_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 361b665b14eSToby Isaac { 362b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 363b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 364b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 365b665b14eSToby Isaac if (h->eventEnd) { 366f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventEnd)(h->handler, e, o1, o2, o3, o4); 367b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 368b665b14eSToby Isaac } 369b665b14eSToby Isaac } 370b665b14eSToby Isaac } 371b665b14eSToby Isaac return PETSC_SUCCESS; 372b665b14eSToby Isaac } 373b665b14eSToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) PetscLogEventEnd_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 374043328b6SSatish Balay 375b665b14eSToby Isaac /* Object functions */ 37652e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogObjectCreate(PetscObject o) 377b665b14eSToby Isaac { 378b665b14eSToby Isaac if (petsc_log_state) { 379b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 380b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 381b665b14eSToby Isaac if (h->objectCreate) { 382f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectCreate)(h->handler, o); 383b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 384b665b14eSToby Isaac } 385b665b14eSToby Isaac } 386b665b14eSToby Isaac } 387b665b14eSToby Isaac return PETSC_SUCCESS; 388b665b14eSToby Isaac } 38977c4ece6SBarry Smith 39052e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogObjectDestroy(PetscObject o) 391b665b14eSToby Isaac { 392b665b14eSToby Isaac if (petsc_log_state) { 393b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 394b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 395b665b14eSToby Isaac if (h->objectDestroy) { 396f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectDestroy)(h->handler, o); 397b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 398b665b14eSToby Isaac } 399b665b14eSToby Isaac } 400b665b14eSToby Isaac } 401b665b14eSToby Isaac return PETSC_SUCCESS; 402b665b14eSToby Isaac } 403003131ecSBarry Smith 404c708d6e3SStefano Zampini /* 405c708d6e3SStefano Zampini Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 406c708d6e3SStefano Zampini 407c708d6e3SStefano Zampini For the complex numbers version, note that 408c708d6e3SStefano Zampini 1 complex addition = 2 flops 409c708d6e3SStefano Zampini 1 complex multiplication = 6 flops, 410c708d6e3SStefano Zampini where we define 1 flop as that for a double precision scalar. We roughly approximate 411c708d6e3SStefano Zampini flop counting for complex numbers by multiplying the total flops by 4; this corresponds 412c708d6e3SStefano Zampini to the assumption that we're counting mostly additions and multiplications -- and 413c708d6e3SStefano Zampini roughly the same number of each. More accurate counting could be done by distinguishing 414c708d6e3SStefano Zampini among the various arithmetic operations. 415c708d6e3SStefano Zampini */ 416c708d6e3SStefano Zampini 417c708d6e3SStefano Zampini #if defined(PETSC_USE_COMPLEX) 418c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 4.0 419c708d6e3SStefano Zampini #else 420c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 1.0 421c708d6e3SStefano Zampini #endif 422c708d6e3SStefano Zampini 4235d83a8b1SBarry Smith /*@ 424c708d6e3SStefano Zampini PetscLogFlops - Log how many flops are performed in a calculation 425c708d6e3SStefano Zampini 426c708d6e3SStefano Zampini Input Parameter: 427c708d6e3SStefano Zampini . flops - the number of flops 428c708d6e3SStefano Zampini 429c708d6e3SStefano Zampini Level: intermediate 430c708d6e3SStefano Zampini 431c200f75eSSatish Balay Note: 432c200f75eSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 433c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 434c200f75eSSatish Balay 435c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()` 436c708d6e3SStefano Zampini @*/ 437c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 438c708d6e3SStefano Zampini { 439c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 440c708d6e3SStefano Zampini return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n); 441c708d6e3SStefano Zampini } 442c708d6e3SStefano Zampini 443ce85283eSBarry Smith /* 444f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 445f621e05eSBarry Smith their sizes. 446f621e05eSBarry Smith 447af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 448ce85283eSBarry Smith uses macros to defined the MPI operations. 44915308354SBarry Smith 45015308354SBarry Smith It does not work correctly from HP-UX because it processes the 451bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 452b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4537c1e34a4SSatish Balay 454f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 455ce85283eSBarry Smith */ 456d5bc873cSPierre Jolivet #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 45777a39924SBarry Smith /* 45877a39924SBarry Smith Logging of MPI activities 45977a39924SBarry Smith */ 4606497c311SBarry Smith static inline PetscErrorCode PetscMPITypeSize(PetscCount count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 461d71ae5a4SJacob Faibussowitsch { 462f12d10ccSJunchao Zhang PetscMPIInt typesize; 4635f80ce2aSJacob Faibussowitsch 4643ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4659566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 466c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize)); 467f95db71bSBarry Smith } 46877a39924SBarry Smith 469c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 470d71ae5a4SJacob Faibussowitsch { 471f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 472c708d6e3SStefano Zampini PetscLogDouble l; 4733b9284c0SMatthew G Knepley 4743ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4759566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 477c708d6e3SStefano Zampini for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize); 478c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, l); 4793b9284c0SMatthew G Knepley } 4803b9284c0SMatthew G Knepley 48172b11a25SBarry Smith /* 48272b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 48372b11a25SBarry Smith */ 484d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 485d71ae5a4SJacob Faibussowitsch { 4869371c9d4SSatish Balay PetscMPIInt size; 4879371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4889371c9d4SSatish Balay return size > 1; 48972b11a25SBarry Smith } 49072b11a25SBarry Smith 491c708d6e3SStefano Zampini #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \ 492c708d6e3SStefano 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))) 49315308354SBarry Smith 494c708d6e3SStefano Zampini #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \ 495c708d6e3SStefano 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))) 496c87b50c4SJunchao Zhang 497c708d6e3SStefano Zampini #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \ 498c708d6e3SStefano 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))) 49915308354SBarry Smith 500c708d6e3SStefano Zampini #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \ 501c708d6e3SStefano 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))) 502c87b50c4SJunchao Zhang 503c708d6e3SStefano Zampini #define MPI_Startall_irecv(count, datatype, number, requests) \ 504c708d6e3SStefano 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)))) 5050d4b0b6cSBarry Smith 506c708d6e3SStefano Zampini #define MPI_Startall_isend(count, datatype, number, requests) \ 507c708d6e3SStefano 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)))) 5080d4b0b6cSBarry Smith 509f4f49eeaSPierre Jolivet #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)) 5100d4b0b6cSBarry Smith 511c708d6e3SStefano Zampini #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \ 512c708d6e3SStefano 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))) 51315308354SBarry Smith 514c708d6e3SStefano Zampini #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \ 515c708d6e3SStefano 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))) 516c87b50c4SJunchao Zhang 517c708d6e3SStefano Zampini #define MPI_Send(buf, count, datatype, dest, tag, comm) \ 518c708d6e3SStefano 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))) 51977a39924SBarry Smith 520c708d6e3SStefano Zampini #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \ 521c708d6e3SStefano 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))) 522c87b50c4SJunchao Zhang 523c708d6e3SStefano 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))) 52477a39924SBarry Smith 525c708d6e3SStefano 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))) 52677a39924SBarry Smith 527c708d6e3SStefano Zampini #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 528c708d6e3SStefano 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))) 52977a39924SBarry Smith 530c708d6e3SStefano 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))) 5313914022bSBarry Smith 532c708d6e3SStefano 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))) 53354fe5c21SBarry Smith 534c708d6e3SStefano Zampini #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \ 535c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 536d6e4c47cSJed Brown 5373b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 538c708d6e3SStefano 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))) 5393b9284c0SMatthew G Knepley 5403b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 541c708d6e3SStefano 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))) 5423b9284c0SMatthew G Knepley 543c708d6e3SStefano Zampini #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 544c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 54501faf4e4SMatthew Knepley 54601faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 547c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm))) 54801faf4e4SMatthew Knepley 54901faf4e4SMatthew Knepley #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 550c708d6e3SStefano 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))) 55101faf4e4SMatthew Knepley 55201faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 553c708d6e3SStefano 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))) 55401faf4e4SMatthew Knepley 55501faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 556c708d6e3SStefano 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))) 55701faf4e4SMatthew Knepley 55801faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 559c708d6e3SStefano 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))) 560f12d10ccSJunchao Zhang 561f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 562c708d6e3SStefano 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))) 563f12d10ccSJunchao Zhang 564f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 565c708d6e3SStefano 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))) 566f12d10ccSJunchao Zhang 567f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 568c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 569f12d10ccSJunchao Zhang 570f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \ 571c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request))) 572f12d10ccSJunchao Zhang 573f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 574c708d6e3SStefano 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))) 575f12d10ccSJunchao Zhang 576f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 577c708d6e3SStefano 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))) 578f12d10ccSJunchao Zhang 579f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 580c708d6e3SStefano 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))) 581f12d10ccSJunchao Zhang 582f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 583c708d6e3SStefano 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))) 584f12d10ccSJunchao Zhang 585715b587bSJunchao Zhang #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \ 586715b587bSJunchao 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))) 587715b587bSJunchao Zhang 588715b587bSJunchao Zhang #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \ 589715b587bSJunchao 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))) 590715b587bSJunchao Zhang 591715b587bSJunchao Zhang #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \ 592715b587bSJunchao 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))) 593715b587bSJunchao Zhang 594715b587bSJunchao Zhang #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \ 595715b587bSJunchao 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))) 596715b587bSJunchao Zhang 597715b587bSJunchao Zhang #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \ 598715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 599715b587bSJunchao Zhang 600715b587bSJunchao 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))) 601715b587bSJunchao Zhang 602715b587bSJunchao Zhang #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \ 603715b587bSJunchao 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))) 6040d4b0b6cSBarry Smith #else 6050d4b0b6cSBarry Smith 6069371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6070d4b0b6cSBarry Smith 6089371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6090d4b0b6cSBarry Smith 610f4f49eeaSPierre Jolivet #define MPI_Start_isend(count, datatype, requests) (MPI_Start(requests)) 6110d4b0b6cSBarry Smith 612c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 613614700edSBarry Smith 614df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 615614700edSBarry Smith 61653e0a2f3SToby Isaac #define PetscLogGetState(a) (*(a) = NULL, PETSC_SUCCESS) 617b665b14eSToby Isaac #define PetscLogGetDefaultHandler(a) (*(a) = NULL, PETSC_SUCCESS) 61853e0a2f3SToby Isaac #define PetscLogHandlerStart(a) ((void)(a), PETSC_SUCCESS) 61953e0a2f3SToby Isaac #define PetscLogHandlerStop(a) ((void)(a), PETSC_SUCCESS) 62053e0a2f3SToby Isaac 6213ba16761SJacob Faibussowitsch #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS) 6223ba16761SJacob Faibussowitsch #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS) 623614700edSBarry Smith 6242611ad71SToby Isaac #define PetscLogStageRegister(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 6252611ad71SToby Isaac #define PetscLogStagePush(a) ((void)(a), PETSC_SUCCESS) 6263ba16761SJacob Faibussowitsch #define PetscLogStagePop() PETSC_SUCCESS 6272611ad71SToby Isaac #define PetscLogStageSetActive(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6282611ad71SToby Isaac #define PetscLogStageGetActive(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6292611ad71SToby Isaac #define PetscLogStageGetVisible(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6302611ad71SToby Isaac #define PetscLogStageSetVisible(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6312611ad71SToby Isaac #define PetscLogStageGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 63253e0a2f3SToby Isaac #define PetscLogStageGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6338b08f494SToby Isaac #define PetscLogStageGetPerfInfo(a, b) ((void)(a), *(b) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 634f5d6ab90SLisandro Dalcin 6352611ad71SToby Isaac #define PetscLogEventRegister(a, b, c) ((void)(a), (void)(b), *(c) = -1, PETSC_SUCCESS) 6362611ad71SToby Isaac #define PetscLogEventSetCollective(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6372611ad71SToby Isaac #define PetscLogEventIncludeClass(a) ((void)(a), PETSC_SUCCESS) 6382611ad71SToby Isaac #define PetscLogEventExcludeClass(a) ((void)(a), PETSC_SUCCESS) 6392611ad71SToby Isaac #define PetscLogEventActivate(a) ((void)(a), PETSC_SUCCESS) 6402611ad71SToby Isaac #define PetscLogEventDeactivate(a) ((void)(a), PETSC_SUCCESS) 6412611ad71SToby Isaac #define PetscLogEventDeactivatePush(a) ((void)(a), PETSC_SUCCESS) 6422611ad71SToby Isaac #define PetscLogEventDeactivatePop(a) ((void)(a), PETSC_SUCCESS) 6432611ad71SToby Isaac #define PetscLogEventActivateClass(a) ((void)(a), PETSC_SUCCESS) 6442611ad71SToby Isaac #define PetscLogEventDeactivateClass(a) ((void)(a), PETSC_SUCCESS) 6452611ad71SToby Isaac #define PetscLogEventSetActiveAll(a, b) ((void)(a), PETSC_SUCCESS) 6462611ad71SToby Isaac #define PetscLogEventGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 64753e0a2f3SToby Isaac #define PetscLogEventGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6482611ad71SToby Isaac #define PetscLogEventGetPerfInfo(a, b, c) ((void)(a), (void)(b), *(c) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 6492611ad71SToby Isaac 6502611ad71SToby Isaac #define PetscLogEventSetDof(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 6512611ad71SToby Isaac #define PetscLogEventSetError(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 65253e0a2f3SToby Isaac #define PetscLogEventsPause() PETSC_SUCCESS 65353e0a2f3SToby Isaac #define PetscLogEventsResume() PETSC_SUCCESS 65453e0a2f3SToby Isaac 65553e0a2f3SToby Isaac #define PetscLogClassGetClassId(a, b) (*(b) = -1, PETSC_SUCCESS) 65653e0a2f3SToby Isaac #define PetscLogClassIdGetName(a, b) (*(b) = NULL, PETSC_SUCCESS) 65777c4ece6SBarry Smith 6582611ad71SToby Isaac #define PetscLogObjectCreate(h) ((void)(h), PETSC_SUCCESS) 6592611ad71SToby Isaac #define PetscLogObjectDestroy(h) ((void)(h), PETSC_SUCCESS) 6602611ad71SToby Isaac #define PetscLogObjectState(h, c, ...) ((void)(h), (void)(c), PETSC_SUCCESS) 661fa2bb9feSLisandro Dalcin 6623ba16761SJacob Faibussowitsch #define PetscLogDefaultBegin() PETSC_SUCCESS 6633ba16761SJacob Faibussowitsch #define PetscLogNestedBegin() PETSC_SUCCESS 6642611ad71SToby Isaac #define PetscLogTraceBegin(file) ((void)(file), PETSC_SUCCESS) 6652611ad71SToby Isaac #define PetscLogMPEBegin() PETSC_SUCCESS 66653e0a2f3SToby Isaac #define PetscLogPerfstubsBegin() PETSC_SUCCESS 66753e0a2f3SToby Isaac #define PetscLogLegacyCallbacksBegin(a, b, c, d) ((void)(a), (void)(b), (void)(c), (void)(d), PETSC_SUCCESS) 6682611ad71SToby Isaac #define PetscLogActions(a) ((void)(a), PETSC_SUCCESS) 6692611ad71SToby Isaac #define PetscLogObjects(a) ((void)(a), PETSC_SUCCESS) 6702611ad71SToby Isaac #define PetscLogSetThreshold(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 67153e0a2f3SToby Isaac 6723ba16761SJacob Faibussowitsch #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, PETSC_SUCCESS) 673fa2bb9feSLisandro Dalcin 6742611ad71SToby Isaac #define PetscLogView(viewer) ((void)(viewer), PETSC_SUCCESS) 6753ba16761SJacob Faibussowitsch #define PetscLogViewFromOptions() PETSC_SUCCESS 6762611ad71SToby Isaac #define PetscLogDump(c) ((void)(c), PETSC_SUCCESS) 6772611ad71SToby Isaac #define PetscLogMPEDump(c) ((void)(c), PETSC_SUCCESS) 678fa2bb9feSLisandro Dalcin 6792611ad71SToby Isaac #define PetscLogEventSync(e, comm) ((void)(e), (void)(comm), PETSC_SUCCESS) 6802611ad71SToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 6812611ad71SToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 682ce6058e1SBarry Smith 68323c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 68423c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 68523c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 68623c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 68723c86b1bSSatish Balay 68823c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 68923c86b1bSSatish Balay 690204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 691204a6943SJed Brown do { \ 692204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 693204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 694166c7f25SBarry Smith PetscLogStage _stageNum; \ 6959566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 696204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 697204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 698960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 699960d3302SJed Brown for (PetscPreLoadIt = (_stageNum == -1) ? 0 : PetscPreLoadMax; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 700960d3302SJed Brown PetscPreLoadingOn = (PetscBool)(PetscPreLoadIt < PetscPreLoadMax); \ 7019566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 702960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 703960d3302SJed Brown PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(PetscPreLoadIt == PetscPreLoadMax))); \ 704a8f51744SPierre Jolivet PetscCall(PetscLogStagePush(_stageNum)) 7058e58c17dSMatthew Knepley 706204a6943SJed Brown #define PetscPreLoadEnd() \ 7079566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 708043328b6SSatish Balay } \ 7099371c9d4SSatish Balay } \ 7109371c9d4SSatish Balay while (0) 7118e58c17dSMatthew Knepley 7129371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 7139371c9d4SSatish Balay do { \ 7149566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 715960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 716960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 7179566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 7189566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 719204a6943SJed Brown } while (0) 720e9fa29b7SSatish Balay 721ad14c47eSJed Brown /* some vars for logging */ 722ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 723ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 724ad14c47eSJed Brown 725c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 726c708d6e3SStefano Zampini 727c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 728c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 729c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 730*5268dc8aSHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuEnergy(void); 731*5268dc8aSHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuEnergyMeter(void); 732*5268dc8aSHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuEnergyMeterBegin(void); 733*5268dc8aSHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuEnergyMeterEnd(void); 734c708d6e3SStefano Zampini 735cc4c1da9SBarry Smith /*@ 736c708d6e3SStefano Zampini PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 737c708d6e3SStefano Zampini 738c708d6e3SStefano Zampini Input Parameter: 739c708d6e3SStefano Zampini . flops - the number of flops 740c708d6e3SStefano Zampini 741c200f75eSSatish Balay Level: intermediate 742c200f75eSSatish Balay 743c708d6e3SStefano Zampini Notes: 744c708d6e3SStefano Zampini To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 745c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 746c708d6e3SStefano Zampini 747c708d6e3SStefano 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 748c708d6e3SStefano Zampini just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 749c708d6e3SStefano Zampini 750cc4c1da9SBarry Smith Developer Note: 751cc4c1da9SBarry Smith Currently Fortran stub generator cannot run through files in include 752cc4c1da9SBarry Smith 753c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 754c708d6e3SStefano Zampini @*/ 755c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 756c708d6e3SStefano Zampini { 757c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 7583ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n)); 7593ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n)); 7603ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 761c708d6e3SStefano Zampini } 762c708d6e3SStefano Zampini 763c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 764c708d6e3SStefano Zampini { 7653ba16761SJacob Faibussowitsch return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t); 766c708d6e3SStefano Zampini } 767c708d6e3SStefano Zampini 768c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 769c708d6e3SStefano Zampini { 7703ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size); 771c708d6e3SStefano Zampini } 772c708d6e3SStefano Zampini 773c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 774c708d6e3SStefano Zampini { 7753ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size); 776c708d6e3SStefano Zampini } 777c708d6e3SStefano Zampini 778c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 779c708d6e3SStefano Zampini { 7803ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size); 781c708d6e3SStefano Zampini } 782c708d6e3SStefano Zampini 783c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 784c708d6e3SStefano Zampini { 7853ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size); 786c708d6e3SStefano Zampini } 787c708d6e3SStefano Zampini #else 788c708d6e3SStefano Zampini 7893ba16761SJacob Faibussowitsch #define PetscLogCpuToGpu(a) PETSC_SUCCESS 7903ba16761SJacob Faibussowitsch #define PetscLogGpuToCpu(a) PETSC_SUCCESS 7913ba16761SJacob Faibussowitsch #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS 7923ba16761SJacob Faibussowitsch #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS 7933ba16761SJacob Faibussowitsch #define PetscLogGpuFlops(a) PETSC_SUCCESS 7943ba16761SJacob Faibussowitsch #define PetscLogGpuTime() PETSC_SUCCESS 7953ba16761SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) PETSC_SUCCESS 7963ba16761SJacob Faibussowitsch #define PetscLogGpuTimeBegin() PETSC_SUCCESS 7973ba16761SJacob Faibussowitsch #define PetscLogGpuTimeEnd() PETSC_SUCCESS 798c708d6e3SStefano Zampini 799*5268dc8aSHong Zhang #define PetscLogGpuEnergy() PETSC_SUCCESS 800*5268dc8aSHong Zhang #define PetscLogGpuEnergyMeter() PETSC_SUCCESS 801*5268dc8aSHong Zhang #define PetscLogGpuEnergyMeterBegin() PETSC_SUCCESS 802*5268dc8aSHong Zhang #define PetscLogGpuEnergyMeterEnd() PETSC_SUCCESS 803*5268dc8aSHong Zhang 804c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 805c708d6e3SStefano Zampini 806c708d6e3SStefano Zampini /* remove TLS defines */ 807c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS 808c708d6e3SStefano Zampini #undef PETSC_TLS 809c708d6e3SStefano Zampini 810b665b14eSToby Isaac #include <petsclogdeprecated.h> 811