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 111c1ad86eSToby Isaac /* SUBMANSEC = Profiling */ 12ac09b921SBarry Smith 13fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 143ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[], PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(3, 4); 15fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 167d3de750SJacob Faibussowitsch #define PetscInfo(A, ...) PetscInfo_Private(PETSC_FUNCTION_NAME, ((PetscObject)A), __VA_ARGS__) 17fa2bb9feSLisandro Dalcin #else 183ba16761SJacob Faibussowitsch #define PetscInfo(A, ...) PETSC_SUCCESS 19fa2bb9feSLisandro Dalcin #endif 20e94e781bSJacob Faibussowitsch 21edd03b47SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 22edd03b47SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 23edd03b47SJacob Faibussowitsch #define PetscInfo3(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 24edd03b47SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 25edd03b47SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 26edd03b47SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 27edd03b47SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 28edd03b47SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 29edd03b47SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO(3, 17, 0, "PetscInfo()", ) PetscInfo(__VA_ARGS__) 307d3de750SJacob Faibussowitsch 31e94e781bSJacob Faibussowitsch /*E 3216a05f60SBarry Smith PetscInfoCommFlag - Describes the method by which to filter information displayed by `PetscInfo()` by communicator size 33e94e781bSJacob Faibussowitsch 34667f096bSBarry Smith Values: 35d1f92df0SBarry Smith + `PETSC_INFO_COMM_ALL` - Default uninitialized value. `PetscInfo()` will not filter based on 368b86dd2eSJacob Faibussowitsch communicator size (i.e. will print for all communicators) 37d1f92df0SBarry Smith . `PETSC_INFO_COMM_NO_SELF` - `PetscInfo()` will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 38d1f92df0SBarry Smith - `PETSC_INFO_COMM_ONLY_SELF` - `PetscInfo()` will ONLY print for communicators with size = 1 39e94e781bSJacob Faibussowitsch 40e94e781bSJacob Faibussowitsch Level: intermediate 41e94e781bSJacob Faibussowitsch 42667f096bSBarry Smith Note: 43667f096bSBarry Smith Used as an input for `PetscInfoSetFilterCommSelf()` 44667f096bSBarry Smith 45db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`, `PetscInfoSetFilterCommSelf()` 46e94e781bSJacob Faibussowitsch E*/ 47e94e781bSJacob Faibussowitsch typedef enum { 48e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 49e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 50e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 51e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 52e94e781bSJacob Faibussowitsch 53e94e781bSJacob Faibussowitsch PETSC_EXTERN const char *const PetscInfoCommFlags[]; 54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 55fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[], const char[]); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **, FILE **); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool, PetscInt, const char *const *); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *, PetscBool *, PetscBool *, PetscBool *, PetscInfoCommFlag *); 638b86dd2eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[], PetscInt, const PetscClassId[]); 64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 67fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 68fa2bb9feSLisandro Dalcin 691c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *); 701c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack); 711c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int); 721c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *); 731c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *); 741c1ad86eSToby Isaac PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool *); 751c1ad86eSToby Isaac 766873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateCreate(PetscLogState *); 776873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateDestroy(PetscLogState *); 786873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetRegistry(PetscLogState, PetscLogRegistry *); 796873511fSToby Isaac 806873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassRegister(PetscLogState, const char[], PetscClassId, PetscLogStage *); 816873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassSetActive(PetscLogState, PetscLogStage, PetscClassId, PetscBool); 826873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassSetActiveAll(PetscLogState, PetscClassId, PetscBool); 836873511fSToby Isaac 846873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageRegister(PetscLogState, const char[], PetscLogStage *); 856873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStagePush(PetscLogState, PetscLogStage); 866873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStagePop(PetscLogState); 876873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageSetActive(PetscLogState, PetscLogStage, PetscBool); 886873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageGetActive(PetscLogState, PetscLogStage, PetscBool *); 896873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetCurrentStage(PetscLogState, PetscLogStage *); 906873511fSToby Isaac 916873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventRegister(PetscLogState, const char[], PetscClassId, PetscLogEvent *); 926873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetCollective(PetscLogState, PetscLogEvent, PetscBool); 936873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetActive(PetscLogState, PetscLogStage, PetscLogEvent, PetscBool); 946873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventSetActiveAll(PetscLogState, PetscLogEvent, PetscBool); 956873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventGetActive(PetscLogState, PetscLogStage, PetscLogEvent, PetscBool *); 966873511fSToby Isaac 976873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetEventFromName(PetscLogState, const char[], PetscLogEvent *); 986873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetStageFromName(PetscLogState, const char[], PetscLogStage *); 996873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetClassFromName(PetscLogState, const char[], PetscLogClass *); 1006873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetClassFromClassId(PetscLogState, PetscClassId, PetscLogClass *); 1016873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumEvents(PetscLogState, PetscInt *); 1026873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumStages(PetscLogState, PetscInt *); 1036873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateGetNumClasses(PetscLogState, PetscInt *); 1046873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateEventGetInfo(PetscLogState, PetscLogEvent, PetscLogEventInfo *); 1056873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateStageGetInfo(PetscLogState, PetscLogStage, PetscLogStageInfo *); 1066873511fSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStateClassGetInfo(PetscLogState, PetscLogClass, PetscLogClassInfo *); 1076873511fSToby Isaac 10819ef957cSToby Isaac PETSC_EXTERN PetscClassId PETSCLOGHANDLER_CLASSID; 10919ef957cSToby Isaac 11019ef957cSToby Isaac PETSC_EXTERN PetscFunctionList PetscLogHandlerList; 11119ef957cSToby Isaac 11219ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerRegister(const char[], PetscErrorCode (*)(PetscLogHandler)); 11319ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *); 11419ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetType(PetscLogHandler, PetscLogHandlerType); 11519ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetType(PetscLogHandler, PetscLogHandlerType *); 11619ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerDestroy(PetscLogHandler *); 11719ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetState(PetscLogHandler, PetscLogState); 11819ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetState(PetscLogHandler, PetscLogState *); 11919ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventBegin(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 12019ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventEnd(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 12119ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventSync(PetscLogHandler, PetscLogEvent, MPI_Comm); 12219ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerObjectCreate(PetscLogHandler, PetscObject); 12319ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerObjectDestroy(PetscLogHandler, PetscObject); 12419ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStagePush(PetscLogHandler, PetscLogStage); 12519ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStagePop(PetscLogHandler, PetscLogStage); 12619ef957cSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerView(PetscLogHandler, PetscViewer); 12719ef957cSToby Isaac 128dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetEventPerfInfo(PetscLogHandler, PetscLogStage, PetscLogEvent, PetscEventPerfInfo **); 1298b08f494SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetStagePerfInfo(PetscLogHandler, PetscLogStage, PetscEventPerfInfo **); 130dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetLogActions(PetscLogHandler, PetscBool); 131dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerSetLogObjects(PetscLogHandler, PetscBool); 132dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerLogObjectState(PetscLogHandler, PetscObject, const char[], ...); 133dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerGetNumObjects(PetscLogHandler, PetscInt *); 134dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventDeactivatePush(PetscLogHandler, PetscLogStage, PetscLogEvent); 135dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventDeactivatePop(PetscLogHandler, PetscLogStage, PetscLogEvent); 136dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventsPause(PetscLogHandler); 137dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerEventsResume(PetscLogHandler); 138dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerDump(PetscLogHandler, const char[]); 139dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStageSetVisible(PetscLogHandler, PetscLogStage, PetscBool); 140dff009beSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStageGetVisible(PetscLogHandler, PetscLogStage, PetscBool *); 141dff009beSToby Isaac 1426467efc9SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerCreateTrace(MPI_Comm, FILE *, PetscLogHandler *); 143b665b14eSToby 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 *); 1446467efc9SToby Isaac 1456873511fSToby Isaac /* All events are inactive if an invalid stage is set, like if there have been more stage pops than stage pushes */ 1466873511fSToby Isaac #define PetscLogStateStageEventIsActive(state, stage, event) ((stage >= 0) && PetscBTLookup((state)->active, (stage)) && PetscBTLookup((state)->active, (stage) + (event + 1) * (state)->bt_num_stages)) 147b665b14eSToby Isaac #define PetscLogStateEventCurrentlyActive(state, event) ((state) && PetscLogStateStageEventIsActive(state, (state)->current_stage, event)) 1486873511fSToby Isaac 14953e0a2f3SToby Isaac /* PetscLogHandler with critical methods exposed for speed */ 15053e0a2f3SToby Isaac typedef struct _n_PetscLogHandlerHot { 15153e0a2f3SToby Isaac PetscLogHandler handler; 15253e0a2f3SToby Isaac PetscErrorCode (*eventBegin)(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 15353e0a2f3SToby Isaac PetscErrorCode (*eventEnd)(PetscLogHandler, PetscLogEvent, PetscObject, PetscObject, PetscObject, PetscObject); 15453e0a2f3SToby Isaac PetscErrorCode (*eventSync)(PetscLogHandler, PetscLogEvent, MPI_Comm); 15553e0a2f3SToby Isaac PetscErrorCode (*objectCreate)(PetscLogHandler, PetscObject); 15653e0a2f3SToby Isaac PetscErrorCode (*objectDestroy)(PetscLogHandler, PetscObject); 15753e0a2f3SToby Isaac } PetscLogHandlerHot; 15853e0a2f3SToby Isaac 159c708d6e3SStefano Zampini /* Handle multithreading */ 160c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 161c708d6e3SStefano Zampini #if defined(__cplusplus) 162c708d6e3SStefano Zampini #define PETSC_TLS thread_local 163c708d6e3SStefano Zampini #else 164c708d6e3SStefano Zampini #define PETSC_TLS _Thread_local 165c708d6e3SStefano Zampini #endif 166c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS extern PETSC_TLS PETSC_VISIBILITY_PUBLIC 167c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDouble(PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 168c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble *, PetscLogDouble); 169c708d6e3SStefano Zampini #else 170c708d6e3SStefano Zampini #define PETSC_EXTERN_TLS PETSC_EXTERN 171c708d6e3SStefano Zampini #define PETSC_TLS 1723ba16761SJacob Faibussowitsch #define PetscAddLogDouble(a, b, c) ((PetscErrorCode)((*(a) += (c), PETSC_SUCCESS) || ((*(b) += (c)), PETSC_SUCCESS))) 1733ba16761SJacob Faibussowitsch #define PetscAddLogDoubleCnt(a, b, c, d, e) ((PetscErrorCode)(PetscAddLogDouble(a, c, 1) || PetscAddLogDouble(b, d, e))) 174c708d6e3SStefano Zampini #endif 17519b02663SBarry Smith 176edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectParent()", ) static inline PetscErrorCode PetscLogObjectParent(PetscObject o, PetscObject p) 177d71ae5a4SJacob Faibussowitsch { 1784f839811SJacob Faibussowitsch (void)o; 1794f839811SJacob Faibussowitsch (void)p; 1803ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1814dfa11a4SJacob Faibussowitsch } 1822611ad71SToby Isaac #define PetscLogObjectParents(p, n, d) PetscMacroReturnStandard(for (int _i = 0; _i < (n); ++_i) PetscCall(PetscLogObjectParent((PetscObject)(p), (PetscObject)(d)[_i]));) 1834dfa11a4SJacob Faibussowitsch 184edd03b47SJacob Faibussowitsch PETSC_DEPRECATED_FUNCTION(3, 18, 0, "PetscLogObjectMemory()", ) static inline PetscErrorCode PetscLogObjectMemory(PetscObject o, PetscLogDouble m) 185d71ae5a4SJacob Faibussowitsch { 1864f839811SJacob Faibussowitsch (void)o; 1874f839811SJacob Faibussowitsch (void)m; 1883ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1894dfa11a4SJacob Faibussowitsch } 1903bb1ff40SBarry Smith 1912611ad71SToby Isaac /* Global flop counter */ 1922611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 1932611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 1942611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_isend_ct; 1952611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_recv_ct; 1962611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_send_ct; 1972611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_irecv_len; 1982611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_isend_len; 1992611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_recv_len; 2002611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_send_len; 2012611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 2022611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gather_ct; 2032611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 2042611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_ct; 2052611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 2062611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 2072611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 2082611ad71SToby Isaac 2092611ad71SToby Isaac /* Thread local storage */ 2102611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_TotalFlops_th; 2112611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_ct_th; 2122611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_isend_ct_th; 2132611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_recv_ct_th; 2142611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_send_ct_th; 2152611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_irecv_len_th; 2162611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_isend_len_th; 2172611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_recv_len_th; 2182611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_send_len_th; 2192611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_allreduce_ct_th; 2202611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gather_ct_th; 2212611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_scatter_ct_th; 2222611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_ct_th; 2232611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_any_ct_th; 2242611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_wait_all_ct_th; 2252611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_sum_of_waits_ct_th; 2262611ad71SToby Isaac 2272611ad71SToby Isaac /* Global GPU counters */ 2282611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 2292611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 2302611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 2312611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 2322611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 2332611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 2342611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 2352611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 2362611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gflops; 2372611ad71SToby Isaac PETSC_EXTERN PetscLogDouble petsc_gtime; 2382611ad71SToby Isaac 2392611ad71SToby Isaac /* Thread local storage */ 2402611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_th; 2412611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_th; 2422611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_th; 2432611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_th; 2442611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_ct_scalar_th; 2452611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_ct_scalar_th; 2462611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_ctog_sz_scalar_th; 2472611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtoc_sz_scalar_th; 2482611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gflops_th; 2492611ad71SToby Isaac PETSC_EXTERN_TLS PetscLogDouble petsc_gtime_th; 2502611ad71SToby Isaac 2512611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogMemory; 2522611ad71SToby Isaac PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 2532611ad71SToby Isaac 2542611ad71SToby Isaac PETSC_EXTERN PetscLogState petsc_log_state; 2552611ad71SToby Isaac 2562611ad71SToby Isaac #define PETSC_LOG_HANDLER_MAX 4 2572611ad71SToby Isaac PETSC_EXTERN PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX]; 2582611ad71SToby Isaac 259aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 260fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 26177c4ece6SBarry Smith 2623ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2, 3); 263fa2bb9feSLisandro Dalcin 2648ba1e511SMatthew Knepley /* Initialization functions */ 265bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 266bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 2682611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 2692611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogPerfstubsBegin(void); 2702611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogLegacyCallbacksBegin(PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), PetscErrorCode (*)(PetscObject), PetscErrorCode (*)(PetscObject)); 271014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 272014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 273fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble, PetscLogDouble *); 274fa2bb9feSLisandro Dalcin 2758ba1e511SMatthew Knepley /* Output functions */ 276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 277f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 278014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 2792611ad71SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 28031d06abdSBarry Smith 28153e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetState(PetscLogState *); 282b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *); 28353e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStart(PetscLogHandler); 28453e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogHandlerStop(PetscLogHandler); 28553e0a2f3SToby Isaac 2864dd65854SConnor Ward /* Status checking functions */ 2874dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool *); 2884dd65854SConnor Ward 289fa2bb9feSLisandro Dalcin /* Stage functions */ 290014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[], PetscLogStage *); 291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 292014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool); 294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool *); 295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool); 296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool *); 297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[], PetscLogStage *); 29853e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetName(PetscLogEvent, const char **); 2998b08f494SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage, PetscEventPerfInfo *); 300f5d6ab90SLisandro Dalcin 3018ba1e511SMatthew Knepley /* Event functions */ 302014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId, PetscLogEvent *); 303217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent, PetscBool); 304fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 305fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 307014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 308c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 309c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool); 311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3138c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[], PetscLogEvent *); 31453e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetName(PetscLogEvent, const char **); 31553e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage, PetscLogEvent, PetscEventPerfInfo *); 316891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3175d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 31853e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsPause(void); 31953e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogEventsResume(void); 32053e0a2f3SToby Isaac 32153e0a2f3SToby Isaac /* Class functions */ 32253e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassGetClassId(const char[], PetscClassId *); 32353e0a2f3SToby Isaac PETSC_EXTERN PetscErrorCode PetscLogClassIdGetName(PetscClassId, const char **); 3248ba1e511SMatthew Knepley 325b665b14eSToby Isaac static inline PETSC_UNUSED PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm) 326b665b14eSToby Isaac { 327b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 328b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 329b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 330b665b14eSToby Isaac if (h->eventSync) { 331*f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventSync)(h->handler, e, comm); 332b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 333b665b14eSToby Isaac } 334b665b14eSToby Isaac } 335b665b14eSToby Isaac } 336b665b14eSToby Isaac return PETSC_SUCCESS; 337b665b14eSToby Isaac } 33862872c28SLisandro Dalcin 339b665b14eSToby Isaac static inline PETSC_UNUSED PetscErrorCode PetscLogEventBegin_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 340b665b14eSToby Isaac { 341b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 342b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 343b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 344b665b14eSToby Isaac if (h->eventBegin) { 345*f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventBegin)(h->handler, e, o1, o2, o3, o4); 346b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 347b665b14eSToby Isaac } 348b665b14eSToby Isaac } 349b665b14eSToby Isaac } 350b665b14eSToby Isaac return PETSC_SUCCESS; 351b665b14eSToby Isaac } 352b665b14eSToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) PetscLogEventBegin_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 35377c4ece6SBarry Smith 354b665b14eSToby Isaac static inline PETSC_UNUSED PetscErrorCode PetscLogEventEnd_Internal(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 355b665b14eSToby Isaac { 356b665b14eSToby Isaac if (PetscLogStateEventCurrentlyActive(petsc_log_state, e)) { 357b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 358b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 359b665b14eSToby Isaac if (h->eventEnd) { 360*f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->eventEnd)(h->handler, e, o1, o2, o3, o4); 361b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 362b665b14eSToby Isaac } 363b665b14eSToby Isaac } 364b665b14eSToby Isaac } 365b665b14eSToby Isaac return PETSC_SUCCESS; 366b665b14eSToby Isaac } 367b665b14eSToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) PetscLogEventEnd_Internal(e, (PetscObject)(o1), (PetscObject)(o2), (PetscObject)(o3), (PetscObject)(o4)) 368043328b6SSatish Balay 369b665b14eSToby Isaac /* Object functions */ 37047496788SBarry Smith static inline PETSC_UNUSED PetscErrorCode PetscLogObjectCreate(PetscObject o) 371b665b14eSToby Isaac { 372b665b14eSToby Isaac if (petsc_log_state) { 373b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 374b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 375b665b14eSToby Isaac if (h->objectCreate) { 376*f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectCreate)(h->handler, o); 377b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 378b665b14eSToby Isaac } 379b665b14eSToby Isaac } 380b665b14eSToby Isaac } 381b665b14eSToby Isaac return PETSC_SUCCESS; 382b665b14eSToby Isaac } 38377c4ece6SBarry Smith 38447496788SBarry Smith static inline PETSC_UNUSED PetscErrorCode PetscLogObjectDestroy(PetscObject o) 385b665b14eSToby Isaac { 386b665b14eSToby Isaac if (petsc_log_state) { 387b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 388b665b14eSToby Isaac PetscLogHandlerHot *h = &PetscLogHandlers[i]; 389b665b14eSToby Isaac if (h->objectDestroy) { 390*f4f49eeaSPierre Jolivet PetscErrorCode err = (*h->objectDestroy)(h->handler, o); 391b665b14eSToby Isaac if (err != PETSC_SUCCESS) return err; 392b665b14eSToby Isaac } 393b665b14eSToby Isaac } 394b665b14eSToby Isaac } 395b665b14eSToby Isaac return PETSC_SUCCESS; 396b665b14eSToby Isaac } 397003131ecSBarry Smith 398c708d6e3SStefano Zampini /* 399c708d6e3SStefano Zampini Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 400c708d6e3SStefano Zampini 401c708d6e3SStefano Zampini For the complex numbers version, note that 402c708d6e3SStefano Zampini 1 complex addition = 2 flops 403c708d6e3SStefano Zampini 1 complex multiplication = 6 flops, 404c708d6e3SStefano Zampini where we define 1 flop as that for a double precision scalar. We roughly approximate 405c708d6e3SStefano Zampini flop counting for complex numbers by multiplying the total flops by 4; this corresponds 406c708d6e3SStefano Zampini to the assumption that we're counting mostly additions and multiplications -- and 407c708d6e3SStefano Zampini roughly the same number of each. More accurate counting could be done by distinguishing 408c708d6e3SStefano Zampini among the various arithmetic operations. 409c708d6e3SStefano Zampini */ 410c708d6e3SStefano Zampini 411c708d6e3SStefano Zampini #if defined(PETSC_USE_COMPLEX) 412c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 4.0 413c708d6e3SStefano Zampini #else 414c708d6e3SStefano Zampini #define PETSC_FLOPS_PER_OP 1.0 415c708d6e3SStefano Zampini #endif 416c708d6e3SStefano Zampini 417c708d6e3SStefano Zampini /*@C 418c708d6e3SStefano Zampini PetscLogFlops - Log how many flops are performed in a calculation 419c708d6e3SStefano Zampini 420c708d6e3SStefano Zampini Input Parameter: 421c708d6e3SStefano Zampini . flops - the number of flops 422c708d6e3SStefano Zampini 423c708d6e3SStefano Zampini Level: intermediate 424c708d6e3SStefano Zampini 425c200f75eSSatish Balay Note: 426c200f75eSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 427c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 428c200f75eSSatish Balay 429c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()` 430c708d6e3SStefano Zampini @*/ 431c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 432c708d6e3SStefano Zampini { 433c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 434c708d6e3SStefano Zampini return PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n); 435c708d6e3SStefano Zampini } 436c708d6e3SStefano Zampini 437ce85283eSBarry Smith /* 438f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 439f621e05eSBarry Smith their sizes. 440f621e05eSBarry Smith 441af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 442ce85283eSBarry Smith uses macros to defined the MPI operations. 44315308354SBarry Smith 44415308354SBarry Smith It does not work correctly from HP-UX because it processes the 445bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 446b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4477c1e34a4SSatish Balay 448f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 449ce85283eSBarry Smith */ 450d5bc873cSPierre Jolivet #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 45177a39924SBarry Smith /* 45277a39924SBarry Smith Logging of MPI activities 45377a39924SBarry Smith */ 454c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSize(PetscInt count, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 455d71ae5a4SJacob Faibussowitsch { 456f12d10ccSJunchao Zhang PetscMPIInt typesize; 4575f80ce2aSJacob Faibussowitsch 4583ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4599566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 460c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, (PetscLogDouble)(count * typesize)); 461f95db71bSBarry Smith } 46277a39924SBarry Smith 463c708d6e3SStefano Zampini static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, const PetscMPIInt *counts, MPI_Datatype type, PetscLogDouble *length, PetscLogDouble *length_th) 464d71ae5a4SJacob Faibussowitsch { 465f12d10ccSJunchao Zhang PetscMPIInt typesize, size, p; 466c708d6e3SStefano Zampini PetscLogDouble l; 4673b9284c0SMatthew G Knepley 4683ba16761SJacob Faibussowitsch if (type == MPI_DATATYPE_NULL) return PETSC_SUCCESS; 4699566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 4709566063dSJacob Faibussowitsch PetscCallMPI(MPI_Type_size(type, &typesize)); 471c708d6e3SStefano Zampini for (p = 0, l = 0.0; p < size; ++p) l += (PetscLogDouble)(counts[p] * typesize); 472c708d6e3SStefano Zampini return PetscAddLogDouble(length, length_th, l); 4733b9284c0SMatthew G Knepley } 4743b9284c0SMatthew G Knepley 47572b11a25SBarry Smith /* 47672b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 47772b11a25SBarry Smith */ 478d71ae5a4SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 479d71ae5a4SJacob Faibussowitsch { 4809371c9d4SSatish Balay PetscMPIInt size; 4819371c9d4SSatish Balay MPI_Comm_size(comm, &size); 4829371c9d4SSatish Balay return size > 1; 48372b11a25SBarry Smith } 48472b11a25SBarry Smith 485c708d6e3SStefano Zampini #define MPI_Irecv(buf, count, datatype, source, tag, comm, request) \ 486c708d6e3SStefano 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))) 48715308354SBarry Smith 488c708d6e3SStefano Zampini #define MPI_Irecv_c(buf, count, datatype, source, tag, comm, request) \ 489c708d6e3SStefano 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))) 490c87b50c4SJunchao Zhang 491c708d6e3SStefano Zampini #define MPI_Isend(buf, count, datatype, dest, tag, comm, request) \ 492c708d6e3SStefano 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))) 49315308354SBarry Smith 494c708d6e3SStefano Zampini #define MPI_Isend_c(buf, count, datatype, dest, tag, comm, request) \ 495c708d6e3SStefano 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))) 496c87b50c4SJunchao Zhang 497c708d6e3SStefano Zampini #define MPI_Startall_irecv(count, datatype, number, requests) \ 498c708d6e3SStefano 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)))) 4990d4b0b6cSBarry Smith 500c708d6e3SStefano Zampini #define MPI_Startall_isend(count, datatype, number, requests) \ 501c708d6e3SStefano 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)))) 5020d4b0b6cSBarry Smith 503*f4f49eeaSPierre 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)) 5040d4b0b6cSBarry Smith 505c708d6e3SStefano Zampini #define MPI_Recv(buf, count, datatype, source, tag, comm, status) \ 506c708d6e3SStefano 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))) 50715308354SBarry Smith 508c708d6e3SStefano Zampini #define MPI_Recv_c(buf, count, datatype, source, tag, comm, status) \ 509c708d6e3SStefano 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))) 510c87b50c4SJunchao Zhang 511c708d6e3SStefano Zampini #define MPI_Send(buf, count, datatype, dest, tag, comm) \ 512c708d6e3SStefano 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))) 51377a39924SBarry Smith 514c708d6e3SStefano Zampini #define MPI_Send_c(buf, count, datatype, dest, tag, comm) \ 515c708d6e3SStefano 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))) 516c87b50c4SJunchao Zhang 517c708d6e3SStefano 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))) 51877a39924SBarry Smith 519c708d6e3SStefano 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))) 52077a39924SBarry Smith 521c708d6e3SStefano Zampini #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 522c708d6e3SStefano 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))) 52377a39924SBarry Smith 524c708d6e3SStefano 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))) 5253914022bSBarry Smith 526c708d6e3SStefano 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))) 52754fe5c21SBarry Smith 528c708d6e3SStefano Zampini #define MPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm) \ 529c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPI_Reduce_scatter_block((sendbuf), (recvbuf), (recvcount), (datatype), (op), (comm))) 530d6e4c47cSJed Brown 5313b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 532c708d6e3SStefano 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))) 5333b9284c0SMatthew G Knepley 5343b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm) \ 535c708d6e3SStefano 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))) 5363b9284c0SMatthew G Knepley 537c708d6e3SStefano Zampini #define MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) \ 538c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm))) 53901faf4e4SMatthew Knepley 54001faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm) \ 541c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Allgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm))) 54201faf4e4SMatthew Knepley 54301faf4e4SMatthew Knepley #define MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 544c708d6e3SStefano 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))) 54501faf4e4SMatthew Knepley 54601faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm) \ 547c708d6e3SStefano 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))) 54801faf4e4SMatthew Knepley 54901faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 550c708d6e3SStefano 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))) 55101faf4e4SMatthew Knepley 55201faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) \ 553c708d6e3SStefano 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))) 554f12d10ccSJunchao Zhang 555f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 556c708d6e3SStefano 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))) 557f12d10ccSJunchao Zhang 558f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf, sendcnts, sdispls, sendtype, recvbuf, recvcnts, rdispls, recvtype, comm, request) \ 559c708d6e3SStefano 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))) 560f12d10ccSJunchao Zhang 561f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) \ 562c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgather((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (recvtype), (comm), (request))) 563f12d10ccSJunchao Zhang 564f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, comm, request) \ 565c708d6e3SStefano Zampini (PetscAddLogDouble(&petsc_gather_ct, &petsc_gather_ct_th, PetscMPIParallelComm(comm)) || MPI_Iallgatherv((sendbuf), (sendcount), (sendtype), (recvbuf), (recvcount), (displs), (recvtype), (comm), (request))) 566f12d10ccSJunchao Zhang 567f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 568c708d6e3SStefano 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))) 569f12d10ccSJunchao Zhang 570f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcount, displs, recvtype, root, comm, request) \ 571c708d6e3SStefano 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))) 572f12d10ccSJunchao Zhang 573f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 574c708d6e3SStefano 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))) 575f12d10ccSJunchao Zhang 576f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf, sendcount, displs, sendtype, recvbuf, recvcount, recvtype, root, comm, request) \ 577c708d6e3SStefano 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))) 578f12d10ccSJunchao Zhang 579715b587bSJunchao Zhang #define MPIX_Send_enqueue(buf, count, datatype, dest, tag, comm) \ 580715b587bSJunchao 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))) 581715b587bSJunchao Zhang 582715b587bSJunchao Zhang #define MPIX_Recv_enqueue(buf, count, datatype, source, tag, comm, status) \ 583715b587bSJunchao 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))) 584715b587bSJunchao Zhang 585715b587bSJunchao Zhang #define MPIX_Isend_enqueue(buf, count, datatype, dest, tag, comm, request) \ 586715b587bSJunchao 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))) 587715b587bSJunchao Zhang 588715b587bSJunchao Zhang #define MPIX_Irecv_enqueue(buf, count, datatype, source, tag, comm, request) \ 589715b587bSJunchao 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))) 590715b587bSJunchao Zhang 591715b587bSJunchao Zhang #define MPIX_Allreduce_enqueue(sendbuf, recvbuf, count, datatype, op, comm) \ 592715b587bSJunchao Zhang (PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, PetscMPIParallelComm(comm)) || MPIX_Allreduce_enqueue((sendbuf), (recvbuf), (count), (datatype), (op), (comm))) 593715b587bSJunchao Zhang 594715b587bSJunchao 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))) 595715b587bSJunchao Zhang 596715b587bSJunchao Zhang #define MPIX_Waitall_enqueue(count, array_of_requests, array_of_statuses) \ 597715b587bSJunchao 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))) 5980d4b0b6cSBarry Smith #else 5990d4b0b6cSBarry Smith 6009371c9d4SSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6010d4b0b6cSBarry Smith 6029371c9d4SSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall((number), (requests))) 6030d4b0b6cSBarry Smith 604*f4f49eeaSPierre Jolivet #define MPI_Start_isend(count, datatype, requests) (MPI_Start(requests)) 6050d4b0b6cSBarry Smith 606c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 607614700edSBarry Smith 608df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 609614700edSBarry Smith 61053e0a2f3SToby Isaac #define PetscLogGetState(a) (*(a) = NULL, PETSC_SUCCESS) 611b665b14eSToby Isaac #define PetscLogGetDefaultHandler(a) (*(a) = NULL, PETSC_SUCCESS) 61253e0a2f3SToby Isaac #define PetscLogHandlerStart(a) ((void)(a), PETSC_SUCCESS) 61353e0a2f3SToby Isaac #define PetscLogHandlerStop(a) ((void)(a), PETSC_SUCCESS) 61453e0a2f3SToby Isaac 6153ba16761SJacob Faibussowitsch #define PetscLogFlops(n) ((void)(n), PETSC_SUCCESS) 6163ba16761SJacob Faibussowitsch #define PetscGetFlops(a) (*(a) = 0.0, PETSC_SUCCESS) 617614700edSBarry Smith 6182611ad71SToby Isaac #define PetscLogStageRegister(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 6192611ad71SToby Isaac #define PetscLogStagePush(a) ((void)(a), PETSC_SUCCESS) 6203ba16761SJacob Faibussowitsch #define PetscLogStagePop() PETSC_SUCCESS 6212611ad71SToby Isaac #define PetscLogStageSetActive(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6222611ad71SToby Isaac #define PetscLogStageGetActive(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6232611ad71SToby Isaac #define PetscLogStageGetVisible(a, b) ((void)(a), *(b) = PETSC_FALSE, PETSC_SUCCESS) 6242611ad71SToby Isaac #define PetscLogStageSetVisible(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6252611ad71SToby Isaac #define PetscLogStageGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 62653e0a2f3SToby Isaac #define PetscLogStageGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6278b08f494SToby Isaac #define PetscLogStageGetPerfInfo(a, b) ((void)(a), *(b) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 628f5d6ab90SLisandro Dalcin 6292611ad71SToby Isaac #define PetscLogEventRegister(a, b, c) ((void)(a), (void)(b), *(c) = -1, PETSC_SUCCESS) 6302611ad71SToby Isaac #define PetscLogEventSetCollective(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 6312611ad71SToby Isaac #define PetscLogEventIncludeClass(a) ((void)(a), PETSC_SUCCESS) 6322611ad71SToby Isaac #define PetscLogEventExcludeClass(a) ((void)(a), PETSC_SUCCESS) 6332611ad71SToby Isaac #define PetscLogEventActivate(a) ((void)(a), PETSC_SUCCESS) 6342611ad71SToby Isaac #define PetscLogEventDeactivate(a) ((void)(a), PETSC_SUCCESS) 6352611ad71SToby Isaac #define PetscLogEventDeactivatePush(a) ((void)(a), PETSC_SUCCESS) 6362611ad71SToby Isaac #define PetscLogEventDeactivatePop(a) ((void)(a), PETSC_SUCCESS) 6372611ad71SToby Isaac #define PetscLogEventActivateClass(a) ((void)(a), PETSC_SUCCESS) 6382611ad71SToby Isaac #define PetscLogEventDeactivateClass(a) ((void)(a), PETSC_SUCCESS) 6392611ad71SToby Isaac #define PetscLogEventSetActiveAll(a, b) ((void)(a), PETSC_SUCCESS) 6402611ad71SToby Isaac #define PetscLogEventGetId(a, b) ((void)(a), *(b) = -1, PETSC_SUCCESS) 64153e0a2f3SToby Isaac #define PetscLogEventGetName(a, b) ((void)(a), *(b) = NULL, PETSC_SUCCESS) 6422611ad71SToby Isaac #define PetscLogEventGetPerfInfo(a, b, c) ((void)(a), (void)(b), *(c) = (const PetscEventPerfInfo){0}, PETSC_SUCCESS) 6432611ad71SToby Isaac 6442611ad71SToby Isaac #define PetscLogEventSetDof(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 6452611ad71SToby Isaac #define PetscLogEventSetError(a, b, c) ((void)(a), (void)(b), (void)(c), PETSC_SUCCESS) 64653e0a2f3SToby Isaac #define PetscLogEventsPause() PETSC_SUCCESS 64753e0a2f3SToby Isaac #define PetscLogEventsResume() PETSC_SUCCESS 64853e0a2f3SToby Isaac 64953e0a2f3SToby Isaac #define PetscLogClassGetClassId(a, b) (*(b) = -1, PETSC_SUCCESS) 65053e0a2f3SToby Isaac #define PetscLogClassIdGetName(a, b) (*(b) = NULL, PETSC_SUCCESS) 65177c4ece6SBarry Smith 6522611ad71SToby Isaac #define PetscLogObjectCreate(h) ((void)(h), PETSC_SUCCESS) 6532611ad71SToby Isaac #define PetscLogObjectDestroy(h) ((void)(h), PETSC_SUCCESS) 6542611ad71SToby Isaac #define PetscLogObjectState(h, c, ...) ((void)(h), (void)(c), PETSC_SUCCESS) 655fa2bb9feSLisandro Dalcin 6563ba16761SJacob Faibussowitsch #define PetscLogDefaultBegin() PETSC_SUCCESS 6573ba16761SJacob Faibussowitsch #define PetscLogNestedBegin() PETSC_SUCCESS 6582611ad71SToby Isaac #define PetscLogTraceBegin(file) ((void)(file), PETSC_SUCCESS) 6592611ad71SToby Isaac #define PetscLogMPEBegin() PETSC_SUCCESS 66053e0a2f3SToby Isaac #define PetscLogPerfstubsBegin() PETSC_SUCCESS 66153e0a2f3SToby Isaac #define PetscLogLegacyCallbacksBegin(a, b, c, d) ((void)(a), (void)(b), (void)(c), (void)(d), PETSC_SUCCESS) 6622611ad71SToby Isaac #define PetscLogActions(a) ((void)(a), PETSC_SUCCESS) 6632611ad71SToby Isaac #define PetscLogObjects(a) ((void)(a), PETSC_SUCCESS) 6642611ad71SToby Isaac #define PetscLogSetThreshold(a, b) ((void)(a), (void)(b), PETSC_SUCCESS) 66553e0a2f3SToby Isaac 6663ba16761SJacob Faibussowitsch #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE, PETSC_SUCCESS) 667fa2bb9feSLisandro Dalcin 6682611ad71SToby Isaac #define PetscLogView(viewer) ((void)(viewer), PETSC_SUCCESS) 6693ba16761SJacob Faibussowitsch #define PetscLogViewFromOptions() PETSC_SUCCESS 6702611ad71SToby Isaac #define PetscLogDump(c) ((void)(c), PETSC_SUCCESS) 6712611ad71SToby Isaac #define PetscLogMPEDump(c) ((void)(c), PETSC_SUCCESS) 672fa2bb9feSLisandro Dalcin 6732611ad71SToby Isaac #define PetscLogEventSync(e, comm) ((void)(e), (void)(comm), PETSC_SUCCESS) 6742611ad71SToby Isaac #define PetscLogEventBegin(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 6752611ad71SToby Isaac #define PetscLogEventEnd(e, o1, o2, o3, o4) ((void)(e), (void)(o1), (void)(o2), (void)(o3), PETSC_SUCCESS) 676ce6058e1SBarry Smith 67723c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 67823c86b1bSSatish Balay #define MPI_Startall_irecv(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 67923c86b1bSSatish Balay #define MPI_Startall_isend(count, datatype, number, requests) ((number) && MPI_Startall(number, requests)) 68023c86b1bSSatish Balay #define MPI_Start_isend(count, datatype, requests) MPI_Start(requests) 68123c86b1bSSatish Balay 68223c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 68323c86b1bSSatish Balay 684204a6943SJed Brown #define PetscPreLoadBegin(flag, name) \ 685204a6943SJed Brown do { \ 686204a6943SJed Brown PetscBool PetscPreLoading = flag; \ 687204a6943SJed Brown int PetscPreLoadMax, PetscPreLoadIt; \ 688166c7f25SBarry Smith PetscLogStage _stageNum; \ 6899566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-preload", &PetscPreLoading, NULL)); \ 690204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading); \ 691204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed; \ 692960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 693960d3302SJed Brown for (PetscPreLoadIt = (_stageNum == -1) ? 0 : PetscPreLoadMax; PetscPreLoadIt <= PetscPreLoadMax; PetscPreLoadIt++) { \ 694960d3302SJed Brown PetscPreLoadingOn = (PetscBool)(PetscPreLoadIt < PetscPreLoadMax); \ 6959566063dSJacob Faibussowitsch PetscCall(PetscBarrier(NULL)); \ 696960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 697960d3302SJed Brown PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(PetscPreLoadIt == PetscPreLoadMax))); \ 698a8f51744SPierre Jolivet PetscCall(PetscLogStagePush(_stageNum)) 6998e58c17dSMatthew Knepley 700204a6943SJed Brown #define PetscPreLoadEnd() \ 7019566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 702043328b6SSatish Balay } \ 7039371c9d4SSatish Balay } \ 7049371c9d4SSatish Balay while (0) 7058e58c17dSMatthew Knepley 7069371c9d4SSatish Balay #define PetscPreLoadStage(name) \ 7079371c9d4SSatish Balay do { \ 7089566063dSJacob Faibussowitsch PetscCall(PetscLogStagePop()); \ 709960d3302SJed Brown PetscCall(PetscLogStageGetId(name, &_stageNum)); \ 710960d3302SJed Brown if (_stageNum == -1) PetscCall(PetscLogStageRegister(name, &_stageNum)); \ 7119566063dSJacob Faibussowitsch PetscCall(PetscLogStageSetActive(_stageNum, (PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 7129566063dSJacob Faibussowitsch PetscCall(PetscLogStagePush(_stageNum)); \ 713204a6943SJed Brown } while (0) 714e9fa29b7SSatish Balay 715ad14c47eSJed Brown /* some vars for logging */ 716ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 717ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 718ad14c47eSJed Brown 719c708d6e3SStefano Zampini #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 720c708d6e3SStefano Zampini 721c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTime(void); 722c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 723c708d6e3SStefano Zampini PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 724c708d6e3SStefano Zampini 725c708d6e3SStefano Zampini /*@C 726c708d6e3SStefano Zampini PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 727c708d6e3SStefano Zampini 728c708d6e3SStefano Zampini Input Parameter: 729c708d6e3SStefano Zampini . flops - the number of flops 730c708d6e3SStefano Zampini 731c200f75eSSatish Balay Level: intermediate 732c200f75eSSatish Balay 733c708d6e3SStefano Zampini Notes: 734c708d6e3SStefano Zampini To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 735c200f75eSSatish Balay not an integer. Use `PetscLogFlops`(4.0*n) not `PetscLogFlops`(4*n) 736c708d6e3SStefano Zampini 737c708d6e3SStefano 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 738c708d6e3SStefano Zampini just on the CPU would be the value from set from `PetscLogFlops()` minus the value set from `PetscLogGpuFlops()` 739c708d6e3SStefano Zampini 740c200f75eSSatish Balay .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogFlops()`, `PetscLogGpuTimeBegin()`, `PetscLogGpuTimeEnd()` 741c708d6e3SStefano Zampini @*/ 742c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 743c708d6e3SStefano Zampini { 744c708d6e3SStefano Zampini PetscAssert(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Cannot log negative flops"); 7453ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_TotalFlops, &petsc_TotalFlops_th, PETSC_FLOPS_PER_OP * n)); 7463ba16761SJacob Faibussowitsch PetscCall(PetscAddLogDouble(&petsc_gflops, &petsc_gflops_th, PETSC_FLOPS_PER_OP * n)); 7473ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 748c708d6e3SStefano Zampini } 749c708d6e3SStefano Zampini 750c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 751c708d6e3SStefano Zampini { 7523ba16761SJacob Faibussowitsch return PetscAddLogDouble(&petsc_gtime, &petsc_gtime_th, t); 753c708d6e3SStefano Zampini } 754c708d6e3SStefano Zampini 755c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 756c708d6e3SStefano Zampini { 7573ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct, &petsc_ctog_sz, &petsc_ctog_ct_th, &petsc_ctog_sz_th, size); 758c708d6e3SStefano Zampini } 759c708d6e3SStefano Zampini 760c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 761c708d6e3SStefano Zampini { 7623ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct, &petsc_gtoc_sz, &petsc_gtoc_ct_th, &petsc_gtoc_sz_th, size); 763c708d6e3SStefano Zampini } 764c708d6e3SStefano Zampini 765c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 766c708d6e3SStefano Zampini { 7673ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_ctog_ct_scalar, &petsc_ctog_sz_scalar, &petsc_ctog_ct_scalar_th, &petsc_ctog_sz_scalar_th, size); 768c708d6e3SStefano Zampini } 769c708d6e3SStefano Zampini 770c708d6e3SStefano Zampini static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 771c708d6e3SStefano Zampini { 7723ba16761SJacob Faibussowitsch return PetscAddLogDoubleCnt(&petsc_gtoc_ct_scalar, &petsc_gtoc_sz_scalar, &petsc_gtoc_ct_scalar_th, &petsc_gtoc_sz_scalar_th, size); 773c708d6e3SStefano Zampini } 774c708d6e3SStefano Zampini #else 775c708d6e3SStefano Zampini 7763ba16761SJacob Faibussowitsch #define PetscLogCpuToGpu(a) PETSC_SUCCESS 7773ba16761SJacob Faibussowitsch #define PetscLogGpuToCpu(a) PETSC_SUCCESS 7783ba16761SJacob Faibussowitsch #define PetscLogCpuToGpuScalar(a) PETSC_SUCCESS 7793ba16761SJacob Faibussowitsch #define PetscLogGpuToCpuScalar(a) PETSC_SUCCESS 7803ba16761SJacob Faibussowitsch #define PetscLogGpuFlops(a) PETSC_SUCCESS 7813ba16761SJacob Faibussowitsch #define PetscLogGpuTime() PETSC_SUCCESS 7823ba16761SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) PETSC_SUCCESS 7833ba16761SJacob Faibussowitsch #define PetscLogGpuTimeBegin() PETSC_SUCCESS 7843ba16761SJacob Faibussowitsch #define PetscLogGpuTimeEnd() PETSC_SUCCESS 785c708d6e3SStefano Zampini 786c708d6e3SStefano Zampini #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 787c708d6e3SStefano Zampini 788c708d6e3SStefano Zampini /* remove TLS defines */ 789c708d6e3SStefano Zampini #undef PETSC_EXTERN_TLS 790c708d6e3SStefano Zampini #undef PETSC_TLS 791c708d6e3SStefano Zampini 792b665b14eSToby Isaac #include <petsclogdeprecated.h> 793