15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith PETSc code to log object creation and destruction and PETSc events. 45c6c1daeSBarry Smith 55c6c1daeSBarry Smith This provides the public API used by the rest of PETSc and by users. 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith These routines use a private API that is not used elsewhere in PETSc and is not 85c6c1daeSBarry Smith accessible to users. The private API is defined in logimpl.h and the utils directory. 95c6c1daeSBarry Smith 10b665b14eSToby Isaac *** 11b665b14eSToby Isaac 12b665b14eSToby Isaac This file, and only this file, is for functions that interact with the global logging state 135c6c1daeSBarry Smith */ 14af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 1553e0a2f3SToby Isaac #include <petsc/private/loghandlerimpl.h> 165c6c1daeSBarry Smith #include <petsctime.h> 17665c2dedSJed Brown #include <petscviewer.h> 188fe3844cSJunchao Zhang #include <petscdevice.h> 198fe3844cSJunchao Zhang #include <petsc/private/deviceimpl.h> 205c6c1daeSBarry Smith 21c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 22c708d6e3SStefano Zampini 23c708d6e3SStefano Zampini PetscInt petsc_log_gid = -1; /* Global threadId counter */ 24c708d6e3SStefano Zampini PETSC_TLS PetscInt petsc_log_tid = -1; /* Local threadId */ 25c708d6e3SStefano Zampini 26c708d6e3SStefano Zampini /* shared variables */ 27c708d6e3SStefano Zampini PetscSpinlock PetscLogSpinLock; 28c708d6e3SStefano Zampini 292611ad71SToby Isaac PetscInt PetscLogGetTid(void) 302611ad71SToby Isaac { 312611ad71SToby Isaac if (petsc_log_tid < 0) { 322611ad71SToby Isaac PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 332611ad71SToby Isaac petsc_log_tid = ++petsc_log_gid; 342611ad71SToby Isaac PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 352611ad71SToby Isaac } 362611ad71SToby Isaac return petsc_log_tid; 372611ad71SToby Isaac } 382611ad71SToby Isaac 39c708d6e3SStefano Zampini #endif 40c708d6e3SStefano Zampini 415c6c1daeSBarry Smith /* Global counters */ 425c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime = 0.0; 435c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops = 0.0; /* The number of flops */ 445c6c1daeSBarry Smith PetscLogDouble petsc_send_ct = 0.0; /* The number of sends */ 455c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct = 0.0; /* The number of receives */ 465c6c1daeSBarry Smith PetscLogDouble petsc_send_len = 0.0; /* The total length of all sent messages */ 475c6c1daeSBarry Smith PetscLogDouble petsc_recv_len = 0.0; /* The total length of all received messages */ 485c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct = 0.0; /* The number of immediate sends */ 495c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct = 0.0; /* The number of immediate receives */ 505c6c1daeSBarry Smith PetscLogDouble petsc_isend_len = 0.0; /* The total length of all immediate send messages */ 515c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len = 0.0; /* The total length of all immediate receive messages */ 525c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct = 0.0; /* The number of waits */ 535c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct = 0.0; /* The number of anywaits */ 545c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct = 0.0; /* The number of waitalls */ 555c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */ 565c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct = 0.0; /* The number of reductions */ 575c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct = 0.0; /* The number of gathers and gathervs */ 585c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct = 0.0; /* The number of scatters and scattervs */ 59c708d6e3SStefano Zampini 60c708d6e3SStefano Zampini /* Thread Local storage */ 61c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_TotalFlops_th = 0.0; 62c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_ct_th = 0.0; 63c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_ct_th = 0.0; 64c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_len_th = 0.0; 65c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_len_th = 0.0; 66c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_ct_th = 0.0; 67c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_ct_th = 0.0; 68c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_len_th = 0.0; 69c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_len_th = 0.0; 70c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_ct_th = 0.0; 71c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_any_ct_th = 0.0; 72c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_all_ct_th = 0.0; 73c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_sum_of_waits_ct_th = 0.0; 74c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_allreduce_ct_th = 0.0; 75c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gather_ct_th = 0.0; 76c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_scatter_ct_th = 0.0; 77c708d6e3SStefano Zampini 78bec0b493Shannah_mairs PetscLogDouble petsc_ctog_ct = 0.0; /* The total number of CPU to GPU copies */ 79bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_ct = 0.0; /* The total number of GPU to CPU copies */ 80bec0b493Shannah_mairs PetscLogDouble petsc_ctog_sz = 0.0; /* The total size of CPU to GPU copies */ 81bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_sz = 0.0; /* The total size of GPU to CPU copies */ 8245c4b7c1SBarry Smith PetscLogDouble petsc_ctog_ct_scalar = 0.0; /* The total number of CPU to GPU copies */ 8345c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_ct_scalar = 0.0; /* The total number of GPU to CPU copies */ 8445c4b7c1SBarry Smith PetscLogDouble petsc_ctog_sz_scalar = 0.0; /* The total size of CPU to GPU copies */ 8545c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_sz_scalar = 0.0; /* The total size of GPU to CPU copies */ 86958c4211Shannah_mairs PetscLogDouble petsc_gflops = 0.0; /* The flops done on a GPU */ 87958c4211Shannah_mairs PetscLogDouble petsc_gtime = 0.0; /* The time spent on a GPU */ 88c708d6e3SStefano Zampini 89c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_th = 0.0; 90c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_th = 0.0; 91c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_th = 0.0; 92c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_th = 0.0; 93c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_scalar_th = 0.0; 94c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_scalar_th = 0.0; 95c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_scalar_th = 0.0; 96c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_scalar_th = 0.0; 97c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gflops_th = 0.0; 98c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtime_th = 0.0; 992611ad71SToby Isaac 1002611ad71SToby Isaac PetscBool PetscLogMemory = PETSC_FALSE; 1012611ad71SToby Isaac PetscBool PetscLogSyncOn = PETSC_FALSE; 1022611ad71SToby Isaac 1032611ad71SToby Isaac PetscBool PetscLogGpuTimeFlag = PETSC_FALSE; 1042611ad71SToby Isaac 1052611ad71SToby Isaac PetscLogState petsc_log_state = NULL; 1062611ad71SToby Isaac 1072611ad71SToby Isaac #define PETSC_LOG_HANDLER_HOT_BLANK \ 1082611ad71SToby Isaac { \ 1092611ad71SToby Isaac NULL, NULL, NULL, NULL, NULL, NULL \ 1102611ad71SToby Isaac } 1112611ad71SToby Isaac 1122611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = { 1132611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1142611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1152611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1162611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1172611ad71SToby Isaac }; 1182611ad71SToby Isaac 1192611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK 1202611ad71SToby Isaac 1212611ad71SToby Isaac #if defined(PETSC_USE_LOG) 1222611ad71SToby Isaac #include <../src/sys/logging/handler/impls/default/logdefault.h> 123c708d6e3SStefano Zampini 124c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 125c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp) 126c708d6e3SStefano Zampini { 127c708d6e3SStefano Zampini *tot_th += tmp; 1283ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 129c708d6e3SStefano Zampini *tot += tmp; 1303ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 1313ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 132c708d6e3SStefano Zampini } 133c708d6e3SStefano Zampini 134c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp) 135c708d6e3SStefano Zampini { 136c708d6e3SStefano Zampini *cnt_th = *cnt_th + 1; 137c708d6e3SStefano Zampini *tot_th += tmp; 1383ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 139c708d6e3SStefano Zampini *tot += (PetscLogDouble)(tmp); 140c708d6e3SStefano Zampini *cnt += *cnt + 1; 1413ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 1423ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 143c708d6e3SStefano Zampini } 144c708d6e3SStefano Zampini 145bec0b493Shannah_mairs #endif 1465c6c1daeSBarry Smith 14753e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler) 14853e0a2f3SToby Isaac { 14953e0a2f3SToby Isaac PetscFunctionBegin; 15053e0a2f3SToby Isaac PetscAssertPointer(handler, 2); 15153e0a2f3SToby Isaac *handler = NULL; 15253e0a2f3SToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 15353e0a2f3SToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 15453e0a2f3SToby Isaac if (h) { 15553e0a2f3SToby Isaac PetscBool match; 15653e0a2f3SToby Isaac 15753e0a2f3SToby Isaac PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match)); 15853e0a2f3SToby Isaac if (match) { 15953e0a2f3SToby Isaac *handler = PetscLogHandlers[i].handler; 16053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 16153e0a2f3SToby Isaac } 16253e0a2f3SToby Isaac } 16353e0a2f3SToby Isaac } 16453e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 16553e0a2f3SToby Isaac } 16653e0a2f3SToby Isaac 16753e0a2f3SToby Isaac /*@ 168b665b14eSToby Isaac PetscLogGetDefaultHandler - Get the default log handler if it is running. 169b665b14eSToby Isaac 170b665b14eSToby Isaac Not collective 171b665b14eSToby Isaac 172b665b14eSToby Isaac Output Parameter: 173b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running. 174b665b14eSToby Isaac 175b665b14eSToby Isaac Level: developer 176b665b14eSToby Isaac 177b665b14eSToby Isaac Notes: 178b665b14eSToby Isaac The default handler is started with `PetscLogDefaultBegin()`, 179b665b14eSToby Isaac if the options flags `-log_all` or `-log_view` is given without arguments, 180b665b14eSToby Isaac or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`. 181b665b14eSToby Isaac 182b665b14eSToby Isaac .seealso: [](ch_profiling) 183b665b14eSToby Isaac @*/ 184b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler) 185b665b14eSToby Isaac { 186b665b14eSToby Isaac PetscFunctionBegin; 187294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler)); 188b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 189b665b14eSToby Isaac } 190b665b14eSToby Isaac 191b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler) 192b665b14eSToby Isaac { 193b665b14eSToby Isaac PetscFunctionBegin; 194b665b14eSToby Isaac PetscAssertPointer(handler, 2); 195b665b14eSToby Isaac PetscCall(PetscLogTryGetHandler(type, handler)); 196b665b14eSToby Isaac PetscCheck(handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type); 197b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 198b665b14eSToby Isaac } 199b665b14eSToby Isaac 200b665b14eSToby Isaac /*@ 20153e0a2f3SToby Isaac PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used 20253e0a2f3SToby Isaac by all default log handlers (`PetscLogDefaultBegin()`, 20353e0a2f3SToby Isaac `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`, 20453e0a2f3SToby Isaac `PetscLogPerfstubsBegin()`). 20553e0a2f3SToby Isaac 20653e0a2f3SToby Isaac Collective on `PETSC_COMM_WORLD` 20753e0a2f3SToby Isaac 20853e0a2f3SToby Isaac Output Parameter: 209b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as 210b665b14eSToby Isaac `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or 211b665b14eSToby Isaac `PetscLogStagePush()`), or NULL if logging is not active 21253e0a2f3SToby Isaac 21353e0a2f3SToby Isaac Level: developer 21453e0a2f3SToby Isaac 21553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState` 21653e0a2f3SToby Isaac @*/ 21753e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state) 21853e0a2f3SToby Isaac { 21953e0a2f3SToby Isaac PetscFunctionBegin; 22053e0a2f3SToby Isaac PetscAssertPointer(state, 1); 22153e0a2f3SToby Isaac *state = petsc_log_state; 22253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 22353e0a2f3SToby Isaac } 22453e0a2f3SToby Isaac 22553e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot) 22653e0a2f3SToby Isaac { 22753e0a2f3SToby Isaac PetscFunctionBegin; 22853e0a2f3SToby Isaac hot->handler = h; 22953e0a2f3SToby Isaac hot->eventBegin = h->ops->eventbegin; 23053e0a2f3SToby Isaac hot->eventEnd = h->ops->eventend; 23153e0a2f3SToby Isaac hot->eventSync = h->ops->eventsync; 23253e0a2f3SToby Isaac hot->objectCreate = h->ops->objectcreate; 23353e0a2f3SToby Isaac hot->objectDestroy = h->ops->objectdestroy; 23453e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 23553e0a2f3SToby Isaac } 23653e0a2f3SToby Isaac 23753e0a2f3SToby Isaac /*@ 23853e0a2f3SToby Isaac PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state. 23953e0a2f3SToby Isaac 24053e0a2f3SToby Isaac Logically collective 24153e0a2f3SToby Isaac 24253e0a2f3SToby Isaac Input Parameters: 24353e0a2f3SToby Isaac . h - a `PetscLogHandler` 24453e0a2f3SToby Isaac 24553e0a2f3SToby Isaac Level: developer 24653e0a2f3SToby Isaac 24753e0a2f3SToby Isaac Notes: 24853e0a2f3SToby Isaac 24953e0a2f3SToby Isaac Users should only need this if they create their own log handlers: handlers that are started 25053e0a2f3SToby Isaac from the command line (such as `-log_view` and `-log_trace`) or from a function like 25153e0a2f3SToby Isaac `PetscLogNestedBegin()` will automatically be started. 25253e0a2f3SToby Isaac 25353e0a2f3SToby Isaac There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time. 25453e0a2f3SToby Isaac 25553e0a2f3SToby Isaac To disconnect a handler from the global stream call `PetscLogHandlerStop()`. 25653e0a2f3SToby Isaac 25753e0a2f3SToby Isaac When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`, 25853e0a2f3SToby Isaac will be pushed for the new log handler, but it will not be informed of any events that are 25953e0a2f3SToby Isaac in progress. It is recommended to start any user-defined log handlers immediately following 26053e0a2f3SToby Isaac before any user-defined stages are pushed. 26153e0a2f3SToby Isaac 26253e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()` 26353e0a2f3SToby Isaac @*/ 26453e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h) 26553e0a2f3SToby Isaac { 26653e0a2f3SToby Isaac PetscFunctionBegin; 26753e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 26853e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS); 26953e0a2f3SToby Isaac } 27053e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 27153e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == NULL) { 27253e0a2f3SToby Isaac PetscCall(PetscObjectReference((PetscObject)h)); 27353e0a2f3SToby Isaac PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i])); 27453e0a2f3SToby Isaac if (petsc_log_state) { 27553e0a2f3SToby Isaac PetscLogStage stack_height; 27653e0a2f3SToby Isaac PetscIntStack orig_stack, temp_stack; 27753e0a2f3SToby Isaac 27853e0a2f3SToby Isaac PetscCall(PetscLogHandlerSetState(h, petsc_log_state)); 27953e0a2f3SToby Isaac stack_height = petsc_log_state->stage_stack->top + 1; 28053e0a2f3SToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 28153e0a2f3SToby Isaac orig_stack = petsc_log_state->stage_stack; 28253e0a2f3SToby Isaac petsc_log_state->stage_stack = temp_stack; 28353e0a2f3SToby Isaac petsc_log_state->current_stage = -1; 28453e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 28553e0a2f3SToby Isaac PetscLogStage stage = (PetscLogStage)orig_stack->stack[s]; 28653e0a2f3SToby Isaac PetscCall(PetscLogHandlerStagePush(h, stage)); 28753e0a2f3SToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 28853e0a2f3SToby Isaac petsc_log_state->current_stage = stage; 28953e0a2f3SToby Isaac } 29053e0a2f3SToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 29153e0a2f3SToby Isaac petsc_log_state->stage_stack = orig_stack; 29253e0a2f3SToby Isaac } 29353e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 29453e0a2f3SToby Isaac } 29553e0a2f3SToby Isaac } 29653e0a2f3SToby Isaac SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX); 29753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 29853e0a2f3SToby Isaac } 29953e0a2f3SToby Isaac 30053e0a2f3SToby Isaac /*@ 30153e0a2f3SToby Isaac PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream. 30253e0a2f3SToby Isaac 30353e0a2f3SToby Isaac Logically collective 30453e0a2f3SToby Isaac 30553e0a2f3SToby Isaac Input Parameters: 30653e0a2f3SToby Isaac . h - a `PetscLogHandler` 30753e0a2f3SToby Isaac 30853e0a2f3SToby Isaac Level: developer 30953e0a2f3SToby Isaac 31053e0a2f3SToby Isaac Note: 31153e0a2f3SToby Isaac After `PetscLogHandlerStop()`, the handler can still access the global logging state 31253e0a2f3SToby Isaac with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing 31353e0a2f3SToby Isaac (for instance, in `PetscLogHandlerView()`), 31453e0a2f3SToby Isaac 31553e0a2f3SToby Isaac When a log handler is stopped, the remaining stages will be popped before it is 31653e0a2f3SToby Isaac disconnected from the log stream. 31753e0a2f3SToby Isaac 31853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()` 31953e0a2f3SToby Isaac @*/ 32053e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h) 32153e0a2f3SToby Isaac { 32253e0a2f3SToby Isaac PetscFunctionBegin; 32353e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 32453e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == h) { 32553e0a2f3SToby Isaac if (petsc_log_state) { 32653e0a2f3SToby Isaac PetscLogState state; 32753e0a2f3SToby Isaac PetscLogStage stack_height; 32853e0a2f3SToby Isaac PetscIntStack orig_stack, temp_stack; 32953e0a2f3SToby Isaac 33053e0a2f3SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 33153e0a2f3SToby Isaac PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started."); 33253e0a2f3SToby Isaac stack_height = petsc_log_state->stage_stack->top + 1; 33353e0a2f3SToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 33453e0a2f3SToby Isaac orig_stack = petsc_log_state->stage_stack; 33553e0a2f3SToby Isaac petsc_log_state->stage_stack = temp_stack; 33653e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 33753e0a2f3SToby Isaac PetscLogStage stage = (PetscLogStage)orig_stack->stack[s]; 33853e0a2f3SToby Isaac 33953e0a2f3SToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 34053e0a2f3SToby Isaac } 34153e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 34253e0a2f3SToby Isaac PetscLogStage stage; 34353e0a2f3SToby Isaac PetscBool empty; 34453e0a2f3SToby Isaac 34553e0a2f3SToby Isaac PetscCall(PetscIntStackPop(temp_stack, &stage)); 34653e0a2f3SToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &empty)); 34753e0a2f3SToby Isaac if (!empty) { 34853e0a2f3SToby Isaac PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage)); 34953e0a2f3SToby Isaac } else petsc_log_state->current_stage = -1; 35053e0a2f3SToby Isaac PetscCall(PetscLogHandlerStagePop(h, stage)); 35153e0a2f3SToby Isaac } 35253e0a2f3SToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 35353e0a2f3SToby Isaac petsc_log_state->stage_stack = orig_stack; 35453e0a2f3SToby Isaac PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage)); 35553e0a2f3SToby Isaac } 35653e0a2f3SToby Isaac PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1)); 35753e0a2f3SToby Isaac PetscCall(PetscObjectDereference((PetscObject)h)); 35853e0a2f3SToby Isaac } 35953e0a2f3SToby Isaac } 36053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 36153e0a2f3SToby Isaac } 3625c6c1daeSBarry Smith 3635c6c1daeSBarry Smith /*@C 3644dd65854SConnor Ward PetscLogIsActive - Check if logging is currently in progress. 3654dd65854SConnor Ward 3664dd65854SConnor Ward Not Collective 3674dd65854SConnor Ward 3684dd65854SConnor Ward Output Parameter: 369811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise 3704dd65854SConnor Ward 3714dd65854SConnor Ward Level: beginner 3724dd65854SConnor Ward 373b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()` 3744dd65854SConnor Ward @*/ 375d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive) 376d71ae5a4SJacob Faibussowitsch { 3774dd65854SConnor Ward PetscFunctionBegin; 378b665b14eSToby Isaac *isActive = PETSC_FALSE; 379b665b14eSToby Isaac if (petsc_log_state) { 380b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 381b665b14eSToby Isaac if (PetscLogHandlers[i].handler) { 382b665b14eSToby Isaac *isActive = PETSC_TRUE; 383b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 384b665b14eSToby Isaac } 385b665b14eSToby Isaac } 386b665b14eSToby Isaac } 387b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 388b665b14eSToby Isaac } 389b665b14eSToby Isaac 390b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive) 391b665b14eSToby Isaac { 392b665b14eSToby Isaac PetscFunctionBegin; 393b665b14eSToby Isaac *isActive = PETSC_FALSE; 394b665b14eSToby Isaac if (petsc_log_state) { 395b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 396b665b14eSToby Isaac if (PetscLogHandlers[i].eventBegin) { 397b665b14eSToby Isaac *isActive = PETSC_TRUE; 398b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 399b665b14eSToby Isaac } 400b665b14eSToby Isaac } 401b665b14eSToby Isaac } 402b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 403b665b14eSToby Isaac } 404b665b14eSToby Isaac 405b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive) 406b665b14eSToby Isaac { 407b665b14eSToby Isaac PetscFunctionBegin; 408b665b14eSToby Isaac *isActive = PETSC_FALSE; 409b665b14eSToby Isaac if (petsc_log_state) { 410b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 411b665b14eSToby Isaac if (PetscLogHandlers[i].eventEnd) { 412b665b14eSToby Isaac *isActive = PETSC_TRUE; 413b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 414b665b14eSToby Isaac } 415b665b14eSToby Isaac } 416b665b14eSToby Isaac } 4173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4184dd65854SConnor Ward } 4194dd65854SConnor Ward 42053e0a2f3SToby Isaac static PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type) 42153e0a2f3SToby Isaac { 42253e0a2f3SToby Isaac PetscLogHandler handler; 42353e0a2f3SToby Isaac 42453e0a2f3SToby Isaac PetscFunctionBegin; 42553e0a2f3SToby Isaac PetscCall(PetscLogTryGetHandler(type, &handler)); 42653e0a2f3SToby Isaac if (handler) PetscFunctionReturn(PETSC_SUCCESS); 42753e0a2f3SToby Isaac PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler)); 42853e0a2f3SToby Isaac PetscCall(PetscLogHandlerSetType(handler, type)); 42953e0a2f3SToby Isaac PetscCall(PetscLogHandlerStart(handler)); 43053e0a2f3SToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 43153e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 43253e0a2f3SToby Isaac } 43353e0a2f3SToby Isaac 4344dd65854SConnor Ward /*@C 435b665b14eSToby Isaac PetscLogDefaultBegin - Turns on logging of objects and events using the default log handler. This logs flop 4365c6c1daeSBarry Smith rates and object creation and should not slow programs down too much. 4375c6c1daeSBarry Smith This routine may be called more than once. 4385c6c1daeSBarry Smith 439811af0c4SBarry Smith Logically Collective over `PETSC_COMM_WORLD` 4405c6c1daeSBarry Smith 441811af0c4SBarry Smith Options Database Key: 442a2553e36SBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the 443a2553e36SBarry Smith screen (for code configured with --with-log=1 (which is the default)) 4445c6c1daeSBarry Smith 44510450e9eSJacob Faibussowitsch Example Usage: 4465c6c1daeSBarry Smith .vb 4475c6c1daeSBarry Smith PetscInitialize(...); 448bb1d7374SBarry Smith PetscLogDefaultBegin(); 4495c6c1daeSBarry Smith ... code ... 4505c6c1daeSBarry Smith PetscLogView(viewer); or PetscLogDump(); 4515c6c1daeSBarry Smith PetscFinalize(); 4525c6c1daeSBarry Smith .ve 4535c6c1daeSBarry Smith 454d1f92df0SBarry Smith Level: advanced 455d1f92df0SBarry Smith 456811af0c4SBarry Smith Note: 457811af0c4SBarry Smith `PetscLogView()` or `PetscLogDump()` actually cause the printing of 4585c6c1daeSBarry Smith the logging information. 4595c6c1daeSBarry Smith 460b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()` 4615c6c1daeSBarry Smith @*/ 462d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void) 463d71ae5a4SJacob Faibussowitsch { 4645c6c1daeSBarry Smith PetscFunctionBegin; 465294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT)); 4663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4675c6c1daeSBarry Smith } 4685c6c1daeSBarry Smith 4695c6c1daeSBarry Smith /*@C 470b665b14eSToby Isaac PetscLogTraceBegin - Begins trace logging. Every time a PETSc event 4715c6c1daeSBarry Smith begins or ends, the event name is printed. 4725c6c1daeSBarry Smith 473811af0c4SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 4745c6c1daeSBarry Smith 4755c6c1daeSBarry Smith Input Parameter: 4765c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout) 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith Options Database Key: 479b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()` 4805c6c1daeSBarry Smith 481d1f92df0SBarry Smith Level: intermediate 482d1f92df0SBarry Smith 4835c6c1daeSBarry Smith Notes: 484811af0c4SBarry Smith `PetscLogTraceBegin()` prints the processor number, the execution time (sec), 4855c6c1daeSBarry Smith then "Event begin:" or "Event end:" followed by the event name. 4865c6c1daeSBarry Smith 487811af0c4SBarry Smith `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful 4885c6c1daeSBarry Smith to determine where a program is hanging without running in the 4895c6c1daeSBarry Smith debugger. Can be used in conjunction with the -info option. 4905c6c1daeSBarry Smith 491b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()` 4925c6c1daeSBarry Smith @*/ 493d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file) 494d71ae5a4SJacob Faibussowitsch { 495b665b14eSToby Isaac PetscLogHandler handler; 4965c6c1daeSBarry Smith PetscFunctionBegin; 497294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler)); 498b665b14eSToby Isaac if (handler) PetscFunctionReturn(PETSC_SUCCESS); 499b665b14eSToby Isaac PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler)); 500b665b14eSToby Isaac PetscCall(PetscLogHandlerStart(handler)); 501b665b14eSToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 502b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 503b665b14eSToby Isaac } 504a297a907SKarl Rupp 505b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *); 506b665b14eSToby Isaac 507b665b14eSToby Isaac /*@C 508b665b14eSToby Isaac PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop 509b665b14eSToby Isaac rates and object creation and should not slow programs down too much. 510b665b14eSToby Isaac 511b665b14eSToby Isaac Logically Collective over `PETSC_COMM_WORLD` 512b665b14eSToby Isaac 513b665b14eSToby Isaac Options Database Keys: 514b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file 515b665b14eSToby Isaac 516b665b14eSToby Isaac Example Usage: 517b665b14eSToby Isaac .vb 518b665b14eSToby Isaac PetscInitialize(...); 519b665b14eSToby Isaac PetscLogNestedBegin(); 520b665b14eSToby Isaac ... code ... 521b665b14eSToby Isaac PetscLogView(viewer); 522b665b14eSToby Isaac PetscFinalize(); 523b665b14eSToby Isaac .ve 524b665b14eSToby Isaac 525b665b14eSToby Isaac Level: advanced 526b665b14eSToby Isaac 527b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()` 528b665b14eSToby Isaac @*/ 529b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void) 530b665b14eSToby Isaac { 531b665b14eSToby Isaac PetscFunctionBegin; 532294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED)); 5333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5345c6c1daeSBarry Smith } 5355c6c1daeSBarry Smith 53653e0a2f3SToby Isaac /*@C 53753e0a2f3SToby Isaac PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks 53853e0a2f3SToby Isaac matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`, 53953e0a2f3SToby Isaac `PetscLogPHC`, `PetscLogPHD`. 54053e0a2f3SToby Isaac 54153e0a2f3SToby Isaac Logically Collective over `PETSC_COMM_WORLD` 54253e0a2f3SToby Isaac 54353e0a2f3SToby Isaac Input Parameters: 54453e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`) 54553e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`) 54653e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`) 54753e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`) 54853e0a2f3SToby Isaac 54953e0a2f3SToby Isaac Calling sequence of `PetscLogPLB`: 55053e0a2f3SToby Isaac + e - a `PetscLogEvent` that is beginning 55153e0a2f3SToby Isaac . _i - deprecated, unused 55253e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 55353e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 55453e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 55553e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 55653e0a2f3SToby Isaac 55753e0a2f3SToby Isaac Calling sequence of `PetscLogPLE`: 55853e0a2f3SToby Isaac + e - a `PetscLogEvent` that is beginning 55953e0a2f3SToby Isaac . _i - deprecated, unused 56053e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 56153e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 56253e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 56353e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 56453e0a2f3SToby Isaac 56553e0a2f3SToby Isaac Calling sequence of `PetscLogPHC`: 56653e0a2f3SToby Isaac . o - a `PetscObject` that has just been created 56753e0a2f3SToby Isaac 56853e0a2f3SToby Isaac Calling sequence of `PetscLogPHD`: 56953e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed 57053e0a2f3SToby Isaac 57153e0a2f3SToby Isaac Level: advanced 57253e0a2f3SToby Isaac 57353e0a2f3SToby Isaac Notes: 57453e0a2f3SToby Isaac This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code. 57553e0a2f3SToby Isaac 57653e0a2f3SToby Isaac This should help migrate external log handlers to use `PetscLogHandler`, but 57753e0a2f3SToby Isaac callbacks that depend on the deprecated `PetscLogStage` datatype will have to be 57853e0a2f3SToby Isaac updated. 57953e0a2f3SToby Isaac 58053e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState` 58153e0a2f3SToby Isaac @*/ 58253e0a2f3SToby Isaac PetscErrorCode PetscLogLegacyCallbacksBegin(PetscErrorCode (*PetscLogPLB)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPLE)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPHC)(PetscObject o), PetscErrorCode (*PetscLogPHD)(PetscObject o)) 58353e0a2f3SToby Isaac { 58453e0a2f3SToby Isaac PetscLogHandler handler; 58553e0a2f3SToby Isaac 58653e0a2f3SToby Isaac PetscFunctionBegin; 58753e0a2f3SToby Isaac PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler)); 58853e0a2f3SToby Isaac PetscCall(PetscLogHandlerStart(handler)); 58953e0a2f3SToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 59053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 59153e0a2f3SToby Isaac } 59253e0a2f3SToby Isaac 5932611ad71SToby Isaac #if defined(PETSC_HAVE_MPE) 5942611ad71SToby Isaac #include <mpe.h> 5952611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE; 5962611ad71SToby Isaac #endif 5972611ad71SToby Isaac 5982611ad71SToby Isaac /*@C 5992611ad71SToby Isaac PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the 6002611ad71SToby Isaac program down. 6012611ad71SToby Isaac 6022611ad71SToby Isaac Collective over `PETSC_COMM_WORLD` 6032611ad71SToby Isaac 6042611ad71SToby Isaac Options Database Key: 6052611ad71SToby Isaac . -log_mpe - Prints extensive log information 6062611ad71SToby Isaac 6072611ad71SToby Isaac Level: advanced 6082611ad71SToby Isaac 6092611ad71SToby Isaac Note: 6102611ad71SToby Isaac A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is 6112611ad71SToby Isaac intended for production runs since it logs only flop rates and object creation (and should 6122611ad71SToby Isaac not significantly slow the programs). 6132611ad71SToby Isaac 614b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`, 6152611ad71SToby Isaac `PetscLogEventDeactivate()` 6162611ad71SToby Isaac @*/ 6172611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void) 6182611ad71SToby Isaac { 6192611ad71SToby Isaac PetscFunctionBegin; 6202611ad71SToby Isaac #if defined(PETSC_HAVE_MPE) 6212611ad71SToby Isaac /* Do MPE initialization */ 6222611ad71SToby Isaac if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */ 6232611ad71SToby Isaac PetscCall(PetscInfo(0, "Initializing MPE.\n")); 6242611ad71SToby Isaac PetscCall(MPE_Init_log()); 6252611ad71SToby Isaac 6262611ad71SToby Isaac PetscBeganMPE = PETSC_TRUE; 6272611ad71SToby Isaac } else { 6282611ad71SToby Isaac PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n")); 6292611ad71SToby Isaac } 630294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE)); 6312611ad71SToby Isaac #else 6322611ad71SToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe"); 6332611ad71SToby Isaac #endif 6342611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 6352611ad71SToby Isaac } 6362611ad71SToby Isaac 63753e0a2f3SToby Isaac #if defined(PETSC_HAVE_TAU_PERFSTUBS) 63853e0a2f3SToby Isaac #include <../src/sys/perfstubs/timer.h> 63953e0a2f3SToby Isaac #endif 64053e0a2f3SToby Isaac 64153e0a2f3SToby Isaac /*@C 64253e0a2f3SToby Isaac PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface. 64353e0a2f3SToby Isaac 64453e0a2f3SToby Isaac Collective over `PETSC_COMM_WORLD` 64553e0a2f3SToby Isaac 64653e0a2f3SToby Isaac Options Database Key: 64753e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface 64853e0a2f3SToby Isaac 64953e0a2f3SToby Isaac Level: advanced 65053e0a2f3SToby Isaac 65153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()` 65253e0a2f3SToby Isaac @*/ 65353e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void) 65453e0a2f3SToby Isaac { 65553e0a2f3SToby Isaac PetscFunctionBegin; 65653e0a2f3SToby Isaac #if defined(PETSC_HAVE_TAU_PERFSTUBS) 657294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS)); 65853e0a2f3SToby Isaac #else 65953e0a2f3SToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs"); 66053e0a2f3SToby Isaac #endif 66153e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 66253e0a2f3SToby Isaac } 66353e0a2f3SToby Isaac 6645c6c1daeSBarry Smith /*@ 665b665b14eSToby Isaac PetscLogActions - Determines whether actions are logged for the default log handler. 6665c6c1daeSBarry Smith 6675c6c1daeSBarry Smith Not Collective 6685c6c1daeSBarry Smith 6695c6c1daeSBarry Smith Input Parameter: 670811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged 671811af0c4SBarry Smith 672811af0c4SBarry Smith Options Database Key: 673b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing 674b665b14eSToby Isaac - -log_include_actions - Turn on action logging 6755c6c1daeSBarry Smith 6765c6c1daeSBarry Smith Level: intermediate 6775c6c1daeSBarry Smith 678811af0c4SBarry Smith Note: 679811af0c4SBarry Smith Logging of actions continues to consume more memory as the program 6805c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 681aec76313SJacob Faibussowitsch 682b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()` 6835c6c1daeSBarry Smith @*/ 684d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag) 685d71ae5a4SJacob Faibussowitsch { 6865c6c1daeSBarry Smith PetscFunctionBegin; 687*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 688*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 689*dff009beSToby Isaac 690*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag)); 691*dff009beSToby Isaac } 6923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6935c6c1daeSBarry Smith } 6945c6c1daeSBarry Smith 6955c6c1daeSBarry Smith /*@ 6965c6c1daeSBarry Smith PetscLogObjects - Determines whether objects are logged for the graphical viewer. 6975c6c1daeSBarry Smith 6985c6c1daeSBarry Smith Not Collective 6995c6c1daeSBarry Smith 7005c6c1daeSBarry Smith Input Parameter: 701811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged 702811af0c4SBarry Smith 703811af0c4SBarry Smith Options Database Key: 704b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing 705b665b14eSToby Isaac - -log_include_objects - Turns on object logging 7065c6c1daeSBarry Smith 7075c6c1daeSBarry Smith Level: intermediate 7085c6c1daeSBarry Smith 709811af0c4SBarry Smith Note: 710811af0c4SBarry Smith Logging of objects continues to consume more memory as the program 7115c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 7125c6c1daeSBarry Smith 713b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()` 7145c6c1daeSBarry Smith @*/ 715d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag) 716d71ae5a4SJacob Faibussowitsch { 7175c6c1daeSBarry Smith PetscFunctionBegin; 718*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 719*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 720*dff009beSToby Isaac 721*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag)); 722*dff009beSToby Isaac } 7233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7245c6c1daeSBarry Smith } 7255c6c1daeSBarry Smith 7265c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/ 7275c6c1daeSBarry Smith /*@C 72874c0405dSRichard Tran Mills PetscLogStageRegister - Attaches a character string name to a logging stage. 7295c6c1daeSBarry Smith 7305c6c1daeSBarry Smith Not Collective 7315c6c1daeSBarry Smith 7325c6c1daeSBarry Smith Input Parameter: 7335c6c1daeSBarry Smith . sname - The name to associate with that stage 7345c6c1daeSBarry Smith 7355c6c1daeSBarry Smith Output Parameter: 736b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`). 7375c6c1daeSBarry Smith 7385c6c1daeSBarry Smith Level: intermediate 7395c6c1daeSBarry Smith 740d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()` 7415c6c1daeSBarry Smith @*/ 742d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage) 743d71ae5a4SJacob Faibussowitsch { 744b665b14eSToby Isaac PetscLogState state; 7455c6c1daeSBarry Smith 7465c6c1daeSBarry Smith PetscFunctionBegin; 747b665b14eSToby Isaac *stage = -1; 748b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 749b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage)); 7503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7515c6c1daeSBarry Smith } 7525c6c1daeSBarry Smith 7535c6c1daeSBarry Smith /*@C 754811af0c4SBarry Smith PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage 7555c6c1daeSBarry Smith 7565c6c1daeSBarry Smith Not Collective 7575c6c1daeSBarry Smith 7585c6c1daeSBarry Smith Input Parameter: 7595c6c1daeSBarry Smith . stage - The stage on which to log 7605c6c1daeSBarry Smith 76110450e9eSJacob Faibussowitsch Example Usage: 762811af0c4SBarry Smith If the option -log_view is used to run the program containing the 7635c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 7645c6c1daeSBarry Smith PetscFinalize(). 7655c6c1daeSBarry Smith .vb 7665c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 7675c6c1daeSBarry Smith [stage 0 of code] 7685c6c1daeSBarry Smith PetscLogStagePush(1); 7695c6c1daeSBarry Smith [stage 1 of code] 7705c6c1daeSBarry Smith PetscLogStagePop(); 7715c6c1daeSBarry Smith PetscBarrier(...); 7725c6c1daeSBarry Smith [more stage 0 of code] 7735c6c1daeSBarry Smith PetscFinalize(); 7745c6c1daeSBarry Smith .ve 7755c6c1daeSBarry Smith 776d1f92df0SBarry Smith Level: intermediate 777d1f92df0SBarry Smith 778811af0c4SBarry Smith Note: 779811af0c4SBarry Smith Use `PetscLogStageRegister()` to register a stage. 7805c6c1daeSBarry Smith 781d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()` 7825c6c1daeSBarry Smith @*/ 783d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage) 784d71ae5a4SJacob Faibussowitsch { 785b665b14eSToby Isaac PetscLogState state; 7865c6c1daeSBarry Smith 7875c6c1daeSBarry Smith PetscFunctionBegin; 788b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 789b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 790b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 791b665b14eSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 792b665b14eSToby Isaac if (h) PetscCall(PetscLogHandlerStagePush(h, stage)); 793b665b14eSToby Isaac } 794b665b14eSToby Isaac PetscCall(PetscLogStateStagePush(state, stage)); 7953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7965c6c1daeSBarry Smith } 7975c6c1daeSBarry Smith 7985c6c1daeSBarry Smith /*@C 799811af0c4SBarry Smith PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()` 8005c6c1daeSBarry Smith 8015c6c1daeSBarry Smith Not Collective 8025c6c1daeSBarry Smith 80310450e9eSJacob Faibussowitsch Example Usage: 804811af0c4SBarry Smith If the option -log_view is used to run the program containing the 8055c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 8065c6c1daeSBarry Smith PetscFinalize(). 8075c6c1daeSBarry Smith .vb 8085c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 8095c6c1daeSBarry Smith [stage 0 of code] 8105c6c1daeSBarry Smith PetscLogStagePush(1); 8115c6c1daeSBarry Smith [stage 1 of code] 8125c6c1daeSBarry Smith PetscLogStagePop(); 8135c6c1daeSBarry Smith PetscBarrier(...); 8145c6c1daeSBarry Smith [more stage 0 of code] 8155c6c1daeSBarry Smith PetscFinalize(); 8165c6c1daeSBarry Smith .ve 8175c6c1daeSBarry Smith 8185c6c1daeSBarry Smith Level: intermediate 8195c6c1daeSBarry Smith 820d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()` 8215c6c1daeSBarry Smith @*/ 822d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void) 823d71ae5a4SJacob Faibussowitsch { 824b665b14eSToby Isaac PetscLogState state; 825b665b14eSToby Isaac PetscLogStage current_stage; 8265c6c1daeSBarry Smith 8275c6c1daeSBarry Smith PetscFunctionBegin; 828b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 829b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 830b665b14eSToby Isaac current_stage = state->current_stage; 831b665b14eSToby Isaac PetscCall(PetscLogStateStagePop(state)); 832b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 833b665b14eSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 834b665b14eSToby Isaac if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage)); 835b665b14eSToby Isaac } 8363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8375c6c1daeSBarry Smith } 8385c6c1daeSBarry Smith 8395c6c1daeSBarry Smith /*@ 840811af0c4SBarry Smith PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`. 8415c6c1daeSBarry Smith 8425c6c1daeSBarry Smith Not Collective 8435c6c1daeSBarry Smith 8445c6c1daeSBarry Smith Input Parameters: 8455c6c1daeSBarry Smith + stage - The stage 846811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8475c6c1daeSBarry Smith 8485c6c1daeSBarry Smith Level: intermediate 8495c6c1daeSBarry Smith 850811af0c4SBarry Smith Note: 851811af0c4SBarry Smith If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist 852811af0c4SBarry Smith 853d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 8545c6c1daeSBarry Smith @*/ 855d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive) 856d71ae5a4SJacob Faibussowitsch { 857b665b14eSToby Isaac PetscLogState state; 8585c6c1daeSBarry Smith 8595c6c1daeSBarry Smith PetscFunctionBegin; 860b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 861b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive)); 8623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8635c6c1daeSBarry Smith } 8645c6c1daeSBarry Smith 8655c6c1daeSBarry Smith /*@ 866811af0c4SBarry Smith PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`. 8675c6c1daeSBarry Smith 8685c6c1daeSBarry Smith Not Collective 8695c6c1daeSBarry Smith 8705c6c1daeSBarry Smith Input Parameter: 8715c6c1daeSBarry Smith . stage - The stage 8725c6c1daeSBarry Smith 8735c6c1daeSBarry Smith Output Parameter: 874811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8755c6c1daeSBarry Smith 8765c6c1daeSBarry Smith Level: intermediate 8775c6c1daeSBarry Smith 878d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 8795c6c1daeSBarry Smith @*/ 880d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive) 881d71ae5a4SJacob Faibussowitsch { 882b665b14eSToby Isaac PetscLogState state; 8835c6c1daeSBarry Smith 8845c6c1daeSBarry Smith PetscFunctionBegin; 885b665b14eSToby Isaac *isActive = PETSC_FALSE; 886b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 887b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive)); 8883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8895c6c1daeSBarry Smith } 8905c6c1daeSBarry Smith 8915c6c1daeSBarry Smith /*@ 892811af0c4SBarry Smith PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()` 8935c6c1daeSBarry Smith 8945c6c1daeSBarry Smith Not Collective 8955c6c1daeSBarry Smith 8965c6c1daeSBarry Smith Input Parameters: 8975c6c1daeSBarry Smith + stage - The stage 898811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8995c6c1daeSBarry Smith 9005c6c1daeSBarry Smith Level: intermediate 9015c6c1daeSBarry Smith 902aec76313SJacob Faibussowitsch Developer Notes: 903b665b14eSToby Isaac Visibility only affects the default log handler in `PetscLogView()`: stages that are 904b665b14eSToby Isaac set to invisible are suppressed from output. 905811af0c4SBarry Smith 906b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 9075c6c1daeSBarry Smith @*/ 908d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible) 9095c6c1daeSBarry Smith 910*dff009beSToby Isaac { 9115c6c1daeSBarry Smith PetscFunctionBegin; 912*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 913*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 914*dff009beSToby Isaac 915*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible)); 916*dff009beSToby Isaac } 9173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9185c6c1daeSBarry Smith } 9195c6c1daeSBarry Smith 9205c6c1daeSBarry Smith /*@ 921811af0c4SBarry Smith PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()` 9225c6c1daeSBarry Smith 9235c6c1daeSBarry Smith Not Collective 9245c6c1daeSBarry Smith 9255c6c1daeSBarry Smith Input Parameter: 9265c6c1daeSBarry Smith . stage - The stage 9275c6c1daeSBarry Smith 9285c6c1daeSBarry Smith Output Parameter: 929811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 9305c6c1daeSBarry Smith 9315c6c1daeSBarry Smith Level: intermediate 9325c6c1daeSBarry Smith 933b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 9345c6c1daeSBarry Smith @*/ 935d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible) 936d71ae5a4SJacob Faibussowitsch { 937b665b14eSToby Isaac PetscLogHandler handler; 9385c6c1daeSBarry Smith 9395c6c1daeSBarry Smith PetscFunctionBegin; 940b665b14eSToby Isaac *isVisible = PETSC_FALSE; 941294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 942*dff009beSToby Isaac if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); } 9433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9445c6c1daeSBarry Smith } 9455c6c1daeSBarry Smith 9465c6c1daeSBarry Smith /*@C 9475c6c1daeSBarry Smith PetscLogStageGetId - Returns the stage id when given the stage name. 9485c6c1daeSBarry Smith 9495c6c1daeSBarry Smith Not Collective 9505c6c1daeSBarry Smith 9515c6c1daeSBarry Smith Input Parameter: 9525c6c1daeSBarry Smith . name - The stage name 9535c6c1daeSBarry Smith 9545c6c1daeSBarry Smith Output Parameter: 9555a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists 9565c6c1daeSBarry Smith 9575c6c1daeSBarry Smith Level: intermediate 9585c6c1daeSBarry Smith 959d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 9605c6c1daeSBarry Smith @*/ 961d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage) 962d71ae5a4SJacob Faibussowitsch { 963b665b14eSToby Isaac PetscLogState state; 9645c6c1daeSBarry Smith 9655c6c1daeSBarry Smith PetscFunctionBegin; 966b665b14eSToby Isaac *stage = -1; 967b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 968b665b14eSToby Isaac if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage)); 9693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9705c6c1daeSBarry Smith } 9715c6c1daeSBarry Smith 97253e0a2f3SToby Isaac /*@C 97353e0a2f3SToby Isaac PetscLogStageGetName - Returns the stage name when given the stage id. 97453e0a2f3SToby Isaac 97553e0a2f3SToby Isaac Not Collective 97653e0a2f3SToby Isaac 97753e0a2f3SToby Isaac Input Parameter: 97853e0a2f3SToby Isaac . stage - The stage 97953e0a2f3SToby Isaac 98053e0a2f3SToby Isaac Output Parameter: 98153e0a2f3SToby Isaac . name - The stage name 98253e0a2f3SToby Isaac 98353e0a2f3SToby Isaac Level: intermediate 98453e0a2f3SToby Isaac 98553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 98653e0a2f3SToby Isaac @*/ 98753e0a2f3SToby Isaac PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char **name) 98853e0a2f3SToby Isaac { 98953e0a2f3SToby Isaac PetscLogStageInfo stage_info; 99053e0a2f3SToby Isaac PetscLogState state; 99153e0a2f3SToby Isaac 99253e0a2f3SToby Isaac PetscFunctionBegin; 993b665b14eSToby Isaac *name = NULL; 99453e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 995b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 99653e0a2f3SToby Isaac PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info)); 99753e0a2f3SToby Isaac *name = stage_info.name; 99853e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 99953e0a2f3SToby Isaac } 100053e0a2f3SToby Isaac 10015c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/ 10027a101e5eSJacob Faibussowitsch 10035c6c1daeSBarry Smith /*@C 1004811af0c4SBarry Smith PetscLogEventRegister - Registers an event name for logging operations 10055c6c1daeSBarry Smith 10065c6c1daeSBarry Smith Not Collective 10075c6c1daeSBarry Smith 1008d8d19677SJose E. Roman Input Parameters: 10095c6c1daeSBarry Smith + name - The name associated with the event 10105c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with 1011811af0c4SBarry Smith `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones 10125c6c1daeSBarry Smith are only available in C code 10135c6c1daeSBarry Smith 10145c6c1daeSBarry Smith Output Parameter: 1015811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`. 10165c6c1daeSBarry Smith 101710450e9eSJacob Faibussowitsch Example Usage: 10185c6c1daeSBarry Smith .vb 10195c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 10205c6c1daeSBarry Smith PetscClassId classid; 10215c6c1daeSBarry Smith PetscLogDouble user_event_flops; 10225c6c1daeSBarry Smith PetscClassIdRegister("class name",&classid); 10235c6c1daeSBarry Smith PetscLogEventRegister("User event name",classid,&USER_EVENT); 10245c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 10255c6c1daeSBarry Smith [code segment to monitor] 10265c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 10275c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 10285c6c1daeSBarry Smith .ve 10295c6c1daeSBarry Smith 1030d1f92df0SBarry Smith Level: intermediate 1031d1f92df0SBarry Smith 10325c6c1daeSBarry Smith Notes: 10335c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 1034a2553e36SBarry Smith configured with --with-log (which is the default) and 1035811af0c4SBarry Smith -log_view or -log_all is specified. `PetscLogEventRegister()` is 10365c6c1daeSBarry Smith intended for logging user events to supplement this PETSc 10375c6c1daeSBarry Smith information. 10385c6c1daeSBarry Smith 1039495fc317SBarry Smith PETSc can gather data for use with the utilities Jumpshot 10405c6c1daeSBarry Smith (part of the MPICH distribution). If PETSc has been compiled 10415c6c1daeSBarry Smith with flag -DPETSC_HAVE_MPE (MPE is an additional utility within 10425c6c1daeSBarry Smith MPICH), the user can employ another command line option, -log_mpe, 10435c6c1daeSBarry Smith to create a logfile, "mpe.log", which can be visualized 1044495fc317SBarry Smith Jumpshot. 10455c6c1daeSBarry Smith 10465c6c1daeSBarry Smith The classid is associated with each event so that classes of events 10475c6c1daeSBarry Smith can be disabled simultaneously, such as all matrix events. The user 1048811af0c4SBarry Smith can either use an existing classid, such as `MAT_CLASSID`, or create 10495c6c1daeSBarry Smith their own as shown in the example. 10505c6c1daeSBarry Smith 1051c5deb1d5SJed Brown If an existing event with the same name exists, its event handle is 1052c5deb1d5SJed Brown returned instead of creating a new event. 1053c5deb1d5SJed Brown 1054d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`, 1055db781477SPatrick Sanan `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()` 10565c6c1daeSBarry Smith @*/ 1057d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event) 1058d71ae5a4SJacob Faibussowitsch { 1059b665b14eSToby Isaac PetscLogState state; 10605c6c1daeSBarry Smith 10615c6c1daeSBarry Smith PetscFunctionBegin; 1062b665b14eSToby Isaac *event = -1; 1063b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1064b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event)); 10653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10665c6c1daeSBarry Smith } 10675c6c1daeSBarry Smith 10685c6c1daeSBarry Smith /*@ 1069217044c2SLisandro Dalcin PetscLogEventSetCollective - Indicates that a particular event is collective. 1070217044c2SLisandro Dalcin 1071217044c2SLisandro Dalcin Not Collective 1072217044c2SLisandro Dalcin 1073d8d19677SJose E. Roman Input Parameters: 1074217044c2SLisandro Dalcin + event - The event id 1075d5b43468SJose E. Roman - collective - Boolean flag indicating whether a particular event is collective 1076217044c2SLisandro Dalcin 1077d1f92df0SBarry Smith Level: developer 1078d1f92df0SBarry Smith 1079811af0c4SBarry Smith Notes: 1080811af0c4SBarry Smith New events returned from `PetscLogEventRegister()` are collective by default. 1081811af0c4SBarry Smith 1082811af0c4SBarry Smith Collective events are handled specially if the -log_sync is used. In that case the logging saves information about 1083811af0c4SBarry Smith two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication 1084811af0c4SBarry Smith to be performed. This option is useful to debug imbalance within the computations or communications 1085217044c2SLisandro Dalcin 1086d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()` 1087217044c2SLisandro Dalcin @*/ 1088d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective) 1089d71ae5a4SJacob Faibussowitsch { 1090b665b14eSToby Isaac PetscLogState state; 1091217044c2SLisandro Dalcin 1092217044c2SLisandro Dalcin PetscFunctionBegin; 1093b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1094b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective)); 1095b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1096b665b14eSToby Isaac } 1097b665b14eSToby Isaac 1098b665b14eSToby Isaac /* 1099b665b14eSToby Isaac PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage. 1100b665b14eSToby Isaac 1101b665b14eSToby Isaac Not Collective 1102b665b14eSToby Isaac 1103b665b14eSToby Isaac Input Parameters: 1104b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1105b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers. 1106b665b14eSToby Isaac 1107b665b14eSToby Isaac Level: developer 1108b665b14eSToby Isaac 1109b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()` 1110b665b14eSToby Isaac */ 1111b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive) 1112b665b14eSToby Isaac { 1113b665b14eSToby Isaac PetscLogState state; 1114b665b14eSToby Isaac 1115b665b14eSToby Isaac PetscFunctionBegin; 1116b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1117b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive)); 11183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1119217044c2SLisandro Dalcin } 1120217044c2SLisandro Dalcin 1121217044c2SLisandro Dalcin /*@ 1122fa2bb9feSLisandro Dalcin PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage. 1123fa2bb9feSLisandro Dalcin 1124fa2bb9feSLisandro Dalcin Not Collective 1125fa2bb9feSLisandro Dalcin 1126fa2bb9feSLisandro Dalcin Input Parameter: 1127811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1128fa2bb9feSLisandro Dalcin 1129fa2bb9feSLisandro Dalcin Level: developer 1130fa2bb9feSLisandro Dalcin 1131d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 1132fa2bb9feSLisandro Dalcin @*/ 1133d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid) 1134d71ae5a4SJacob Faibussowitsch { 1135fa2bb9feSLisandro Dalcin PetscFunctionBegin; 1136b665b14eSToby Isaac PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE)); 11373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1138fa2bb9feSLisandro Dalcin } 1139fa2bb9feSLisandro Dalcin 1140fa2bb9feSLisandro Dalcin /*@ 1141fa2bb9feSLisandro Dalcin PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage. 1142fa2bb9feSLisandro Dalcin 1143fa2bb9feSLisandro Dalcin Not Collective 1144fa2bb9feSLisandro Dalcin 1145fa2bb9feSLisandro Dalcin Input Parameter: 1146811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1147fa2bb9feSLisandro Dalcin 1148fa2bb9feSLisandro Dalcin Level: developer 1149fa2bb9feSLisandro Dalcin 1150811af0c4SBarry Smith Note: 1151811af0c4SBarry Smith If a class is excluded then events associated with that class are not logged. 1152811af0c4SBarry Smith 1153d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()` 1154fa2bb9feSLisandro Dalcin @*/ 1155d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid) 1156d71ae5a4SJacob Faibussowitsch { 1157b665b14eSToby Isaac PetscFunctionBegin; 1158b665b14eSToby Isaac PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE)); 1159b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1160b665b14eSToby Isaac } 1161b665b14eSToby Isaac 1162b665b14eSToby Isaac /* 1163b665b14eSToby Isaac PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage 1164b665b14eSToby Isaac 1165b665b14eSToby Isaac Not Collective 1166b665b14eSToby Isaac 1167b665b14eSToby Isaac Input Parameters: 1168b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage) 1169b665b14eSToby Isaac . event - A `PetscLogEvent` 1170b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage 1171b665b14eSToby Isaac 1172b665b14eSToby Isaac Usage: 1173b665b14eSToby Isaac .vb 1174b665b14eSToby Isaac PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE); 1175b665b14eSToby Isaac [code where you do not want to log VecSetValues()] 1176b665b14eSToby Isaac PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE); 1177b665b14eSToby Isaac [code where you do want to log VecSetValues()] 1178b665b14eSToby Isaac .ve 1179b665b14eSToby Isaac 1180b665b14eSToby Isaac Level: advanced 1181b665b14eSToby Isaac 1182b665b14eSToby Isaac Note: 1183b665b14eSToby Isaac The event may be either a pre-defined PETSc event (found in include/petsclog.h) 1184b665b14eSToby Isaac or an event number obtained with `PetscLogEventRegister()`. 1185b665b14eSToby Isaac 1186b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 1187b665b14eSToby Isaac */ 1188b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive) 1189b665b14eSToby Isaac { 1190b665b14eSToby Isaac PetscLogState state; 1191fa2bb9feSLisandro Dalcin 1192fa2bb9feSLisandro Dalcin PetscFunctionBegin; 1193b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1194b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive)); 11953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1196fa2bb9feSLisandro Dalcin } 1197fa2bb9feSLisandro Dalcin 1198fa2bb9feSLisandro Dalcin /*@ 11995c6c1daeSBarry Smith PetscLogEventActivate - Indicates that a particular event should be logged. 12005c6c1daeSBarry Smith 12015c6c1daeSBarry Smith Not Collective 12025c6c1daeSBarry Smith 12035c6c1daeSBarry Smith Input Parameter: 12045c6c1daeSBarry Smith . event - The event id 12055c6c1daeSBarry Smith 120610450e9eSJacob Faibussowitsch Example Usage: 12075c6c1daeSBarry Smith .vb 12085c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 12095c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 12105c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 12115c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 12125c6c1daeSBarry Smith .ve 12135c6c1daeSBarry Smith 1214d1f92df0SBarry Smith Level: advanced 1215d1f92df0SBarry Smith 12165c6c1daeSBarry Smith Note: 12175c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in include/petsclog.h) 1218811af0c4SBarry Smith or an event number obtained with `PetscLogEventRegister()`. 12195c6c1daeSBarry Smith 1220b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 12215c6c1daeSBarry Smith @*/ 1222d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event) 1223d71ae5a4SJacob Faibussowitsch { 12245c6c1daeSBarry Smith PetscFunctionBegin; 1225b665b14eSToby Isaac PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE)); 12263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12275c6c1daeSBarry Smith } 12285c6c1daeSBarry Smith 12295c6c1daeSBarry Smith /*@ 12305c6c1daeSBarry Smith PetscLogEventDeactivate - Indicates that a particular event should not be logged. 12315c6c1daeSBarry Smith 12325c6c1daeSBarry Smith Not Collective 12335c6c1daeSBarry Smith 12345c6c1daeSBarry Smith Input Parameter: 12355c6c1daeSBarry Smith . event - The event id 12365c6c1daeSBarry Smith 123710450e9eSJacob Faibussowitsch Example Usage: 12385c6c1daeSBarry Smith .vb 12395c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 12405c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 12415c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 12425c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 12435c6c1daeSBarry Smith .ve 12445c6c1daeSBarry Smith 1245d1f92df0SBarry Smith Level: advanced 1246d1f92df0SBarry Smith 12475c6c1daeSBarry Smith Note: 12485c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in 1249811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 12505c6c1daeSBarry Smith 1251d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 12525c6c1daeSBarry Smith @*/ 1253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event) 1254d71ae5a4SJacob Faibussowitsch { 12555c6c1daeSBarry Smith PetscFunctionBegin; 1256b665b14eSToby Isaac PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE)); 12573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12585c6c1daeSBarry Smith } 12595c6c1daeSBarry Smith 12605c6c1daeSBarry Smith /*@ 1261811af0c4SBarry Smith PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called 1262c00cb57fSBarry Smith 1263c00cb57fSBarry Smith Not Collective 1264c00cb57fSBarry Smith 1265c00cb57fSBarry Smith Input Parameter: 1266c00cb57fSBarry Smith . event - The event id 1267c00cb57fSBarry Smith 126810450e9eSJacob Faibussowitsch Example Usage: 1269c00cb57fSBarry Smith .vb 1270c00cb57fSBarry Smith PetscLogEventDeactivatePush(VEC_SetValues); 1271c00cb57fSBarry Smith [code where you do not want to log VecSetValues()] 1272c00cb57fSBarry Smith PetscLogEventDeactivatePop(VEC_SetValues); 1273c00cb57fSBarry Smith [code where you do want to log VecSetValues()] 1274c00cb57fSBarry Smith .ve 1275c00cb57fSBarry Smith 1276d1f92df0SBarry Smith Level: advanced 1277d1f92df0SBarry Smith 1278c00cb57fSBarry Smith Note: 1279c00cb57fSBarry Smith The event may be either a pre-defined PETSc event (found in 1280811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 1281c00cb57fSBarry Smith 1282b665b14eSToby Isaac PETSc's default log handler (`PetscLogDefaultBegin()`) respects this function because it can make the output of `PetscLogView()` easier to interpret, but other handlers (such as the nested handler, `PetscLogNestedBegin()`) ignore it because surpressing events is not helpful in their output formats. 1283b665b14eSToby Isaac 1284b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEVentDeactivate()`, `PetscLogEventDeactivatePop()` 1285c00cb57fSBarry Smith @*/ 1286d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event) 1287d71ae5a4SJacob Faibussowitsch { 1288c00cb57fSBarry Smith PetscFunctionBegin; 1289*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1290*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1291*dff009beSToby Isaac 1292*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event)); 1293*dff009beSToby Isaac } 12943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1295c00cb57fSBarry Smith } 1296c00cb57fSBarry Smith 1297c00cb57fSBarry Smith /*@ 1298811af0c4SBarry Smith PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()` 1299c00cb57fSBarry Smith 1300c00cb57fSBarry Smith Not Collective 1301c00cb57fSBarry Smith 1302c00cb57fSBarry Smith Input Parameter: 1303c00cb57fSBarry Smith . event - The event id 1304c00cb57fSBarry Smith 130510450e9eSJacob Faibussowitsch Example Usage: 1306c00cb57fSBarry Smith .vb 1307c00cb57fSBarry Smith PetscLogEventDeactivatePush(VEC_SetValues); 1308c00cb57fSBarry Smith [code where you do not want to log VecSetValues()] 1309c00cb57fSBarry Smith PetscLogEventDeactivatePop(VEC_SetValues); 1310c00cb57fSBarry Smith [code where you do want to log VecSetValues()] 1311c00cb57fSBarry Smith .ve 1312c00cb57fSBarry Smith 1313d1f92df0SBarry Smith Level: advanced 1314d1f92df0SBarry Smith 1315c00cb57fSBarry Smith Note: 1316c00cb57fSBarry Smith The event may be either a pre-defined PETSc event (found in 1317811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 1318c00cb57fSBarry Smith 1319d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()` 1320c00cb57fSBarry Smith @*/ 1321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event) 1322d71ae5a4SJacob Faibussowitsch { 1323c00cb57fSBarry Smith PetscFunctionBegin; 1324*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1325*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1326*dff009beSToby Isaac 1327*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event)); 1328*dff009beSToby Isaac } 13293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1330c00cb57fSBarry Smith } 1331c00cb57fSBarry Smith 1332c00cb57fSBarry Smith /*@ 1333811af0c4SBarry Smith PetscLogEventSetActiveAll - Turns on logging of all events 13345c6c1daeSBarry Smith 13355c6c1daeSBarry Smith Not Collective 13365c6c1daeSBarry Smith 13375c6c1daeSBarry Smith Input Parameters: 13385c6c1daeSBarry Smith + event - The event id 13395c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged 13405c6c1daeSBarry Smith 13415c6c1daeSBarry Smith Level: advanced 13425c6c1daeSBarry Smith 1343b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 13445c6c1daeSBarry Smith @*/ 1345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive) 1346d71ae5a4SJacob Faibussowitsch { 1347b665b14eSToby Isaac PetscLogState state; 13485c6c1daeSBarry Smith 13495c6c1daeSBarry Smith PetscFunctionBegin; 1350b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1351b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive)); 1352b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 13535c6c1daeSBarry Smith } 1354b665b14eSToby Isaac 1355b665b14eSToby Isaac /* 1356b665b14eSToby Isaac PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage 1357b665b14eSToby Isaac 1358b665b14eSToby Isaac Not Collective 1359b665b14eSToby Isaac 1360b665b14eSToby Isaac Input Parameters: 1361b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage) 1362b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1363b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers. 1364b665b14eSToby Isaac 1365b665b14eSToby Isaac Level: developer 1366b665b14eSToby Isaac 1367b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()` 1368b665b14eSToby Isaac */ 1369b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive) 1370b665b14eSToby Isaac { 1371b665b14eSToby Isaac PetscLogState state; 1372b665b14eSToby Isaac 1373b665b14eSToby Isaac PetscFunctionBegin; 1374b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1375b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive)); 13763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13775c6c1daeSBarry Smith } 13785c6c1daeSBarry Smith 13795c6c1daeSBarry Smith /*@ 1380811af0c4SBarry Smith PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage 13815c6c1daeSBarry Smith 13825c6c1daeSBarry Smith Not Collective 13835c6c1daeSBarry Smith 13845c6c1daeSBarry Smith Input Parameter: 1385811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 13865c6c1daeSBarry Smith 13875c6c1daeSBarry Smith Level: developer 13885c6c1daeSBarry Smith 1389d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 13905c6c1daeSBarry Smith @*/ 1391d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid) 1392d71ae5a4SJacob Faibussowitsch { 13935c6c1daeSBarry Smith PetscFunctionBegin; 1394b665b14eSToby Isaac PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE)); 13953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13965c6c1daeSBarry Smith } 13975c6c1daeSBarry Smith 13985c6c1daeSBarry Smith /*@ 1399811af0c4SBarry Smith PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage 14005c6c1daeSBarry Smith 14015c6c1daeSBarry Smith Not Collective 14025c6c1daeSBarry Smith 14035c6c1daeSBarry Smith Input Parameter: 1404811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 14055c6c1daeSBarry Smith 14065c6c1daeSBarry Smith Level: developer 14075c6c1daeSBarry Smith 1408d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 14095c6c1daeSBarry Smith @*/ 1410d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid) 1411d71ae5a4SJacob Faibussowitsch { 14125c6c1daeSBarry Smith PetscFunctionBegin; 1413b665b14eSToby Isaac PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE)); 14143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14155c6c1daeSBarry Smith } 14165c6c1daeSBarry Smith 14175c6c1daeSBarry Smith /*MC 141862872c28SLisandro Dalcin PetscLogEventSync - Synchronizes the beginning of a user event. 141962872c28SLisandro Dalcin 142062872c28SLisandro Dalcin Synopsis: 142162872c28SLisandro Dalcin #include <petsclog.h> 1422b665b14eSToby Isaac PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm) 142362872c28SLisandro Dalcin 142462872c28SLisandro Dalcin Collective 142562872c28SLisandro Dalcin 142662872c28SLisandro Dalcin Input Parameters: 1427b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 142862872c28SLisandro Dalcin - comm - an MPI communicator 142962872c28SLisandro Dalcin 143010450e9eSJacob Faibussowitsch Example Usage: 143162872c28SLisandro Dalcin .vb 143262872c28SLisandro Dalcin PetscLogEvent USER_EVENT; 143310450e9eSJacob Faibussowitsch 143462872c28SLisandro Dalcin PetscLogEventRegister("User event", 0, &USER_EVENT); 143562872c28SLisandro Dalcin PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD); 143662872c28SLisandro Dalcin PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 143762872c28SLisandro Dalcin [code segment to monitor] 143862872c28SLisandro Dalcin PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0); 143962872c28SLisandro Dalcin .ve 144062872c28SLisandro Dalcin 1441d1f92df0SBarry Smith Level: developer 1442d1f92df0SBarry Smith 1443811af0c4SBarry Smith Note: 144410450e9eSJacob Faibussowitsch This routine should be called only if there is not a `PetscObject` available to pass to 144510450e9eSJacob Faibussowitsch `PetscLogEventBegin()`. 144662872c28SLisandro Dalcin 1447d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()` 144862872c28SLisandro Dalcin M*/ 144962872c28SLisandro Dalcin 145062872c28SLisandro Dalcin /*MC 14515c6c1daeSBarry Smith PetscLogEventBegin - Logs the beginning of a user event. 14525c6c1daeSBarry Smith 14535c6c1daeSBarry Smith Synopsis: 1454aaa7dc30SBarry Smith #include <petsclog.h> 1455b665b14eSToby Isaac PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 14565c6c1daeSBarry Smith 14575c6c1daeSBarry Smith Not Collective 14585c6c1daeSBarry Smith 14595c6c1daeSBarry Smith Input Parameters: 1460b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 1461b665b14eSToby Isaac . o1 - object assocated with the event, or NULL 1462b665b14eSToby Isaac . o2 - object assocated with the event, or NULL 1463b665b14eSToby Isaac . o3 - object assocated with the event, or NULL 1464b665b14eSToby Isaac - o4 - object assocated with the event, or NULL 14655c6c1daeSBarry Smith 14665c6c1daeSBarry Smith Fortran Synopsis: 14675c6c1daeSBarry Smith void PetscLogEventBegin(int e, PetscErrorCode ierr) 14685c6c1daeSBarry Smith 146910450e9eSJacob Faibussowitsch Example Usage: 14705c6c1daeSBarry Smith .vb 14715c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 147210450e9eSJacob Faibussowitsch 14735c6c1daeSBarry Smith PetscLogDouble user_event_flops; 14745c6c1daeSBarry Smith PetscLogEventRegister("User event",0, &USER_EVENT); 14755c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 14765c6c1daeSBarry Smith [code segment to monitor] 14775c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 14785c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 14795c6c1daeSBarry Smith .ve 14805c6c1daeSBarry Smith 1481d1f92df0SBarry Smith Level: intermediate 1482d1f92df0SBarry Smith 1483811af0c4SBarry Smith Developer Note: 148410450e9eSJacob Faibussowitsch `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly 148510450e9eSJacob Faibussowitsch handling the errors that occur in the macro directly because other packages that use this 148610450e9eSJacob Faibussowitsch macros have used them in their own functions or methods that do not return error codes and it 148710450e9eSJacob Faibussowitsch would be disruptive to change the current behavior. 1488d0609cedSBarry Smith 1489d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()` 14905c6c1daeSBarry Smith M*/ 14915c6c1daeSBarry Smith 14925c6c1daeSBarry Smith /*MC 14935c6c1daeSBarry Smith PetscLogEventEnd - Log the end of a user event. 14945c6c1daeSBarry Smith 14955c6c1daeSBarry Smith Synopsis: 1496aaa7dc30SBarry Smith #include <petsclog.h> 1497b665b14eSToby Isaac PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 14985c6c1daeSBarry Smith 14995c6c1daeSBarry Smith Not Collective 15005c6c1daeSBarry Smith 15015c6c1daeSBarry Smith Input Parameters: 1502b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 1503b665b14eSToby Isaac . o1 - object assocated with the event, or NULL 1504b665b14eSToby Isaac . o2 - object assocated with the event, or NULL 1505b665b14eSToby Isaac . o3 - object assocated with the event, or NULL 1506b665b14eSToby Isaac - o4 - object assocated with the event, or NULL 15075c6c1daeSBarry Smith 15085c6c1daeSBarry Smith Fortran Synopsis: 15095c6c1daeSBarry Smith void PetscLogEventEnd(int e, PetscErrorCode ierr) 15105c6c1daeSBarry Smith 151110450e9eSJacob Faibussowitsch Example Usage: 15125c6c1daeSBarry Smith .vb 15135c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 151410450e9eSJacob Faibussowitsch 15155c6c1daeSBarry Smith PetscLogDouble user_event_flops; 151610450e9eSJacob Faibussowitsch PetscLogEventRegister("User event", 0, &USER_EVENT); 15175c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 15185c6c1daeSBarry Smith [code segment to monitor] 15195c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 15205c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 15215c6c1daeSBarry Smith .ve 15225c6c1daeSBarry Smith 15235c6c1daeSBarry Smith Level: intermediate 15245c6c1daeSBarry Smith 1525d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()` 15265c6c1daeSBarry Smith M*/ 15275c6c1daeSBarry Smith 15285c6c1daeSBarry Smith /*@C 1529b665b14eSToby Isaac PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage 1530b665b14eSToby Isaac 1531b665b14eSToby Isaac Input Parameters: 1532b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage 1533b665b14eSToby Isaac - event - The event number 1534b665b14eSToby Isaac 1535b665b14eSToby Isaac Output Parameter: 1536b665b14eSToby Isaac . info - This structure is filled with the performance information 1537b665b14eSToby Isaac 1538b665b14eSToby Isaac Level: intermediate 1539b665b14eSToby Isaac 1540b665b14eSToby Isaac Note: 1541b665b14eSToby Isaac This is a low level routine used by the logging functions in PETSc 1542b665b14eSToby Isaac 1543b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()` 1544b665b14eSToby Isaac @*/ 1545b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info) 1546b665b14eSToby Isaac { 1547b665b14eSToby Isaac PetscLogHandler handler; 1548b665b14eSToby Isaac PetscEventPerfInfo *event_info; 1549b665b14eSToby Isaac 1550b665b14eSToby Isaac PetscFunctionBegin; 1551b665b14eSToby Isaac PetscAssertPointer(info, 3); 1552294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 1553*dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info)); 1554b665b14eSToby Isaac *info = *event_info; 1555b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1556b665b14eSToby Isaac } 1557b665b14eSToby Isaac 1558b665b14eSToby Isaac /*@C 1559b665b14eSToby Isaac PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event 1560b665b14eSToby Isaac 1561b665b14eSToby Isaac Not Collective 1562b665b14eSToby Isaac 1563b665b14eSToby Isaac Input Parameters: 1564b665b14eSToby Isaac + event - The event id to log 1565b665b14eSToby Isaac . n - The dof index, in [0, 8) 1566b665b14eSToby Isaac - dof - The number of dofs 1567b665b14eSToby Isaac 1568b665b14eSToby Isaac Options Database Key: 1569b665b14eSToby Isaac . -log_view - Activates log summary 1570b665b14eSToby Isaac 1571b665b14eSToby Isaac Level: developer 1572b665b14eSToby Isaac 1573b665b14eSToby Isaac Note: 1574b665b14eSToby Isaac This is to enable logging of convergence 1575b665b14eSToby Isaac 1576b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()` 1577b665b14eSToby Isaac @*/ 1578b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof) 1579b665b14eSToby Isaac { 1580b665b14eSToby Isaac PetscFunctionBegin; 1581b665b14eSToby Isaac PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n); 1582*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1583*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1584*dff009beSToby Isaac 1585*dff009beSToby Isaac if (h) { 1586*dff009beSToby Isaac PetscEventPerfInfo *event_info; 1587*dff009beSToby Isaac 1588*dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info)); 1589*dff009beSToby Isaac if (event_info) event_info->dof[n] = dof; 1590*dff009beSToby Isaac } 1591b665b14eSToby Isaac } 1592b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1593b665b14eSToby Isaac } 1594b665b14eSToby Isaac 1595b665b14eSToby Isaac /*@C 1596b665b14eSToby Isaac PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event 1597b665b14eSToby Isaac 1598b665b14eSToby Isaac Not Collective 1599b665b14eSToby Isaac 1600b665b14eSToby Isaac Input Parameters: 1601b665b14eSToby Isaac + event - The event id to log 1602b665b14eSToby Isaac . n - The error index, in [0, 8) 1603b665b14eSToby Isaac - error - The error 1604b665b14eSToby Isaac 1605b665b14eSToby Isaac Options Database Key: 1606b665b14eSToby Isaac . -log_view - Activates log summary 1607b665b14eSToby Isaac 1608b665b14eSToby Isaac Level: developer 1609b665b14eSToby Isaac 1610b665b14eSToby Isaac Notes: 1611b665b14eSToby Isaac This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example, 1612b665b14eSToby Isaac as different norms, or as errors for different fields 1613b665b14eSToby Isaac 1614b665b14eSToby Isaac This is a low level routine used by the logging functions in PETSc 1615b665b14eSToby Isaac 1616b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()` 1617b665b14eSToby Isaac @*/ 1618b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error) 1619b665b14eSToby Isaac { 1620b665b14eSToby Isaac PetscFunctionBegin; 1621b665b14eSToby Isaac PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n); 1622*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1623*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1624*dff009beSToby Isaac 1625*dff009beSToby Isaac if (h) { 1626*dff009beSToby Isaac PetscEventPerfInfo *event_info; 1627*dff009beSToby Isaac 1628*dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info)); 1629*dff009beSToby Isaac if (event_info) event_info->errors[n] = error; 1630*dff009beSToby Isaac } 1631b665b14eSToby Isaac } 1632b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1633b665b14eSToby Isaac } 1634b665b14eSToby Isaac 1635b665b14eSToby Isaac /*@C 16365c6c1daeSBarry Smith PetscLogEventGetId - Returns the event id when given the event name. 16375c6c1daeSBarry Smith 16385c6c1daeSBarry Smith Not Collective 16395c6c1daeSBarry Smith 16405c6c1daeSBarry Smith Input Parameter: 16415c6c1daeSBarry Smith . name - The event name 16425c6c1daeSBarry Smith 16435c6c1daeSBarry Smith Output Parameter: 1644c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists 16455c6c1daeSBarry Smith 16465c6c1daeSBarry Smith Level: intermediate 16475c6c1daeSBarry Smith 1648d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()` 16495c6c1daeSBarry Smith @*/ 1650d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event) 1651d71ae5a4SJacob Faibussowitsch { 1652b665b14eSToby Isaac PetscLogState state; 16535c6c1daeSBarry Smith 16545c6c1daeSBarry Smith PetscFunctionBegin; 1655b665b14eSToby Isaac *event = -1; 1656b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1657b665b14eSToby Isaac if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event)); 16583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16595c6c1daeSBarry Smith } 16605c6c1daeSBarry Smith 166153e0a2f3SToby Isaac /*@C 166253e0a2f3SToby Isaac PetscLogEventGetName - Returns the event name when given the event id. 166353e0a2f3SToby Isaac 166453e0a2f3SToby Isaac Not Collective 166553e0a2f3SToby Isaac 166653e0a2f3SToby Isaac Input Parameter: 166753e0a2f3SToby Isaac . event - The event 166853e0a2f3SToby Isaac 166953e0a2f3SToby Isaac Output Parameter: 167053e0a2f3SToby Isaac . name - The event name 167153e0a2f3SToby Isaac 167253e0a2f3SToby Isaac Level: intermediate 167353e0a2f3SToby Isaac 167453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 167553e0a2f3SToby Isaac @*/ 167653e0a2f3SToby Isaac PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char **name) 167753e0a2f3SToby Isaac { 167853e0a2f3SToby Isaac PetscLogEventInfo event_info; 167953e0a2f3SToby Isaac PetscLogState state; 168053e0a2f3SToby Isaac 168153e0a2f3SToby Isaac PetscFunctionBegin; 1682b665b14eSToby Isaac *name = NULL; 168353e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 1684b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 168553e0a2f3SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 168653e0a2f3SToby Isaac *name = event_info.name; 168753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 168853e0a2f3SToby Isaac } 168953e0a2f3SToby Isaac 169053e0a2f3SToby Isaac /*@ 169153e0a2f3SToby Isaac PetscLogEventsPause - Put event logging into "paused" mode: timers and counters for in-progress events are paused, and any events that happen before logging is resumed with `PetscLogEventsResume()` are logged in the "Main Stage" of execution. 169253e0a2f3SToby Isaac 169353e0a2f3SToby Isaac Not collective 169453e0a2f3SToby Isaac 169553e0a2f3SToby Isaac Level: advanced 169653e0a2f3SToby Isaac 169753e0a2f3SToby Isaac Notes: 169853e0a2f3SToby Isaac When an external library or runtime has is initialized it can involve lots of setup time that skews the statistics of any unrelated running events: this function is intended to isolate such calls in the default log summary (`PetscLogDefaultBegin()`, `PetscLogView()`). 169953e0a2f3SToby Isaac 170053e0a2f3SToby Isaac Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function. 170153e0a2f3SToby Isaac 1702b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()` 170353e0a2f3SToby Isaac @*/ 170453e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void) 170553e0a2f3SToby Isaac { 170653e0a2f3SToby Isaac PetscFunctionBegin; 1707*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1708*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1709*dff009beSToby Isaac 1710*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventsPause(h)); 1711*dff009beSToby Isaac } 171253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 171353e0a2f3SToby Isaac } 171453e0a2f3SToby Isaac 171553e0a2f3SToby Isaac /*@ 171653e0a2f3SToby Isaac PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`. 171753e0a2f3SToby Isaac 171853e0a2f3SToby Isaac Not collective 171953e0a2f3SToby Isaac 172053e0a2f3SToby Isaac Level: advanced 172153e0a2f3SToby Isaac 1722b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()` 172353e0a2f3SToby Isaac @*/ 172453e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void) 172553e0a2f3SToby Isaac { 172653e0a2f3SToby Isaac PetscFunctionBegin; 1727*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1728*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1729*dff009beSToby Isaac 1730*dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventsResume(h)); 1731*dff009beSToby Isaac } 173253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 173353e0a2f3SToby Isaac } 173453e0a2f3SToby Isaac 17351c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/ 17361c1ad86eSToby Isaac 17371c1ad86eSToby Isaac /*MC 17381c1ad86eSToby Isaac PetscLogObjectCreate - Log the creation of a `PetscObject` 17391c1ad86eSToby Isaac 17401c1ad86eSToby Isaac Synopsis: 17411c1ad86eSToby Isaac #include <petsclog.h> 17421c1ad86eSToby Isaac PetscErrorCode PetscLogObjectCreate(PetscObject h) 17431c1ad86eSToby Isaac 17441c1ad86eSToby Isaac Not Collective 17451c1ad86eSToby Isaac 17461c1ad86eSToby Isaac Input Parameters: 17471c1ad86eSToby Isaac . h - A `PetscObject` 17481c1ad86eSToby Isaac 17491c1ad86eSToby Isaac Level: developer 17501c1ad86eSToby Isaac 17511c1ad86eSToby Isaac Developer Note: 17521c1ad86eSToby Isaac Called internally by PETSc when creating objects: users do not need to call this directly. 1753b665b14eSToby Isaac Notification of the object creation is sent to each `PetscLogHandler` that is running. 17541c1ad86eSToby Isaac 1755b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()` 17561c1ad86eSToby Isaac M*/ 17571c1ad86eSToby Isaac 17581c1ad86eSToby Isaac /*MC 17591c1ad86eSToby Isaac PetscLogObjectDestroy - Logs the destruction of a `PetscObject` 17601c1ad86eSToby Isaac 17611c1ad86eSToby Isaac Synopsis: 17621c1ad86eSToby Isaac #include <petsclog.h> 17631c1ad86eSToby Isaac PetscErrorCode PetscLogObjectDestroy(PetscObject h) 17641c1ad86eSToby Isaac 17651c1ad86eSToby Isaac Not Collective 17661c1ad86eSToby Isaac 17671c1ad86eSToby Isaac Input Parameters: 17681c1ad86eSToby Isaac . h - A `PetscObject` 17691c1ad86eSToby Isaac 17701c1ad86eSToby Isaac Level: developer 17711c1ad86eSToby Isaac 17721c1ad86eSToby Isaac Developer Note: 17731c1ad86eSToby Isaac Called internally by PETSc when destroying objects: users do not need to call this directly. 1774b665b14eSToby Isaac Notification of the object creation is sent to each `PetscLogHandler` that is running. 17751c1ad86eSToby Isaac 1776b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()` 17771c1ad86eSToby Isaac M*/ 17781c1ad86eSToby Isaac 177953e0a2f3SToby Isaac /*@C 178053e0a2f3SToby Isaac PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name. 178153e0a2f3SToby Isaac 178253e0a2f3SToby Isaac Not Collective 178353e0a2f3SToby Isaac 178453e0a2f3SToby Isaac Input Parameter: 178553e0a2f3SToby Isaac . name - The class name 178653e0a2f3SToby Isaac 178753e0a2f3SToby Isaac Output Parameter: 178853e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists 178953e0a2f3SToby Isaac 179053e0a2f3SToby Isaac Level: intermediate 179153e0a2f3SToby Isaac 179253e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()` 179353e0a2f3SToby Isaac @*/ 179453e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid) 179553e0a2f3SToby Isaac { 179653e0a2f3SToby Isaac PetscLogClass log_class; 179753e0a2f3SToby Isaac PetscLogClassInfo class_info; 179853e0a2f3SToby Isaac PetscLogState state; 179953e0a2f3SToby Isaac 180053e0a2f3SToby Isaac PetscFunctionBegin; 1801b665b14eSToby Isaac *classid = -1; 180253e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 1803b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 180453e0a2f3SToby Isaac PetscCall(PetscLogStateGetClassFromName(state, name, &log_class)); 180553e0a2f3SToby Isaac if (log_class < 0) { 180653e0a2f3SToby Isaac *classid = -1; 180753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 180853e0a2f3SToby Isaac } 180953e0a2f3SToby Isaac PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info)); 181053e0a2f3SToby Isaac *classid = class_info.classid; 181153e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 181253e0a2f3SToby Isaac } 181353e0a2f3SToby Isaac 181453e0a2f3SToby Isaac /*@C 181553e0a2f3SToby Isaac PetscLogClassIdGetName - Returns a `PetscClassId`'s name. 181653e0a2f3SToby Isaac 181753e0a2f3SToby Isaac Not Collective 181853e0a2f3SToby Isaac 181953e0a2f3SToby Isaac Input Parameter: 182053e0a2f3SToby Isaac . classid - A `PetscClassId` 182153e0a2f3SToby Isaac 182253e0a2f3SToby Isaac Output Parameter: 182353e0a2f3SToby Isaac . name - The class name 182453e0a2f3SToby Isaac 182553e0a2f3SToby Isaac Level: intermediate 182653e0a2f3SToby Isaac 182753e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()` 182853e0a2f3SToby Isaac @*/ 182953e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name) 183053e0a2f3SToby Isaac { 183153e0a2f3SToby Isaac PetscLogClass log_class; 183253e0a2f3SToby Isaac PetscLogClassInfo class_info; 183353e0a2f3SToby Isaac PetscLogState state; 183453e0a2f3SToby Isaac 183553e0a2f3SToby Isaac PetscFunctionBegin; 183653e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 183753e0a2f3SToby Isaac PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class)); 183853e0a2f3SToby Isaac PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info)); 183953e0a2f3SToby Isaac *name = class_info.name; 184053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 184153e0a2f3SToby Isaac } 184253e0a2f3SToby Isaac 18435c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/ 18445c6c1daeSBarry Smith /*@C 18455c6c1daeSBarry Smith PetscLogDump - Dumps logs of objects to a file. This file is intended to 18465c6c1daeSBarry Smith be read by bin/petscview. This program no longer exists. 18475c6c1daeSBarry Smith 1848811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 18495c6c1daeSBarry Smith 18505c6c1daeSBarry Smith Input Parameter: 1851aec76313SJacob Faibussowitsch . sname - an optional file name 18525c6c1daeSBarry Smith 185310450e9eSJacob Faibussowitsch Example Usage: 18545c6c1daeSBarry Smith .vb 18555c6c1daeSBarry Smith PetscInitialize(...); 1856b665b14eSToby Isaac PetscLogDefaultBegin(); 1857b665b14eSToby Isaac // ... code ... 18585c6c1daeSBarry Smith PetscLogDump(filename); 18595c6c1daeSBarry Smith PetscFinalize(); 18605c6c1daeSBarry Smith .ve 18615c6c1daeSBarry Smith 1862d1f92df0SBarry Smith Level: advanced 1863d1f92df0SBarry Smith 1864811af0c4SBarry Smith Note: 186537fdd005SBarry Smith The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified, 18665c6c1daeSBarry Smith this file will be used. 18675c6c1daeSBarry Smith 1868b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 18695c6c1daeSBarry Smith @*/ 1870d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[]) 1871d71ae5a4SJacob Faibussowitsch { 1872b665b14eSToby Isaac PetscLogHandler handler; 18735c6c1daeSBarry Smith 18745c6c1daeSBarry Smith PetscFunctionBegin; 1875294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 1876*dff009beSToby Isaac PetscCall(PetscLogHandlerDump(handler, sname)); 1877b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 18785c6c1daeSBarry Smith } 1879b665b14eSToby Isaac 1880b665b14eSToby Isaac /*@C 1881b665b14eSToby Isaac PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot. 1882b665b14eSToby Isaac 1883b665b14eSToby Isaac Collective over `PETSC_COMM_WORLD` 1884b665b14eSToby Isaac 1885b665b14eSToby Isaac Input Parameter: 1886b665b14eSToby Isaac . sname - filename for the MPE logfile 1887b665b14eSToby Isaac 1888b665b14eSToby Isaac Level: advanced 1889b665b14eSToby Isaac 1890b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()` 1891b665b14eSToby Isaac @*/ 1892b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[]) 1893b665b14eSToby Isaac { 1894b665b14eSToby Isaac PetscFunctionBegin; 1895b665b14eSToby Isaac #if defined(PETSC_HAVE_MPE) 1896b665b14eSToby Isaac if (PetscBeganMPE) { 1897b665b14eSToby Isaac char name[PETSC_MAX_PATH_LEN]; 1898b665b14eSToby Isaac 1899b665b14eSToby Isaac PetscCall(PetscInfo(0, "Finalizing MPE.\n")); 1900b665b14eSToby Isaac if (sname) { 1901b665b14eSToby Isaac PetscCall(PetscStrncpy(name, sname, sizeof(name))); 19025c6c1daeSBarry Smith } else { 1903b665b14eSToby Isaac PetscCall(PetscGetProgramName(name, sizeof(name))); 19045c6c1daeSBarry Smith } 1905b665b14eSToby Isaac PetscCall(MPE_Finish_log(name)); 19065c6c1daeSBarry Smith } else { 1907b665b14eSToby Isaac PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n")); 19085c6c1daeSBarry Smith } 1909c2a741eeSJunchao Zhang #else 1910b665b14eSToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe"); 1911c2a741eeSJunchao Zhang #endif 19123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19135c6c1daeSBarry Smith } 19145c6c1daeSBarry Smith 19157d6c928cSSatish Balay /*@C 19167d6c928cSSatish Balay PetscLogView - Prints a summary of the logging. 19175c6c1daeSBarry Smith 19185c6c1daeSBarry Smith Collective over MPI_Comm 19195c6c1daeSBarry Smith 19205c6c1daeSBarry Smith Input Parameter: 1921f14045dbSBarry Smith . viewer - an ASCII viewer 19225c6c1daeSBarry Smith 19235c6c1daeSBarry Smith Options Database Keys: 1924bb1d7374SBarry Smith + -log_view [:filename] - Prints summary of log information 1925bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file 1926607d249eSBarry Smith . -log_view :filename.xml:ascii_xml - Saves a summary of the logging information in a nested format (see below for how to view it) 1927d0a29bd7SConnor Ward . -log_view :filename.txt:ascii_flamegraph - Saves logging information in a format suitable for visualising as a Flame Graph (see below for how to view it) 1928156b51fbSBarry Smith . -log_view_memory - Also display memory usage in each event 1929156b51fbSBarry Smith . -log_view_gpu_time - Also display time in each event for GPU kernels (Note this may slow the computation) 1930811af0c4SBarry Smith . -log_all - Saves a file Log.rank for each MPI rank with details of each step of the computation 1931bb1d7374SBarry Smith - -log_trace [filename] - Displays a trace of what each process is doing 19325c6c1daeSBarry Smith 1933d1f92df0SBarry Smith Level: beginner 1934d1f92df0SBarry Smith 19355c6c1daeSBarry Smith Notes: 1936da81f932SPierre Jolivet It is possible to control the logging programmatically but we recommend using the options database approach whenever possible 19375c6c1daeSBarry Smith By default the summary is printed to stdout. 19385c6c1daeSBarry Smith 1939bb1d7374SBarry Smith Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin() 1940bb1d7374SBarry Smith 1941bb1d7374SBarry Smith If PETSc is configured with --with-logging=0 then this functionality is not available 1942bb1d7374SBarry Smith 1943607d249eSBarry Smith To view the nested XML format filename.xml first copy ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current 1944607d249eSBarry Smith directory then open filename.xml with your browser. Specific notes for certain browsers 1945607d249eSBarry Smith $ Firefox and Internet explorer - simply open the file 1946607d249eSBarry Smith $ Google Chrome - you must start up Chrome with the option --allow-file-access-from-files 1947a8d69d7bSBarry Smith $ Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access 1948607d249eSBarry Smith or one can use the package http://xmlsoft.org/XSLT/xsltproc2.html to translate the xml file to html and then open it with 1949607d249eSBarry Smith your browser. 19502add09c0SLisandro Dalcin Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser 19512add09c0SLisandro Dalcin window and render the XML log file contents. 1952607d249eSBarry Smith 1953bb1d7374SBarry Smith The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij MARITIME RESEARCH INSTITUTE NETHERLANDS 1954bb1d7374SBarry Smith 1955d0a29bd7SConnor Ward The Flame Graph output can be visualised using either the original Flame Graph script (https://github.com/brendangregg/FlameGraph) 1956d0a29bd7SConnor Ward or using speedscope (https://www.speedscope.app). 1957d0a29bd7SConnor Ward Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py. 1958d0a29bd7SConnor Ward 1959d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()` 19605c6c1daeSBarry Smith @*/ 1961d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer) 1962d71ae5a4SJacob Faibussowitsch { 1963f14045dbSBarry Smith PetscBool isascii; 1964f14045dbSBarry Smith PetscViewerFormat format; 1965b665b14eSToby Isaac int stage; 1966b665b14eSToby Isaac PetscLogState state; 1967b665b14eSToby Isaac PetscIntStack temp_stack; 1968b665b14eSToby Isaac PetscLogHandler handler; 1969b665b14eSToby Isaac PetscBool is_empty; 19705c6c1daeSBarry Smith 19715c6c1daeSBarry Smith PetscFunctionBegin; 1972b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 197337b78d16SBarry Smith /* Pop off any stages the user forgot to remove */ 1974b665b14eSToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 1975b665b14eSToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 197637b78d16SBarry Smith while (stage >= 0) { 1977b665b14eSToby Isaac PetscCall(PetscLogStagePop()); 1978b665b14eSToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 1979b665b14eSToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 198037b78d16SBarry Smith } 19819566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 198228b400f6SJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII"); 19839566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(viewer, &format)); 1984b665b14eSToby Isaac if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 1985294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler)); 1986b665b14eSToby Isaac PetscCall(PetscLogHandlerView(handler, viewer)); 1987b665b14eSToby Isaac } else { 1988294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 1989b665b14eSToby Isaac PetscCall(PetscLogHandlerView(handler, viewer)); 19905c6c1daeSBarry Smith } 1991b665b14eSToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &is_empty)); 1992b665b14eSToby Isaac while (!is_empty) { 1993b665b14eSToby Isaac PetscCall(PetscIntStackPop(temp_stack, &stage)); 1994b665b14eSToby Isaac PetscCall(PetscLogStagePush(stage)); 1995b665b14eSToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &is_empty)); 1996b665b14eSToby Isaac } 1997b665b14eSToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 19983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19995c6c1daeSBarry Smith } 20005c6c1daeSBarry Smith 2001f14045dbSBarry Smith /*@C 2002811af0c4SBarry Smith PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed. 2003f14045dbSBarry Smith 2004811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 2005f14045dbSBarry Smith 2006811af0c4SBarry Smith Level: developer 2007f14045dbSBarry Smith 2008d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()` 2009f14045dbSBarry Smith @*/ 2010d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void) 2011d71ae5a4SJacob Faibussowitsch { 2012ad2e3d55SToby Isaac PetscInt n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX; 2013ad2e3d55SToby Isaac PetscViewer viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX]; 2014ad2e3d55SToby Isaac PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX]; 2015f14045dbSBarry Smith PetscBool flg; 2016f14045dbSBarry Smith 2017f14045dbSBarry Smith PetscFunctionBegin; 2018ad2e3d55SToby Isaac PetscCall(PetscOptionsGetViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg)); 2019ad2e3d55SToby Isaac for (PetscInt i = 0; i < n_max; i++) { 2020ad2e3d55SToby Isaac PetscCall(PetscViewerPushFormat(viewers[i], formats[i])); 2021ad2e3d55SToby Isaac PetscCall(PetscLogView(viewers[i])); 2022ad2e3d55SToby Isaac PetscCall(PetscViewerPopFormat(viewers[i])); 2023ad2e3d55SToby Isaac PetscCall(PetscViewerDestroy(&(viewers[i]))); 2024f14045dbSBarry Smith } 20253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2026f14045dbSBarry Smith } 2027f14045dbSBarry Smith 2028b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *); 2029b665b14eSToby Isaac 2030b665b14eSToby Isaac /*@ 2031b665b14eSToby Isaac PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event 2032b665b14eSToby Isaac that takes 1 or more percent of the time. 2033b665b14eSToby Isaac 2034b665b14eSToby Isaac Logically Collective over `PETSC_COMM_WORLD` 2035b665b14eSToby Isaac 2036b665b14eSToby Isaac Input Parameter: 2037b665b14eSToby Isaac . newThresh - the threshold to use 2038b665b14eSToby Isaac 2039b665b14eSToby Isaac Output Parameter: 2040b665b14eSToby Isaac . oldThresh - the previously set threshold value 2041b665b14eSToby Isaac 2042b665b14eSToby Isaac Options Database Keys: 2043b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file 2044b665b14eSToby Isaac 2045b665b14eSToby Isaac Example Usage: 2046b665b14eSToby Isaac .vb 2047b665b14eSToby Isaac PetscInitialize(...); 2048b665b14eSToby Isaac PetscLogNestedBegin(); 2049b665b14eSToby Isaac PetscLogSetThreshold(0.1,&oldthresh); 2050b665b14eSToby Isaac // ... code ... 2051b665b14eSToby Isaac PetscLogView(viewer); 2052b665b14eSToby Isaac PetscFinalize(); 2053b665b14eSToby Isaac .ve 2054b665b14eSToby Isaac 2055b665b14eSToby Isaac Level: advanced 2056b665b14eSToby Isaac 2057b665b14eSToby Isaac Note: 2058b665b14eSToby Isaac This threshold is only used by the nested log handler 2059b665b14eSToby Isaac 2060b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`, 2061b665b14eSToby Isaac `PetscLogNestedBegin()` 2062b665b14eSToby Isaac @*/ 2063b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh) 2064b665b14eSToby Isaac { 2065b665b14eSToby Isaac PetscLogHandler handler; 2066b665b14eSToby Isaac 2067b665b14eSToby Isaac PetscFunctionBegin; 2068294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler)); 2069b665b14eSToby Isaac PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh)); 2070b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2071b665b14eSToby Isaac } 2072b665b14eSToby Isaac 20735c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/ 20745c6c1daeSBarry Smith /*@C 20755c6c1daeSBarry Smith PetscGetFlops - Returns the number of flops used on this processor 20765c6c1daeSBarry Smith since the program began. 20775c6c1daeSBarry Smith 20785c6c1daeSBarry Smith Not Collective 20795c6c1daeSBarry Smith 20805c6c1daeSBarry Smith Output Parameter: 208110450e9eSJacob Faibussowitsch . flops - number of floating point operations 20825c6c1daeSBarry Smith 2083d1f92df0SBarry Smith Level: intermediate 2084d1f92df0SBarry Smith 20855c6c1daeSBarry Smith Notes: 20865c6c1daeSBarry Smith A global counter logs all PETSc flop counts. The user can use 2087811af0c4SBarry Smith `PetscLogFlops()` to increment this counter to include flops for the 20885c6c1daeSBarry Smith application code. 20895c6c1daeSBarry Smith 2090811af0c4SBarry Smith A separate counter `PetscLogGPUFlops()` logs the flops that occur on any GPU associated with this MPI rank 2091811af0c4SBarry Smith 2092d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogGPUFlops()`, `PetscTime()`, `PetscLogFlops()` 20935c6c1daeSBarry Smith @*/ 2094d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops) 2095d71ae5a4SJacob Faibussowitsch { 20965c6c1daeSBarry Smith PetscFunctionBegin; 20975c6c1daeSBarry Smith *flops = petsc_TotalFlops; 20983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20995c6c1daeSBarry Smith } 21005c6c1daeSBarry Smith 21011c1ad86eSToby Isaac /*@C 21021c1ad86eSToby Isaac PetscLogObjectState - Record information about an object with the default log handler 21031c1ad86eSToby Isaac 21041c1ad86eSToby Isaac Not Collective 21051c1ad86eSToby Isaac 21061c1ad86eSToby Isaac Input Parameters: 21071c1ad86eSToby Isaac + obj - the `PetscObject` 21081c1ad86eSToby Isaac . format - a printf-style format string 21091c1ad86eSToby Isaac - ... - printf arguments to format 21101c1ad86eSToby Isaac 21111c1ad86eSToby Isaac Level: developer 21121c1ad86eSToby Isaac 2113b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()` 21141c1ad86eSToby Isaac @*/ 2115d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 2116d71ae5a4SJacob Faibussowitsch { 21175c6c1daeSBarry Smith PetscFunctionBegin; 2118*dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 2119*dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 2120*dff009beSToby Isaac 2121*dff009beSToby Isaac if (h) { 2122*dff009beSToby Isaac va_list Argp; 21235c6c1daeSBarry Smith va_start(Argp, format); 2124*dff009beSToby Isaac PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp)); 21255c6c1daeSBarry Smith va_end(Argp); 2126b665b14eSToby Isaac } 2127*dff009beSToby Isaac } 21283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21295c6c1daeSBarry Smith } 21305c6c1daeSBarry Smith 21315c6c1daeSBarry Smith /*MC 21325c6c1daeSBarry Smith PetscLogFlops - Adds floating point operations to the global counter. 21335c6c1daeSBarry Smith 21345c6c1daeSBarry Smith Synopsis: 2135aaa7dc30SBarry Smith #include <petsclog.h> 21365c6c1daeSBarry Smith PetscErrorCode PetscLogFlops(PetscLogDouble f) 21375c6c1daeSBarry Smith 21385c6c1daeSBarry Smith Not Collective 21395c6c1daeSBarry Smith 21405c6c1daeSBarry Smith Input Parameter: 21415c6c1daeSBarry Smith . f - flop counter 21425c6c1daeSBarry Smith 214310450e9eSJacob Faibussowitsch Example Usage: 21445c6c1daeSBarry Smith .vb 21455c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 214610450e9eSJacob Faibussowitsch 21475c6c1daeSBarry Smith PetscLogEventRegister("User event", 0, &USER_EVENT); 21485c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 21495c6c1daeSBarry Smith [code segment to monitor] 21505c6c1daeSBarry Smith PetscLogFlops(user_flops) 21515c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 21525c6c1daeSBarry Smith .ve 21535c6c1daeSBarry Smith 2154d1f92df0SBarry Smith Level: intermediate 2155d1f92df0SBarry Smith 2156811af0c4SBarry Smith Note: 215710450e9eSJacob Faibussowitsch A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment 215810450e9eSJacob Faibussowitsch this counter to include flops for the application code. 21595c6c1daeSBarry Smith 2160d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogGPUFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()` 21615c6c1daeSBarry Smith M*/ 21625c6c1daeSBarry Smith 21635c6c1daeSBarry Smith /*MC 216410450e9eSJacob Faibussowitsch PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate 216510450e9eSJacob Faibussowitsch timings 21665c6c1daeSBarry Smith 21675c6c1daeSBarry Smith Synopsis: 2168aaa7dc30SBarry Smith #include <petsclog.h> 21695c6c1daeSBarry Smith void PetscPreLoadBegin(PetscBool flag, char *name); 21705c6c1daeSBarry Smith 21715c6c1daeSBarry Smith Not Collective 21725c6c1daeSBarry Smith 2173d8d19677SJose E. Roman Input Parameters: 217410450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command 217510450e9eSJacob Faibussowitsch line option `-preload true|false` 217610450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded 21775c6c1daeSBarry Smith 217810450e9eSJacob Faibussowitsch Example Usage: 21795c6c1daeSBarry Smith .vb 218010450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE, "first stage"); 218110450e9eSJacob Faibussowitsch // lines of code 21825c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 218310450e9eSJacob Faibussowitsch // lines of code 21845c6c1daeSBarry Smith PetscPreLoadEnd(); 21855c6c1daeSBarry Smith .ve 21865c6c1daeSBarry Smith 2187d1f92df0SBarry Smith Level: intermediate 2188d1f92df0SBarry Smith 2189811af0c4SBarry Smith Note: 219095452b02SPatrick Sanan Only works in C/C++, not Fortran 21915c6c1daeSBarry Smith 219210450e9eSJacob Faibussowitsch Flags available within the macro\: 219310450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading 219410450e9eSJacob Faibussowitsch . PetscPreLoadingOn - `PETSC_TRUE` if it is CURRENTLY doing preload 219510450e9eSJacob Faibussowitsch . PetscPreLoadIt - `0` for the first computation (with preloading turned off it is only 219610450e9eSJacob Faibussowitsch `0`) `1` for the second 219710450e9eSJacob Faibussowitsch - PetscPreLoadMax - number of times it will do the computation, only one when preloading is 219810450e9eSJacob Faibussowitsch turned on 219910450e9eSJacob Faibussowitsch 220010450e9eSJacob Faibussowitsch The first two variables are available throughout the program, the second two only between the 220110450e9eSJacob Faibussowitsch `PetscPreLoadBegin()` and `PetscPreLoadEnd()` 22025c6c1daeSBarry Smith 2203d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 22045c6c1daeSBarry Smith M*/ 22055c6c1daeSBarry Smith 22065c6c1daeSBarry Smith /*MC 220710450e9eSJacob Faibussowitsch PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate 220810450e9eSJacob Faibussowitsch timings 22095c6c1daeSBarry Smith 22105c6c1daeSBarry Smith Synopsis: 2211aaa7dc30SBarry Smith #include <petsclog.h> 22125c6c1daeSBarry Smith void PetscPreLoadEnd(void); 22135c6c1daeSBarry Smith 22145c6c1daeSBarry Smith Not Collective 22155c6c1daeSBarry Smith 221610450e9eSJacob Faibussowitsch Example Usage: 22175c6c1daeSBarry Smith .vb 221810450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE, "first stage"); 221910450e9eSJacob Faibussowitsch // lines of code 22205c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 222110450e9eSJacob Faibussowitsch // lines of code 22225c6c1daeSBarry Smith PetscPreLoadEnd(); 22235c6c1daeSBarry Smith .ve 22245c6c1daeSBarry Smith 2225d1f92df0SBarry Smith Level: intermediate 2226d1f92df0SBarry Smith 2227811af0c4SBarry Smith Note: 2228811af0c4SBarry Smith Only works in C/C++ not fortran 22295c6c1daeSBarry Smith 2230d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()` 22315c6c1daeSBarry Smith M*/ 22325c6c1daeSBarry Smith 22335c6c1daeSBarry Smith /*MC 223410450e9eSJacob Faibussowitsch PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings 22355c6c1daeSBarry Smith 22365c6c1daeSBarry Smith Synopsis: 2237aaa7dc30SBarry Smith #include <petsclog.h> 22385c6c1daeSBarry Smith void PetscPreLoadStage(char *name); 22395c6c1daeSBarry Smith 22405c6c1daeSBarry Smith Not Collective 22415c6c1daeSBarry Smith 224210450e9eSJacob Faibussowitsch Example Usage: 22435c6c1daeSBarry Smith .vb 224410450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE,"first stage"); 224510450e9eSJacob Faibussowitsch // lines of code 22465c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 224710450e9eSJacob Faibussowitsch // lines of code 22485c6c1daeSBarry Smith PetscPreLoadEnd(); 22495c6c1daeSBarry Smith .ve 22505c6c1daeSBarry Smith 2251d1f92df0SBarry Smith Level: intermediate 2252d1f92df0SBarry Smith 2253811af0c4SBarry Smith Note: 2254811af0c4SBarry Smith Only works in C/C++ not fortran 22555c6c1daeSBarry Smith 2256d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()` 22575c6c1daeSBarry Smith M*/ 22585c6c1daeSBarry Smith 2259a4af0ceeSJacob Faibussowitsch #if PetscDefined(HAVE_DEVICE) 2260a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 22619ffd0706SHong Zhang 2262156b51fbSBarry Smith /* 2263156b51fbSBarry Smith This cannot be called by users between PetscInitialize() and PetscFinalize() at any random location in the code 2264156b51fbSBarry Smith because it will result in timing results that cannot be interpreted. 2265156b51fbSBarry Smith */ 2266d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscLogGpuTime_Off(void) 2267d71ae5a4SJacob Faibussowitsch { 2268156b51fbSBarry Smith PetscLogGpuTimeFlag = PETSC_FALSE; 22693ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 2270156b51fbSBarry Smith } 2271156b51fbSBarry Smith 2272156b51fbSBarry Smith /*@C 2273156b51fbSBarry Smith PetscLogGpuTime - turn on the logging of GPU time for GPU kernels 2274156b51fbSBarry Smith 2275811af0c4SBarry Smith Options Database Key: 227610450e9eSJacob Faibussowitsch . -log_view_gpu_time - provide the GPU times in the `-log_view` output 2277156b51fbSBarry Smith 2278d1f92df0SBarry Smith Level: advanced 2279d1f92df0SBarry Smith 2280156b51fbSBarry Smith Notes: 228110450e9eSJacob Faibussowitsch Turning on the timing of the GPU kernels can slow down the entire computation and should only 228210450e9eSJacob Faibussowitsch be used when studying the performance of operations on GPU such as vector operations and 228310450e9eSJacob Faibussowitsch matrix-vector operations. 2284156b51fbSBarry Smith 228510450e9eSJacob Faibussowitsch This routine should only be called once near the beginning of the program. Once it is started 228610450e9eSJacob Faibussowitsch it cannot be turned off. 2287156b51fbSBarry Smith 2288d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()` 2289156b51fbSBarry Smith @*/ 2290d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void) 2291d71ae5a4SJacob Faibussowitsch { 2292156b51fbSBarry Smith if (!PetscLogGpuTimeFlag) PetscCall(PetscRegisterFinalize(PetscLogGpuTime_Off)); 2293156b51fbSBarry Smith PetscLogGpuTimeFlag = PETSC_TRUE; 22943ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 2295156b51fbSBarry Smith } 2296156b51fbSBarry Smith 22979ffd0706SHong Zhang /*@C 22989ffd0706SHong Zhang PetscLogGpuTimeBegin - Start timer for device 22999ffd0706SHong Zhang 2300d1f92df0SBarry Smith Level: intermediate 2301d1f92df0SBarry Smith 23029ffd0706SHong Zhang Notes: 230310450e9eSJacob Faibussowitsch When CUDA or HIP is enabled, the timer is run on the GPU, it is a separate logging of time 230410450e9eSJacob Faibussowitsch devoted to GPU computations (excluding kernel launch times). 2305811af0c4SBarry Smith 230610450e9eSJacob Faibussowitsch When CUDA or HIP is not available, the timer is run on the CPU, it is a separate logging of 230710450e9eSJacob Faibussowitsch time devoted to GPU computations (including kernel launch times). 2308811af0c4SBarry Smith 230910450e9eSJacob Faibussowitsch There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and 231010450e9eSJacob Faibussowitsch `PetscLogGpuTimeEnd()` 2311811af0c4SBarry Smith 231210450e9eSJacob Faibussowitsch This timer should NOT include times for data transfers between the GPU and CPU, nor setup 231310450e9eSJacob Faibussowitsch actions such as allocating space. 2314811af0c4SBarry Smith 231510450e9eSJacob Faibussowitsch The regular logging captures the time for data transfers and any CPU activities during the 231610450e9eSJacob Faibussowitsch event. It is used to compute the flop rate on the GPU as it is actively engaged in running a 231710450e9eSJacob Faibussowitsch kernel. 23189ffd0706SHong Zhang 23199ffd0706SHong Zhang Developer Notes: 232010450e9eSJacob Faibussowitsch The GPU event timer captures the execution time of all the kernels launched in the default 232110450e9eSJacob Faibussowitsch stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`. 2322811af0c4SBarry Smith 232310450e9eSJacob Faibussowitsch `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the 232410450e9eSJacob Faibussowitsch default stream (stream 0). The device will record a time stamp for the event when it reaches 232510450e9eSJacob Faibussowitsch that event in the stream. The function xxxEventSynchronize() is called in 232610450e9eSJacob Faibussowitsch `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the 232710450e9eSJacob Faibussowitsch timer event is recorded. 23289ffd0706SHong Zhang 2329d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()` 23309ffd0706SHong Zhang @*/ 2331d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void) 2332d71ae5a4SJacob Faibussowitsch { 2333b665b14eSToby Isaac PetscBool isActive; 2334b665b14eSToby Isaac 23359ffd0706SHong Zhang PetscFunctionBegin; 2336b665b14eSToby Isaac PetscCall(PetscLogEventBeginIsActive(&isActive)); 2337b665b14eSToby Isaac if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS); 2338744d70b0SJunchao Zhang if (PetscDefined(HAVE_DEVICE)) { 2339a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 2340a4af0ceeSJacob Faibussowitsch 23419566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 23429566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextBeginTimer_Internal(dctx)); 2343a4af0ceeSJacob Faibussowitsch } else { 23449566063dSJacob Faibussowitsch PetscCall(PetscTimeSubtract(&petsc_gtime)); 2345a4af0ceeSJacob Faibussowitsch } 23463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23479ffd0706SHong Zhang } 23489ffd0706SHong Zhang 23499ffd0706SHong Zhang /*@C 23509ffd0706SHong Zhang PetscLogGpuTimeEnd - Stop timer for device 23519ffd0706SHong Zhang 23529ffd0706SHong Zhang Level: intermediate 23539ffd0706SHong Zhang 2354d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()` 23559ffd0706SHong Zhang @*/ 2356d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void) 2357d71ae5a4SJacob Faibussowitsch { 2358b665b14eSToby Isaac PetscBool isActive; 2359b665b14eSToby Isaac 23609ffd0706SHong Zhang PetscFunctionBegin; 2361b665b14eSToby Isaac PetscCall(PetscLogEventEndIsActive(&isActive)); 2362b665b14eSToby Isaac if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS); 2363744d70b0SJunchao Zhang if (PetscDefined(HAVE_DEVICE)) { 2364a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 2365a4af0ceeSJacob Faibussowitsch PetscLogDouble elapsed; 2366a4af0ceeSJacob Faibussowitsch 23679566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 23689566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed)); 2369a4af0ceeSJacob Faibussowitsch petsc_gtime += (elapsed / 1000.0); 2370a4af0ceeSJacob Faibussowitsch } else { 23719566063dSJacob Faibussowitsch PetscCall(PetscTimeAdd(&petsc_gtime)); 2372a4af0ceeSJacob Faibussowitsch } 23733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23749ffd0706SHong Zhang } 2375c708d6e3SStefano Zampini 23769ffd0706SHong Zhang #endif /* end of PETSC_HAVE_DEVICE */ 23779ffd0706SHong Zhang 2378cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/ 2379cb9ef012SToby Isaac 2380b665b14eSToby Isaac /* -- Utility functions for logging from fortran -- */ 2381b665b14eSToby Isaac 2382b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype) 2383b665b14eSToby Isaac { 2384b665b14eSToby Isaac PetscFunctionBegin; 2385cb9ef012SToby Isaac #if PetscDefined(USE_LOG) 2386b665b14eSToby Isaac PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1)); 2387b665b14eSToby Isaac #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 2388b665b14eSToby Isaac PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th)); 2389b665b14eSToby Isaac #endif 2390cb9ef012SToby Isaac #endif 2391b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2392b665b14eSToby Isaac } 2393b665b14eSToby Isaac 2394b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype) 2395b665b14eSToby Isaac { 2396b665b14eSToby Isaac PetscFunctionBegin; 2397cb9ef012SToby Isaac #if PetscDefined(USE_LOG) 2398b665b14eSToby Isaac PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1)); 2399b665b14eSToby Isaac #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 2400b665b14eSToby Isaac PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th)); 2401b665b14eSToby Isaac #endif 2402cb9ef012SToby Isaac #endif 2403b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2404b665b14eSToby Isaac } 2405b665b14eSToby Isaac 2406b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void) 2407b665b14eSToby Isaac { 2408b665b14eSToby Isaac PetscFunctionBegin; 2409cb9ef012SToby Isaac if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1)); 2410b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2411b665b14eSToby Isaac } 2412b665b14eSToby Isaac 24135c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 24145c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID = 0; 24155c6c1daeSBarry Smith 24162611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE; 24172611ad71SToby Isaac 24182611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void) 24192611ad71SToby Isaac { 24202611ad71SToby Isaac int stage; 24212611ad71SToby Isaac 24222611ad71SToby Isaac PetscFunctionBegin; 24232611ad71SToby Isaac if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS); 24242611ad71SToby Isaac PetscLogInitializeCalled = PETSC_TRUE; 24252611ad71SToby Isaac if (PetscDefined(USE_LOG)) { 24262611ad71SToby Isaac /* Setup default logging structures */ 24272611ad71SToby Isaac PetscCall(PetscLogStateCreate(&petsc_log_state)); 24282611ad71SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 24292611ad71SToby Isaac if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state)); 24302611ad71SToby Isaac } 24312611ad71SToby Isaac PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage)); 24322611ad71SToby Isaac PetscCall(PetscSpinlockCreate(&PetscLogSpinLock)); 24332611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY) 24342611ad71SToby Isaac petsc_log_tid = 0; 24352611ad71SToby Isaac petsc_log_gid = 0; 24362611ad71SToby Isaac #endif 24372611ad71SToby Isaac 24382611ad71SToby Isaac /* All processors sync here for more consistent logging */ 24392611ad71SToby Isaac PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 24402611ad71SToby Isaac PetscCall(PetscTime(&petsc_BaseTime)); 24412611ad71SToby Isaac PetscCall(PetscLogStagePush(stage)); 24422611ad71SToby Isaac } 24432611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 24442611ad71SToby Isaac } 24452611ad71SToby Isaac 24462611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void) 24472611ad71SToby Isaac { 24482611ad71SToby Isaac PetscFunctionBegin; 24492611ad71SToby Isaac if (PetscDefined(USE_LOG)) { 2450b665b14eSToby Isaac /* Resetting phase */ 2451b665b14eSToby Isaac // pop remaining stages 2452b665b14eSToby Isaac if (petsc_log_state) { 2453b665b14eSToby Isaac while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); } 2454b665b14eSToby Isaac } 24552611ad71SToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler)); 24562611ad71SToby Isaac PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX)); 24572611ad71SToby Isaac PetscCall(PetscLogStateDestroy(&petsc_log_state)); 24582611ad71SToby Isaac 24592611ad71SToby Isaac petsc_TotalFlops = 0.0; 24602611ad71SToby Isaac petsc_BaseTime = 0.0; 24612611ad71SToby Isaac petsc_TotalFlops = 0.0; 24622611ad71SToby Isaac petsc_send_ct = 0.0; 24632611ad71SToby Isaac petsc_recv_ct = 0.0; 24642611ad71SToby Isaac petsc_send_len = 0.0; 24652611ad71SToby Isaac petsc_recv_len = 0.0; 24662611ad71SToby Isaac petsc_isend_ct = 0.0; 24672611ad71SToby Isaac petsc_irecv_ct = 0.0; 24682611ad71SToby Isaac petsc_isend_len = 0.0; 24692611ad71SToby Isaac petsc_irecv_len = 0.0; 24702611ad71SToby Isaac petsc_wait_ct = 0.0; 24712611ad71SToby Isaac petsc_wait_any_ct = 0.0; 24722611ad71SToby Isaac petsc_wait_all_ct = 0.0; 24732611ad71SToby Isaac petsc_sum_of_waits_ct = 0.0; 24742611ad71SToby Isaac petsc_allreduce_ct = 0.0; 24752611ad71SToby Isaac petsc_gather_ct = 0.0; 24762611ad71SToby Isaac petsc_scatter_ct = 0.0; 24772611ad71SToby Isaac petsc_TotalFlops_th = 0.0; 24782611ad71SToby Isaac petsc_send_ct_th = 0.0; 24792611ad71SToby Isaac petsc_recv_ct_th = 0.0; 24802611ad71SToby Isaac petsc_send_len_th = 0.0; 24812611ad71SToby Isaac petsc_recv_len_th = 0.0; 24822611ad71SToby Isaac petsc_isend_ct_th = 0.0; 24832611ad71SToby Isaac petsc_irecv_ct_th = 0.0; 24842611ad71SToby Isaac petsc_isend_len_th = 0.0; 24852611ad71SToby Isaac petsc_irecv_len_th = 0.0; 24862611ad71SToby Isaac petsc_wait_ct_th = 0.0; 24872611ad71SToby Isaac petsc_wait_any_ct_th = 0.0; 24882611ad71SToby Isaac petsc_wait_all_ct_th = 0.0; 24892611ad71SToby Isaac petsc_sum_of_waits_ct_th = 0.0; 24902611ad71SToby Isaac petsc_allreduce_ct_th = 0.0; 24912611ad71SToby Isaac petsc_gather_ct_th = 0.0; 24922611ad71SToby Isaac petsc_scatter_ct_th = 0.0; 24932611ad71SToby Isaac 24942611ad71SToby Isaac petsc_ctog_ct = 0.0; 24952611ad71SToby Isaac petsc_gtoc_ct = 0.0; 24962611ad71SToby Isaac petsc_ctog_sz = 0.0; 24972611ad71SToby Isaac petsc_gtoc_sz = 0.0; 24982611ad71SToby Isaac petsc_gflops = 0.0; 24992611ad71SToby Isaac petsc_gtime = 0.0; 25002611ad71SToby Isaac petsc_ctog_ct_th = 0.0; 25012611ad71SToby Isaac petsc_gtoc_ct_th = 0.0; 25022611ad71SToby Isaac petsc_ctog_sz_th = 0.0; 25032611ad71SToby Isaac petsc_gtoc_sz_th = 0.0; 25042611ad71SToby Isaac petsc_gflops_th = 0.0; 25052611ad71SToby Isaac petsc_gtime_th = 0.0; 25062611ad71SToby Isaac } 25072611ad71SToby Isaac PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 25082611ad71SToby Isaac PETSC_OBJECT_CLASSID = 0; 25092611ad71SToby Isaac PetscLogInitializeCalled = PETSC_FALSE; 25102611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 25112611ad71SToby Isaac } 25122611ad71SToby Isaac 25135c6c1daeSBarry Smith /*@C 25145c6c1daeSBarry Smith PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code. 25155c6c1daeSBarry Smith 25165c6c1daeSBarry Smith Not Collective 25175c6c1daeSBarry Smith 25185c6c1daeSBarry Smith Input Parameter: 25195c6c1daeSBarry Smith . name - The class name 25205c6c1daeSBarry Smith 25215c6c1daeSBarry Smith Output Parameter: 25225c6c1daeSBarry Smith . oclass - The class id or classid 25235c6c1daeSBarry Smith 25245c6c1daeSBarry Smith Level: developer 25255c6c1daeSBarry Smith 2526d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()` 25275c6c1daeSBarry Smith @*/ 2528d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass) 2529d71ae5a4SJacob Faibussowitsch { 25305c6c1daeSBarry Smith PetscFunctionBegin; 25315c6c1daeSBarry Smith *oclass = ++PETSC_LARGEST_CLASSID; 25325c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 2533b665b14eSToby Isaac { 2534b665b14eSToby Isaac PetscLogState state; 2535b665b14eSToby Isaac PetscLogClass logclass; 2536b665b14eSToby Isaac 2537b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 2538b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass)); 2539b665b14eSToby Isaac } 25405c6c1daeSBarry Smith #endif 25413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25425c6c1daeSBarry Smith } 2543