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 171*cac61b71SSatish Balay #endif 172*cac61b71SSatish Balay #if defined(PETSC_HAVE_THREADSAFETY) && defined(PETSC_USE_LOG) 173*cac61b71SSatish Balay PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 174*cac61b71SSatish Balay PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 175*cac61b71SSatish 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; 2422611ad71SToby Isaac 2432611ad71SToby Isaac /* Thread local storage */ 2442611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th; 2452611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th; 2462611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th; 2472611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th; 2482611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th; 2492611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th; 2502611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th; 2512611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th; 2522611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th; 2532611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th; 2542611ad71SToby Isaac 2552611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogMemory; 2562611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 2572611ad71SToby Isaac 2582611ad71SToby Isaac PETSC_EXTERN PetscLogState petsc_log_state; 2592611ad71SToby Isaac 2602611ad71SToby Isaac #define PETSC_LOG_HANDLER_MAX 4 2612611ad71SToby Isaac PETSC_EXTERN PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX]; 2622611ad71SToby Isaac 263aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 264fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 26577c4ece6SBarry Smith 2663ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 267fa2bb9feSLisandro Dalcin 2688ba1e511SMatthew Knepley /* Initialization functions */ 269bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 270bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 271014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 2722611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 2732611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogPerfstubsBegin(void); 2742611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogLegacyCallbacksBegin(PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscObject), PetscErrorCode (*)(PetscObject)); 275014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 277fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 278fa2bb9feSLisandro Dalcin 2798ba1e511SMatthew Knepley /* Output functions */ 280014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 281f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 282014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 2832611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 28431d06abdSBarry Smith 28553e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetState(PetscLogState *); 286b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *); 28753e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStart(PetscLogHandler); 28853e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStop(PetscLogHandler); 28953e0a2f3SToby Isaac 2904dd65854SConnor Ward /* Status checking functions */ 2914dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 2924dd65854SConnor Ward 293fa2bb9feSLisandro Dalcin /* Stage functions */ 294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 298014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 299014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 300014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 30253e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetName(PetscLogEvent, const char **); 3038b08f494SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage, PetscEventPerfInfo *); 304f5d6ab90SLisandro Dalcin 3058ba1e511SMatthew Knepley /* Event functions */ 306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 307217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 308fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 309fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 312c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 313c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3178c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 31853e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetName(PetscLogEvent, const char **); 31953e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage, PetscLogEvent, PetscEventPerfInfo *); 320891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3215d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 32253e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsPause(void); 32353e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsResume(void); 32453e0a2f3SToby Isaac 32553e0a2f3SToby Isaac /* Class functions */ 32653e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassGetClassId(const char[], PetscClassId *); 32753e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassIdGetName(PetscClassId, const char **); 3288ba1e511SMatthew Knepley 32952e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm) 330b665b14eSToby Isaac { 331b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 332b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 333b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 334b665b14eSToby Isaac if (h->eventSync) { 335f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventSync)(h->handler, e, comm); 336b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 337b665b14eSToby Isaac } 338b665b14eSToby Isaac } 339b665b14eSToby Isaac } 340b665b14eSToby Isaac return PETSC_SUCCESS; 341b665b14eSToby Isaac } 34262872c28SLisandro Dalcin 34352e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventBegin_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 344b665b14eSToby Isaac { 345b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 346b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 347b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 348b665b14eSToby Isaac if (h->eventBegin) { 349f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventBegin)(h->handler, e, o1, o2, o3, o4); 350b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 351b665b14eSToby Isaac } 352b665b14eSToby Isaac } 353b665b14eSToby Isaac } 354b665b14eSToby Isaac return PETSC_SUCCESS; 355b665b14eSToby Isaac } 356b665b14eSToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) PetscLogEventBegin_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 35777c4ece6SBarry Smith 35852e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogEventEnd_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 359b665b14eSToby Isaac { 360b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 361b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 362b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 363b665b14eSToby Isaac if (h->eventEnd) { 364f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventEnd)(h->handler, e, o1, o2, o3, o4); 365b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 366b665b14eSToby Isaac } 367b665b14eSToby Isaac } 368b665b14eSToby Isaac } 369b665b14eSToby Isaac return PETSC_SUCCESS; 370b665b14eSToby Isaac } 371b665b14eSToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) PetscLogEventEnd_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 372043328b6SSatish Balay 373b665b14eSToby Isaac /* Object functions */ 37452e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogObjectCreate(PetscObject o) 375b665b14eSToby Isaac { 376b665b14eSToby Isaac if (petsc_log_state) { 377b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 378b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 379b665b14eSToby Isaac if (h->objectCreate) { 380f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectCreate)(h->handler, o); 381b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 382b665b14eSToby Isaac } 383b665b14eSToby Isaac } 384b665b14eSToby Isaac } 385b665b14eSToby Isaac return PETSC_SUCCESS; 386b665b14eSToby Isaac } 38777c4ece6SBarry Smith 38852e36f93SLisandro Dalcin static inline PetscErrorCode PetscLogObjectDestroy(PetscObject o) 389b665b14eSToby Isaac { 390b665b14eSToby Isaac if (petsc_log_state) { 391b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 392b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 393b665b14eSToby Isaac if (h->objectDestroy) { 394f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectDestroy)(h->handler, o); 395b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 396b665b14eSToby Isaac } 397b665b14eSToby Isaac } 398b665b14eSToby Isaac } 399b665b14eSToby Isaac return PETSC_SUCCESS; 400b665b14eSToby Isaac } 401003131ecSBarry Smith 402c708d6e3SStefano Zampini /* 403c708d6e3SStefano Zampini Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 404c708d6e3SStefano Zampini 405c708d6e3SStefano Zampini For the complex numbers version, note that 406c708d6e3SStefano Zampini 1 complex addition = 2 flops 407c708d6e3SStefano Zampini 1 complex multiplication = 6 flops, 408c708d6e3SStefano Zampini where we define 1 flop as that for a double precision scalar. We roughly approximate 409c708d6e3SStefano Zampini flop counting for complex numbers by multiplying the total flops by 4; this corresponds 410c708d6e3SStefano Zampini to the assumption that we're counting mostly additions and multiplications -- and 411c708d6e3SStefano Zampini roughly the same number of each. More accurate counting could be done by distinguishing 412c708d6e3SStefano Zampini among the various arithmetic operations. 413c708d6e3SStefano Zampini */ 414c708d6e3SStefano Zampini 415c708d6e3SStefano Zampini #if defined(PETSC_USE_COMPLEX) 416c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 4.0 417c708d6e3SStefano Zampini #else 418c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 1.0 419c708d6e3SStefano Zampini #endif 420c708d6e3SStefano Zampini 4215d83a8b1SBarry Smith /*@ 422c708d6e3SStefano Zampini PetscLogFlops - Log how many flops are performed in a calculation 423c708d6e3SStefano Zampini 424c708d6e3SStefano Zampini Input Parameter: 425c708d6e3SStefano Zampini . flops - the number of flops 426c708d6e3SStefano Zampini 427c708d6e3SStefano Zampini Level: intermediate 428c708d6e3SStefano Zampini 429c200f75eSSatish Balay Note: 430c200f75eSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 431c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 432c200f75eSSatish Balay 433c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()` 434c708d6e3SStefano Zampini @*/ 435c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 436c708d6e3SStefano Zampini { 437c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 438c708d6e3SStefano Zampini return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n); 439c708d6e3SStefano Zampini } 440c708d6e3SStefano Zampini 441ce85283eSBarry Smith /* 442f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 443f621e05eSBarry Smith their sizes. 444f621e05eSBarry Smith 445af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 446ce85283eSBarry Smith uses macros to defined the MPI operations. 44715308354SBarry Smith 44815308354SBarry Smith It does not work correctly from HP-UX because it processes the 449bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 450b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4517c1e34a4SSatish Balay 452f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 453ce85283eSBarry Smith */ 454d5bc873cSPierre Jolivet #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 45577a39924SBarry Smith /* 45677a39924SBarry Smith Logging of MPI activities 45777a39924SBarry Smith */ 4586497c311SBarry Smith static inline PetscErrorCode PetscMPITypeSize(PetscCount count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 459d71ae5a4SJacob Faibussowitsch { 460f12d10ccSJunchao Zhang PetscMPIInt typesize; 4615f80ce2aSJacob Faibussowitsch 4623ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 464c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize)); 465f95db71bSBarry Smith } 46677a39924SBarry Smith 467c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 468d71ae5a4SJacob Faibussowitsch { 469f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 470c708d6e3SStefano Zampini PetscLogDouble l; 4713b9284c0SMatthew G Knepley 4723ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4739566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4749566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 475c708d6e3SStefano Zampini for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize); 476c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, l); 4773b9284c0SMatthew G Knepley } 4783b9284c0SMatthew G Knepley 47972b11a25SBarry Smith /* 48072b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 48172b11a25SBarry Smith */ 482d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 483d71ae5a4SJacob Faibussowitsch { 4849371c9d4SSatish Balay PetscMPIInt size; 4859371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4869371c9d4SSatish Balay return size > 1; 48772b11a25SBarry Smith } 48872b11a25SBarry Smith 489c708d6e3SStefano Zampini #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \ 490c708d6e3SStefano 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))) 49115308354SBarry Smith 492c708d6e3SStefano Zampini #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \ 493c708d6e3SStefano 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))) 494c87b50c4SJunchao Zhang 495c708d6e3SStefano Zampini #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \ 496c708d6e3SStefano 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))) 49715308354SBarry Smith 498c708d6e3SStefano Zampini #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \ 499c708d6e3SStefano 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))) 500c87b50c4SJunchao Zhang 501c708d6e3SStefano Zampini #define MPI_Startall_irecv(count, datatype, number, requests) \ 502c708d6e3SStefano 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)))) 5030d4b0b6cSBarry Smith 504c708d6e3SStefano Zampini #define MPI_Startall_isend(count, datatype, number, requests) \ 505c708d6e3SStefano 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)))) 5060d4b0b6cSBarry Smith 507f4f49eeaSPierre 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)) 5080d4b0b6cSBarry Smith 509c708d6e3SStefano Zampini #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \ 510c708d6e3SStefano 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))) 51115308354SBarry Smith 512c708d6e3SStefano Zampini #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \ 513c708d6e3SStefano 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))) 514c87b50c4SJunchao Zhang 515c708d6e3SStefano Zampini #define MPI_Send(buf, count, datatype, dest, tag, comm) \ 516c708d6e3SStefano 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))) 51777a39924SBarry Smith 518c708d6e3SStefano Zampini #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \ 519c708d6e3SStefano 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))) 520c87b50c4SJunchao Zhang 521c708d6e3SStefano 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))) 52277a39924SBarry Smith 523c708d6e3SStefano 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))) 52477a39924SBarry Smith 525c708d6e3SStefano Zampini #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 526c708d6e3SStefano 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))) 52777a39924SBarry Smith 528c708d6e3SStefano 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))) 5293914022bSBarry Smith 530c708d6e3SStefano 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))) 53154fe5c21SBarry Smith 532c708d6e3SStefano Zampini #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \ 533c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 534d6e4c47cSJed Brown 5353b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 536c708d6e3SStefano 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))) 5373b9284c0SMatthew G Knepley 5383b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 539c708d6e3SStefano 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))) 5403b9284c0SMatthew G Knepley 541c708d6e3SStefano Zampini #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 542c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 54301faf4e4SMatthew Knepley 54401faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 545c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm))) 54601faf4e4SMatthew Knepley 54701faf4e4SMatthew Knepley #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 548c708d6e3SStefano 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))) 54901faf4e4SMatthew Knepley 55001faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 551c708d6e3SStefano 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))) 55201faf4e4SMatthew Knepley 55301faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 554c708d6e3SStefano 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))) 55501faf4e4SMatthew Knepley 55601faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 557c708d6e3SStefano 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))) 558f12d10ccSJunchao Zhang 559f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 560c708d6e3SStefano 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))) 561f12d10ccSJunchao Zhang 562f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 563c708d6e3SStefano 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))) 564f12d10ccSJunchao Zhang 565f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 566c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 567f12d10ccSJunchao Zhang 568f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \ 569c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request))) 570f12d10ccSJunchao Zhang 571f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 572c708d6e3SStefano 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))) 573f12d10ccSJunchao Zhang 574f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 575c708d6e3SStefano 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))) 576f12d10ccSJunchao Zhang 577f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 578c708d6e3SStefano 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))) 579f12d10ccSJunchao Zhang 580f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 581c708d6e3SStefano 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))) 582f12d10ccSJunchao Zhang 583715b587bSJunchao Zhang #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \ 584715b587bSJunchao 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))) 585715b587bSJunchao Zhang 586715b587bSJunchao Zhang #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \ 587715b587bSJunchao 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))) 588715b587bSJunchao Zhang 589715b587bSJunchao Zhang #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \ 590715b587bSJunchao 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))) 591715b587bSJunchao Zhang 592715b587bSJunchao Zhang #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \ 593715b587bSJunchao 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))) 594715b587bSJunchao Zhang 595715b587bSJunchao Zhang #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \ 596715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 597715b587bSJunchao Zhang 598715b587bSJunchao 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))) 599715b587bSJunchao Zhang 600715b587bSJunchao Zhang #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \ 601715b587bSJunchao 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))) 6020d4b0b6cSBarry Smith #else 6030d4b0b6cSBarry Smith 6049371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6050d4b0b6cSBarry Smith 6069371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6070d4b0b6cSBarry Smith 608f4f49eeaSPierre Jolivet #define MPI_Start_isend(count, datatype, requests) (MPI_Start(requests)) 6090d4b0b6cSBarry Smith 610c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 611614700edSBarry Smith 612df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 613614700edSBarry Smith 61453e0a2f3SToby Isaac #define PetscLogGetState(a) (*(a) = NULL, PETSC_SUCCESS) 615b665b14eSToby Isaac #define PetscLogGetDefaultHandler(a) (*(a) = NULL, PETSC_SUCCESS) 61653e0a2f3SToby Isaac #define PetscLogHandlerStart(a) ((void)(a), PETSC_SUCCESS) 61753e0a2f3SToby Isaac #define PetscLogHandlerStop(a) ((void)(a), PETSC_SUCCESS) 61853e0a2f3SToby Isaac 6193ba16761SJacob Faibussowitsch #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS) 6203ba16761SJacob Faibussowitsch #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS) 621614700edSBarry Smith 6222611ad71SToby Isaac #define PetscLogStageRegister(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 6232611ad71SToby Isaac #define PetscLogStagePush(a) ((void)(a), PETSC_SUCCESS) 6243ba16761SJacob Faibussowitsch #define PetscLogStagePop() PETSC_SUCCESS 6252611ad71SToby Isaac #define PetscLogStageSetActive(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6262611ad71SToby Isaac #define PetscLogStageGetActive(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6272611ad71SToby Isaac #define PetscLogStageGetVisible(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6282611ad71SToby Isaac #define PetscLogStageSetVisible(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6292611ad71SToby Isaac #define PetscLogStageGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 63053e0a2f3SToby Isaac #define PetscLogStageGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6318b08f494SToby Isaac #define PetscLogStageGetPerfInfo(a, b) ((void)(a), *(b) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 632f5d6ab90SLisandro Dalcin 6332611ad71SToby Isaac #define PetscLogEventRegister(a, b, c) ((void)(a), (void)(b), *(c) = -1, PETSC_SUCCESS) 6342611ad71SToby Isaac #define PetscLogEventSetCollective(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6352611ad71SToby Isaac #define PetscLogEventIncludeClass(a) ((void)(a), PETSC_SUCCESS) 6362611ad71SToby Isaac #define PetscLogEventExcludeClass(a) ((void)(a), PETSC_SUCCESS) 6372611ad71SToby Isaac #define PetscLogEventActivate(a) ((void)(a), PETSC_SUCCESS) 6382611ad71SToby Isaac #define PetscLogEventDeactivate(a) ((void)(a), PETSC_SUCCESS) 6392611ad71SToby Isaac #define PetscLogEventDeactivatePush(a) ((void)(a), PETSC_SUCCESS) 6402611ad71SToby Isaac #define PetscLogEventDeactivatePop(a) ((void)(a), PETSC_SUCCESS) 6412611ad71SToby Isaac #define PetscLogEventActivateClass(a) ((void)(a), PETSC_SUCCESS) 6422611ad71SToby Isaac #define PetscLogEventDeactivateClass(a) ((void)(a), PETSC_SUCCESS) 6432611ad71SToby Isaac #define PetscLogEventSetActiveAll(a, b) ((void)(a), PETSC_SUCCESS) 6442611ad71SToby Isaac #define PetscLogEventGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 64553e0a2f3SToby Isaac #define PetscLogEventGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6462611ad71SToby Isaac #define PetscLogEventGetPerfInfo(a, b, c) ((void)(a), (void)(b), *(c) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 6472611ad71SToby Isaac 6482611ad71SToby Isaac #define PetscLogEventSetDof(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 6492611ad71SToby Isaac #define PetscLogEventSetError(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 65053e0a2f3SToby Isaac #define PetscLogEventsPause() PETSC_SUCCESS 65153e0a2f3SToby Isaac #define PetscLogEventsResume() PETSC_SUCCESS 65253e0a2f3SToby Isaac 65353e0a2f3SToby Isaac #define PetscLogClassGetClassId(a, b) (*(b) = -1, PETSC_SUCCESS) 65453e0a2f3SToby Isaac #define PetscLogClassIdGetName(a, b) (*(b) = NULL, PETSC_SUCCESS) 65577c4ece6SBarry Smith 6562611ad71SToby Isaac #define PetscLogObjectCreate(h) ((void)(h), PETSC_SUCCESS) 6572611ad71SToby Isaac #define PetscLogObjectDestroy(h) ((void)(h), PETSC_SUCCESS) 6582611ad71SToby Isaac #define PetscLogObjectState(h, c, ...) ((void)(h), (void)(c), PETSC_SUCCESS) 659fa2bb9feSLisandro Dalcin 6603ba16761SJacob Faibussowitsch #define PetscLogDefaultBegin() PETSC_SUCCESS 6613ba16761SJacob Faibussowitsch #define PetscLogNestedBegin() PETSC_SUCCESS 6622611ad71SToby Isaac #define PetscLogTraceBegin(file) ((void)(file), PETSC_SUCCESS) 6632611ad71SToby Isaac #define PetscLogMPEBegin() PETSC_SUCCESS 66453e0a2f3SToby Isaac #define PetscLogPerfstubsBegin() PETSC_SUCCESS 66553e0a2f3SToby Isaac #define PetscLogLegacyCallbacksBegin(a, b, c, d) ((void)(a), (void)(b), (void)(c), (void)(d), PETSC_SUCCESS) 6662611ad71SToby Isaac #define PetscLogActions(a) ((void)(a), PETSC_SUCCESS) 6672611ad71SToby Isaac #define PetscLogObjects(a) ((void)(a), PETSC_SUCCESS) 6682611ad71SToby Isaac #define PetscLogSetThreshold(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 66953e0a2f3SToby Isaac 6703ba16761SJacob Faibussowitsch #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, PETSC_SUCCESS) 671fa2bb9feSLisandro Dalcin 6722611ad71SToby Isaac #define PetscLogView(viewer) ((void)(viewer), PETSC_SUCCESS) 6733ba16761SJacob Faibussowitsch #define PetscLogViewFromOptions() PETSC_SUCCESS 6742611ad71SToby Isaac #define PetscLogDump(c) ((void)(c), PETSC_SUCCESS) 6752611ad71SToby Isaac #define PetscLogMPEDump(c) ((void)(c), PETSC_SUCCESS) 676fa2bb9feSLisandro Dalcin 6772611ad71SToby Isaac #define PetscLogEventSync(e, comm) ((void)(e), (void)(comm), PETSC_SUCCESS) 6782611ad71SToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 6792611ad71SToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 680ce6058e1SBarry Smith 68123c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 68223c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 68323c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 68423c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 68523c86b1bSSatish Balay 68623c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 68723c86b1bSSatish Balay 688204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 689204a6943SJed Brown do { \ 690204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 691204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 692166c7f25SBarry Smith PetscLogStage _stageNum; \ 6939566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 694204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 695204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 696960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 697960d3302SJed Brown for (PetscPreLoadIt = (_stageNum == -1) ? 0 : PetscPreLoadMax; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 698960d3302SJed Brown PetscPreLoadingOn = (PetscBool)(PetscPreLoadIt < PetscPreLoadMax); \ 6999566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 700960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 701960d3302SJed Brown PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(PetscPreLoadIt == PetscPreLoadMax))); \ 702a8f51744SPierre Jolivet PetscCall(PetscLogStagePush(_stageNum)) 7038e58c17dSMatthew Knepley 704204a6943SJed Brown #define PetscPreLoadEnd() \ 7059566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 706043328b6SSatish Balay } \ 7079371c9d4SSatish Balay } \ 7089371c9d4SSatish Balay while (0) 7098e58c17dSMatthew Knepley 7109371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 7119371c9d4SSatish Balay do { \ 7129566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 713960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 714960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 7159566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 7169566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 717204a6943SJed Brown } while (0) 718e9fa29b7SSatish Balay 719ad14c47eSJed Brown /* some vars for logging */ 720ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 721ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 722ad14c47eSJed Brown 723c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 724c708d6e3SStefano Zampini 725c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 726c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 727c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 728c708d6e3SStefano Zampini 729cc4c1da9SBarry Smith /*@ 730c708d6e3SStefano Zampini PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 731c708d6e3SStefano Zampini 732c708d6e3SStefano Zampini Input Parameter: 733c708d6e3SStefano Zampini . flops - the number of flops 734c708d6e3SStefano Zampini 735c200f75eSSatish Balay Level: intermediate 736c200f75eSSatish Balay 737c708d6e3SStefano Zampini Notes: 738c708d6e3SStefano Zampini To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 739c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 740c708d6e3SStefano Zampini 741c708d6e3SStefano 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 742c708d6e3SStefano Zampini just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 743c708d6e3SStefano Zampini 744cc4c1da9SBarry Smith Developer Note: 745cc4c1da9SBarry Smith Currently Fortran stub generator cannot run through files in include 746cc4c1da9SBarry Smith 747c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 748c708d6e3SStefano Zampini @*/ 749c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 750c708d6e3SStefano Zampini { 751c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 7523ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n)); 7533ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n)); 7543ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 755c708d6e3SStefano Zampini } 756c708d6e3SStefano Zampini 757c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 758c708d6e3SStefano Zampini { 7593ba16761SJacob Faibussowitsch return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t); 760c708d6e3SStefano Zampini } 761c708d6e3SStefano Zampini 762c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 763c708d6e3SStefano Zampini { 7643ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size); 765c708d6e3SStefano Zampini } 766c708d6e3SStefano Zampini 767c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 768c708d6e3SStefano Zampini { 7693ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size); 770c708d6e3SStefano Zampini } 771c708d6e3SStefano Zampini 772c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 773c708d6e3SStefano Zampini { 7743ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size); 775c708d6e3SStefano Zampini } 776c708d6e3SStefano Zampini 777c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 778c708d6e3SStefano Zampini { 7793ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size); 780c708d6e3SStefano Zampini } 781c708d6e3SStefano Zampini #else 782c708d6e3SStefano Zampini 7833ba16761SJacob Faibussowitsch #define PetscLogCpuToGpu(a) PETSC_SUCCESS 7843ba16761SJacob Faibussowitsch #define PetscLogGpuToCpu(a) PETSC_SUCCESS 7853ba16761SJacob Faibussowitsch #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS 7863ba16761SJacob Faibussowitsch #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS 7873ba16761SJacob Faibussowitsch #define PetscLogGpuFlops(a) PETSC_SUCCESS 7883ba16761SJacob Faibussowitsch #define PetscLogGpuTime() PETSC_SUCCESS 7893ba16761SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) PETSC_SUCCESS 7903ba16761SJacob Faibussowitsch #define PetscLogGpuTimeBegin() PETSC_SUCCESS 7913ba16761SJacob Faibussowitsch #define PetscLogGpuTimeEnd() PETSC_SUCCESS 792c708d6e3SStefano Zampini 793c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 794c708d6e3SStefano Zampini 795c708d6e3SStefano Zampini /* remove TLS defines */ 796c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS 797c708d6e3SStefano Zampini #undef PETSC_TLS 798c708d6e3SStefano Zampini 799b665b14eSToby Isaac #include <petsclogdeprecated.h> 800