15c6c1daeSBarry Smith /* 25c6c1daeSBarry Smith PETSc code to log object creation and destruction and PETSc events. 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith This provides the public API used by the rest of PETSc and by users. 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith These routines use a private API that is not used elsewhere in PETSc and is not 75c6c1daeSBarry Smith accessible to users. The private API is defined in logimpl.h and the utils directory. 85c6c1daeSBarry Smith 9b665b14eSToby Isaac *** 10b665b14eSToby Isaac 11b665b14eSToby Isaac This file, and only this file, is for functions that interact with the global logging state 125c6c1daeSBarry Smith */ 13af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 1453e0a2f3SToby Isaac #include <petsc/private/loghandlerimpl.h> 155c6c1daeSBarry Smith #include <petsctime.h> 16665c2dedSJed Brown #include <petscviewer.h> 178fe3844cSJunchao Zhang #include <petscdevice.h> 188fe3844cSJunchao Zhang #include <petsc/private/deviceimpl.h> 195c6c1daeSBarry Smith 20c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 21c708d6e3SStefano Zampini 22c708d6e3SStefano Zampini PetscInt petsc_log_gid = -1; /* Global threadId counter */ 23c708d6e3SStefano Zampini PETSC_TLS PetscInt petsc_log_tid = -1; /* Local threadId */ 24c708d6e3SStefano Zampini 25c708d6e3SStefano Zampini /* shared variables */ 26c708d6e3SStefano Zampini PetscSpinlock PetscLogSpinLock; 27c708d6e3SStefano Zampini 282611ad71SToby Isaac PetscInt PetscLogGetTid(void) 292611ad71SToby Isaac { 302611ad71SToby Isaac if (petsc_log_tid < 0) { 312611ad71SToby Isaac PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 322611ad71SToby Isaac petsc_log_tid = ++petsc_log_gid; 332611ad71SToby Isaac PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 342611ad71SToby Isaac } 352611ad71SToby Isaac return petsc_log_tid; 362611ad71SToby Isaac } 372611ad71SToby Isaac 38c708d6e3SStefano Zampini #endif 39c708d6e3SStefano Zampini 405c6c1daeSBarry Smith /* Global counters */ 415c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime = 0.0; 425c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops = 0.0; /* The number of flops */ 435c6c1daeSBarry Smith PetscLogDouble petsc_send_ct = 0.0; /* The number of sends */ 445c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct = 0.0; /* The number of receives */ 455c6c1daeSBarry Smith PetscLogDouble petsc_send_len = 0.0; /* The total length of all sent messages */ 465c6c1daeSBarry Smith PetscLogDouble petsc_recv_len = 0.0; /* The total length of all received messages */ 475c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct = 0.0; /* The number of immediate sends */ 485c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct = 0.0; /* The number of immediate receives */ 495c6c1daeSBarry Smith PetscLogDouble petsc_isend_len = 0.0; /* The total length of all immediate send messages */ 505c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len = 0.0; /* The total length of all immediate receive messages */ 515c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct = 0.0; /* The number of waits */ 525c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct = 0.0; /* The number of anywaits */ 535c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct = 0.0; /* The number of waitalls */ 545c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */ 555c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct = 0.0; /* The number of reductions */ 565c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct = 0.0; /* The number of gathers and gathervs */ 575c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct = 0.0; /* The number of scatters and scattervs */ 58c708d6e3SStefano Zampini 59c708d6e3SStefano Zampini /* Thread Local storage */ 60c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_TotalFlops_th = 0.0; 61c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_ct_th = 0.0; 62c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_ct_th = 0.0; 63c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_len_th = 0.0; 64c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_len_th = 0.0; 65c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_ct_th = 0.0; 66c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_ct_th = 0.0; 67c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_len_th = 0.0; 68c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_len_th = 0.0; 69c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_ct_th = 0.0; 70c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_any_ct_th = 0.0; 71c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_all_ct_th = 0.0; 72c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_sum_of_waits_ct_th = 0.0; 73c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_allreduce_ct_th = 0.0; 74c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gather_ct_th = 0.0; 75c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_scatter_ct_th = 0.0; 76c708d6e3SStefano Zampini 77bec0b493Shannah_mairs PetscLogDouble petsc_ctog_ct = 0.0; /* The total number of CPU to GPU copies */ 78bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_ct = 0.0; /* The total number of GPU to CPU copies */ 79bec0b493Shannah_mairs PetscLogDouble petsc_ctog_sz = 0.0; /* The total size of CPU to GPU copies */ 80bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_sz = 0.0; /* The total size of GPU to CPU copies */ 8145c4b7c1SBarry Smith PetscLogDouble petsc_ctog_ct_scalar = 0.0; /* The total number of CPU to GPU copies */ 8245c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_ct_scalar = 0.0; /* The total number of GPU to CPU copies */ 8345c4b7c1SBarry Smith PetscLogDouble petsc_ctog_sz_scalar = 0.0; /* The total size of CPU to GPU copies */ 8445c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_sz_scalar = 0.0; /* The total size of GPU to CPU copies */ 85958c4211Shannah_mairs PetscLogDouble petsc_gflops = 0.0; /* The flops done on a GPU */ 86958c4211Shannah_mairs PetscLogDouble petsc_gtime = 0.0; /* The time spent on a GPU */ 87c708d6e3SStefano Zampini 88c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_th = 0.0; 89c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_th = 0.0; 90c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_th = 0.0; 91c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_th = 0.0; 92c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_scalar_th = 0.0; 93c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_scalar_th = 0.0; 94c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_scalar_th = 0.0; 95c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_scalar_th = 0.0; 96c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gflops_th = 0.0; 97c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtime_th = 0.0; 982611ad71SToby Isaac 992611ad71SToby Isaac PetscBool PetscLogMemory = PETSC_FALSE; 1002611ad71SToby Isaac PetscBool PetscLogSyncOn = PETSC_FALSE; 1012611ad71SToby Isaac 1022611ad71SToby Isaac PetscBool PetscLogGpuTimeFlag = PETSC_FALSE; 1032611ad71SToby Isaac 1042611ad71SToby Isaac PetscLogState petsc_log_state = NULL; 1052611ad71SToby Isaac 10610dd146fSPierre Jolivet // clang-format off 10710dd146fSPierre Jolivet #define PETSC_LOG_HANDLER_HOT_BLANK {NULL, NULL, NULL, NULL, NULL, NULL} 10810dd146fSPierre Jolivet // clang-format on 1092611ad71SToby Isaac 1102611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = { 1112611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1122611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1132611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1142611ad71SToby Isaac PETSC_LOG_HANDLER_HOT_BLANK, 1152611ad71SToby Isaac }; 1162611ad71SToby Isaac 1172611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK 1182611ad71SToby Isaac 1192611ad71SToby Isaac #if defined(PETSC_USE_LOG) 1202611ad71SToby Isaac #include <../src/sys/logging/handler/impls/default/logdefault.h> 121c708d6e3SStefano Zampini 122c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY) 123c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp) 124c708d6e3SStefano Zampini { 125c708d6e3SStefano Zampini *tot_th += tmp; 1263ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 127c708d6e3SStefano Zampini *tot += tmp; 1283ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 1293ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 130c708d6e3SStefano Zampini } 131c708d6e3SStefano Zampini 132c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp) 133c708d6e3SStefano Zampini { 134c708d6e3SStefano Zampini *cnt_th = *cnt_th + 1; 135c708d6e3SStefano Zampini *tot_th += tmp; 1363ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockLock(&PetscLogSpinLock)); 137c708d6e3SStefano Zampini *tot += (PetscLogDouble)(tmp); 138c708d6e3SStefano Zampini *cnt += *cnt + 1; 1393ba16761SJacob Faibussowitsch PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock)); 1403ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 141c708d6e3SStefano Zampini } 142c708d6e3SStefano Zampini 143bec0b493Shannah_mairs #endif 1445c6c1daeSBarry Smith 14553e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler) 14653e0a2f3SToby Isaac { 14753e0a2f3SToby Isaac PetscFunctionBegin; 14853e0a2f3SToby Isaac PetscAssertPointer(handler, 2); 14953e0a2f3SToby Isaac *handler = NULL; 15053e0a2f3SToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 15153e0a2f3SToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 15253e0a2f3SToby Isaac if (h) { 15353e0a2f3SToby Isaac PetscBool match; 15453e0a2f3SToby Isaac 15553e0a2f3SToby Isaac PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match)); 15653e0a2f3SToby Isaac if (match) { 15753e0a2f3SToby Isaac *handler = PetscLogHandlers[i].handler; 15853e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 15953e0a2f3SToby Isaac } 16053e0a2f3SToby Isaac } 16153e0a2f3SToby Isaac } 16253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 16353e0a2f3SToby Isaac } 16453e0a2f3SToby Isaac 16553e0a2f3SToby Isaac /*@ 166b665b14eSToby Isaac PetscLogGetDefaultHandler - Get the default log handler if it is running. 167b665b14eSToby Isaac 168b665b14eSToby Isaac Not collective 169b665b14eSToby Isaac 170b665b14eSToby Isaac Output Parameter: 171b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running. 172b665b14eSToby Isaac 173b665b14eSToby Isaac Level: developer 174b665b14eSToby Isaac 175b665b14eSToby Isaac Notes: 176b665b14eSToby Isaac The default handler is started with `PetscLogDefaultBegin()`, 177b665b14eSToby Isaac if the options flags `-log_all` or `-log_view` is given without arguments, 178b665b14eSToby Isaac or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`. 179b665b14eSToby Isaac 180b665b14eSToby Isaac .seealso: [](ch_profiling) 181b665b14eSToby Isaac @*/ 182b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler) 183b665b14eSToby Isaac { 184b665b14eSToby Isaac PetscFunctionBegin; 185294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler)); 186b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 187b665b14eSToby Isaac } 188b665b14eSToby Isaac 189b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler) 190b665b14eSToby Isaac { 191b665b14eSToby Isaac PetscFunctionBegin; 192b665b14eSToby Isaac PetscAssertPointer(handler, 2); 193b665b14eSToby Isaac PetscCall(PetscLogTryGetHandler(type, handler)); 1941943a749SToby Isaac PetscCheck(*handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type); 195b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 196b665b14eSToby Isaac } 197b665b14eSToby Isaac 198b665b14eSToby Isaac /*@ 19953e0a2f3SToby Isaac PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used 20053e0a2f3SToby Isaac by all default log handlers (`PetscLogDefaultBegin()`, 20153e0a2f3SToby Isaac `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`, 20253e0a2f3SToby Isaac `PetscLogPerfstubsBegin()`). 20353e0a2f3SToby Isaac 20453e0a2f3SToby Isaac Collective on `PETSC_COMM_WORLD` 20553e0a2f3SToby Isaac 20653e0a2f3SToby Isaac Output Parameter: 207b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as 208b665b14eSToby Isaac `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or 209b8004f34SBarry Smith `PetscLogStagePush()`), or `NULL` if logging is not active 21053e0a2f3SToby Isaac 21153e0a2f3SToby Isaac Level: developer 21253e0a2f3SToby Isaac 21353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState` 21453e0a2f3SToby Isaac @*/ 21553e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state) 21653e0a2f3SToby Isaac { 21753e0a2f3SToby Isaac PetscFunctionBegin; 21853e0a2f3SToby Isaac PetscAssertPointer(state, 1); 21953e0a2f3SToby Isaac *state = petsc_log_state; 22053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 22153e0a2f3SToby Isaac } 22253e0a2f3SToby Isaac 22353e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot) 22453e0a2f3SToby Isaac { 22553e0a2f3SToby Isaac PetscFunctionBegin; 22653e0a2f3SToby Isaac hot->handler = h; 22753e0a2f3SToby Isaac hot->eventBegin = h->ops->eventbegin; 22853e0a2f3SToby Isaac hot->eventEnd = h->ops->eventend; 22953e0a2f3SToby Isaac hot->eventSync = h->ops->eventsync; 23053e0a2f3SToby Isaac hot->objectCreate = h->ops->objectcreate; 23153e0a2f3SToby Isaac hot->objectDestroy = h->ops->objectdestroy; 23253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 23353e0a2f3SToby Isaac } 23453e0a2f3SToby Isaac 23553e0a2f3SToby Isaac /*@ 23653e0a2f3SToby Isaac PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state. 23753e0a2f3SToby Isaac 23853e0a2f3SToby Isaac Logically collective 23953e0a2f3SToby Isaac 24053e0a2f3SToby Isaac Input Parameters: 24153e0a2f3SToby Isaac . h - a `PetscLogHandler` 24253e0a2f3SToby Isaac 24353e0a2f3SToby Isaac Level: developer 24453e0a2f3SToby Isaac 24553e0a2f3SToby Isaac Notes: 24653e0a2f3SToby Isaac Users should only need this if they create their own log handlers: handlers that are started 24753e0a2f3SToby Isaac from the command line (such as `-log_view` and `-log_trace`) or from a function like 24853e0a2f3SToby Isaac `PetscLogNestedBegin()` will automatically be started. 24953e0a2f3SToby Isaac 25053e0a2f3SToby Isaac There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time. 25153e0a2f3SToby Isaac 25253e0a2f3SToby Isaac To disconnect a handler from the global stream call `PetscLogHandlerStop()`. 25353e0a2f3SToby Isaac 25453e0a2f3SToby Isaac When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`, 25553e0a2f3SToby Isaac will be pushed for the new log handler, but it will not be informed of any events that are 25653e0a2f3SToby Isaac in progress. It is recommended to start any user-defined log handlers immediately following 257b8004f34SBarry Smith `PetscInitialize()` before any user-defined stages are pushed. 25853e0a2f3SToby Isaac 259b8004f34SBarry Smith .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`, `PetscInitialize()` 26053e0a2f3SToby Isaac @*/ 26153e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h) 26253e0a2f3SToby Isaac { 26353e0a2f3SToby Isaac PetscFunctionBegin; 26453e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 26553e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS); 26653e0a2f3SToby Isaac } 26753e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 26853e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == NULL) { 26953e0a2f3SToby Isaac PetscCall(PetscObjectReference((PetscObject)h)); 27053e0a2f3SToby Isaac PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i])); 27153e0a2f3SToby Isaac if (petsc_log_state) { 27253e0a2f3SToby Isaac PetscLogStage stack_height; 27353e0a2f3SToby Isaac PetscIntStack orig_stack, temp_stack; 27453e0a2f3SToby Isaac 27553e0a2f3SToby Isaac PetscCall(PetscLogHandlerSetState(h, petsc_log_state)); 27653e0a2f3SToby Isaac stack_height = petsc_log_state->stage_stack->top + 1; 27753e0a2f3SToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 27853e0a2f3SToby Isaac orig_stack = petsc_log_state->stage_stack; 27953e0a2f3SToby Isaac petsc_log_state->stage_stack = temp_stack; 28053e0a2f3SToby Isaac petsc_log_state->current_stage = -1; 28153e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 28253e0a2f3SToby Isaac PetscLogStage stage = (PetscLogStage)orig_stack->stack[s]; 28353e0a2f3SToby Isaac PetscCall(PetscLogHandlerStagePush(h, stage)); 28453e0a2f3SToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 28553e0a2f3SToby Isaac petsc_log_state->current_stage = stage; 28653e0a2f3SToby Isaac } 28753e0a2f3SToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 28853e0a2f3SToby Isaac petsc_log_state->stage_stack = orig_stack; 28953e0a2f3SToby Isaac } 29053e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 29153e0a2f3SToby Isaac } 29253e0a2f3SToby Isaac } 29353e0a2f3SToby Isaac SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX); 29453e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 29553e0a2f3SToby Isaac } 29653e0a2f3SToby Isaac 29753e0a2f3SToby Isaac /*@ 29853e0a2f3SToby Isaac PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream. 29953e0a2f3SToby Isaac 30053e0a2f3SToby Isaac Logically collective 30153e0a2f3SToby Isaac 30253e0a2f3SToby Isaac Input Parameters: 30353e0a2f3SToby Isaac . h - a `PetscLogHandler` 30453e0a2f3SToby Isaac 30553e0a2f3SToby Isaac Level: developer 30653e0a2f3SToby Isaac 30753e0a2f3SToby Isaac Note: 30853e0a2f3SToby Isaac After `PetscLogHandlerStop()`, the handler can still access the global logging state 30953e0a2f3SToby Isaac with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing 31053e0a2f3SToby Isaac (for instance, in `PetscLogHandlerView()`), 31153e0a2f3SToby Isaac 31253e0a2f3SToby Isaac When a log handler is stopped, the remaining stages will be popped before it is 31353e0a2f3SToby Isaac disconnected from the log stream. 31453e0a2f3SToby Isaac 31553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()` 31653e0a2f3SToby Isaac @*/ 31753e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h) 31853e0a2f3SToby Isaac { 31953e0a2f3SToby Isaac PetscFunctionBegin; 32053e0a2f3SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 32153e0a2f3SToby Isaac if (PetscLogHandlers[i].handler == h) { 32253e0a2f3SToby Isaac if (petsc_log_state) { 32353e0a2f3SToby Isaac PetscLogState state; 32453e0a2f3SToby Isaac PetscLogStage stack_height; 32553e0a2f3SToby Isaac PetscIntStack orig_stack, temp_stack; 32653e0a2f3SToby Isaac 32753e0a2f3SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 32853e0a2f3SToby Isaac PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started."); 32953e0a2f3SToby Isaac stack_height = petsc_log_state->stage_stack->top + 1; 33053e0a2f3SToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 33153e0a2f3SToby Isaac orig_stack = petsc_log_state->stage_stack; 33253e0a2f3SToby Isaac petsc_log_state->stage_stack = temp_stack; 33353e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 33453e0a2f3SToby Isaac PetscLogStage stage = (PetscLogStage)orig_stack->stack[s]; 33553e0a2f3SToby Isaac 33653e0a2f3SToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 33753e0a2f3SToby Isaac } 33853e0a2f3SToby Isaac for (int s = 0; s < stack_height; s++) { 33953e0a2f3SToby Isaac PetscLogStage stage; 34053e0a2f3SToby Isaac PetscBool empty; 34153e0a2f3SToby Isaac 34253e0a2f3SToby Isaac PetscCall(PetscIntStackPop(temp_stack, &stage)); 34353e0a2f3SToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &empty)); 34453e0a2f3SToby Isaac if (!empty) { 34553e0a2f3SToby Isaac PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage)); 34653e0a2f3SToby Isaac } else petsc_log_state->current_stage = -1; 34753e0a2f3SToby Isaac PetscCall(PetscLogHandlerStagePop(h, stage)); 34853e0a2f3SToby Isaac } 34953e0a2f3SToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 35053e0a2f3SToby Isaac petsc_log_state->stage_stack = orig_stack; 35153e0a2f3SToby Isaac PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage)); 35253e0a2f3SToby Isaac } 35353e0a2f3SToby Isaac PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1)); 35453e0a2f3SToby Isaac PetscCall(PetscObjectDereference((PetscObject)h)); 35553e0a2f3SToby Isaac } 35653e0a2f3SToby Isaac } 35753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 35853e0a2f3SToby Isaac } 3595c6c1daeSBarry Smith 3605c6c1daeSBarry Smith /*@C 3614dd65854SConnor Ward PetscLogIsActive - Check if logging is currently in progress. 3624dd65854SConnor Ward 3634dd65854SConnor Ward Not Collective 3644dd65854SConnor Ward 3654dd65854SConnor Ward Output Parameter: 366811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise 3674dd65854SConnor Ward 3684dd65854SConnor Ward Level: beginner 3694dd65854SConnor Ward 370b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()` 3714dd65854SConnor Ward @*/ 372d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive) 373d71ae5a4SJacob Faibussowitsch { 3744dd65854SConnor Ward PetscFunctionBegin; 375b665b14eSToby Isaac *isActive = PETSC_FALSE; 376b665b14eSToby Isaac if (petsc_log_state) { 377b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 378b665b14eSToby Isaac if (PetscLogHandlers[i].handler) { 379b665b14eSToby Isaac *isActive = PETSC_TRUE; 380b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 381b665b14eSToby Isaac } 382b665b14eSToby Isaac } 383b665b14eSToby Isaac } 384b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 385b665b14eSToby Isaac } 386b665b14eSToby Isaac 387b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive) 388b665b14eSToby Isaac { 389b665b14eSToby Isaac PetscFunctionBegin; 390b665b14eSToby Isaac *isActive = PETSC_FALSE; 391b665b14eSToby Isaac if (petsc_log_state) { 392b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 393b665b14eSToby Isaac if (PetscLogHandlers[i].eventBegin) { 394b665b14eSToby Isaac *isActive = PETSC_TRUE; 395b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 396b665b14eSToby Isaac } 397b665b14eSToby Isaac } 398b665b14eSToby Isaac } 399b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 400b665b14eSToby Isaac } 401b665b14eSToby Isaac 402b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive) 403b665b14eSToby Isaac { 404b665b14eSToby Isaac PetscFunctionBegin; 405b665b14eSToby Isaac *isActive = PETSC_FALSE; 406b665b14eSToby Isaac if (petsc_log_state) { 407b665b14eSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 408b665b14eSToby Isaac if (PetscLogHandlers[i].eventEnd) { 409b665b14eSToby Isaac *isActive = PETSC_TRUE; 410b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 411b665b14eSToby Isaac } 412b665b14eSToby Isaac } 413b665b14eSToby Isaac } 4143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4154dd65854SConnor Ward } 4164dd65854SConnor Ward 41761cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type) 41853e0a2f3SToby Isaac { 41953e0a2f3SToby Isaac PetscLogHandler handler; 42053e0a2f3SToby Isaac 42153e0a2f3SToby Isaac PetscFunctionBegin; 42253e0a2f3SToby Isaac PetscCall(PetscLogTryGetHandler(type, &handler)); 42353e0a2f3SToby Isaac if (handler) PetscFunctionReturn(PETSC_SUCCESS); 42453e0a2f3SToby Isaac PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler)); 42553e0a2f3SToby Isaac PetscCall(PetscLogHandlerSetType(handler, type)); 42653e0a2f3SToby Isaac PetscCall(PetscLogHandlerStart(handler)); 42753e0a2f3SToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 42853e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 42953e0a2f3SToby Isaac } 43053e0a2f3SToby Isaac 4314dd65854SConnor Ward /*@C 432b665b14eSToby Isaac PetscLogDefaultBegin - Turns on logging of objects and events using the default log handler. This logs flop 4335c6c1daeSBarry Smith rates and object creation and should not slow programs down too much. 4345c6c1daeSBarry Smith This routine may be called more than once. 4355c6c1daeSBarry Smith 4368f14a041SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 4375c6c1daeSBarry Smith 438811af0c4SBarry Smith Options Database Key: 439a2553e36SBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the 440a2553e36SBarry Smith screen (for code configured with --with-log=1 (which is the default)) 4415c6c1daeSBarry Smith 44210450e9eSJacob Faibussowitsch Example Usage: 4435c6c1daeSBarry Smith .vb 4445c6c1daeSBarry Smith PetscInitialize(...); 445bb1d7374SBarry Smith PetscLogDefaultBegin(); 4465c6c1daeSBarry Smith ... code ... 4475c6c1daeSBarry Smith PetscLogView(viewer); or PetscLogDump(); 4485c6c1daeSBarry Smith PetscFinalize(); 4495c6c1daeSBarry Smith .ve 4505c6c1daeSBarry Smith 451d1f92df0SBarry Smith Level: advanced 452d1f92df0SBarry Smith 453811af0c4SBarry Smith Note: 454811af0c4SBarry Smith `PetscLogView()` or `PetscLogDump()` actually cause the printing of 4555c6c1daeSBarry Smith the logging information. 4565c6c1daeSBarry Smith 457b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()` 4585c6c1daeSBarry Smith @*/ 459d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void) 460d71ae5a4SJacob Faibussowitsch { 4615c6c1daeSBarry Smith PetscFunctionBegin; 462294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT)); 4633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4645c6c1daeSBarry Smith } 4655c6c1daeSBarry Smith 4665c6c1daeSBarry Smith /*@C 467b665b14eSToby Isaac PetscLogTraceBegin - Begins trace logging. Every time a PETSc event 4685c6c1daeSBarry Smith begins or ends, the event name is printed. 4695c6c1daeSBarry Smith 470811af0c4SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 4715c6c1daeSBarry Smith 4725c6c1daeSBarry Smith Input Parameter: 4735c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout) 4745c6c1daeSBarry Smith 4755c6c1daeSBarry Smith Options Database Key: 476b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()` 4775c6c1daeSBarry Smith 478d1f92df0SBarry Smith Level: intermediate 479d1f92df0SBarry Smith 4805c6c1daeSBarry Smith Notes: 481811af0c4SBarry Smith `PetscLogTraceBegin()` prints the processor number, the execution time (sec), 4825c6c1daeSBarry Smith then "Event begin:" or "Event end:" followed by the event name. 4835c6c1daeSBarry Smith 484811af0c4SBarry Smith `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful 4855c6c1daeSBarry Smith to determine where a program is hanging without running in the 4865c6c1daeSBarry Smith debugger. Can be used in conjunction with the -info option. 4875c6c1daeSBarry Smith 488b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()` 4895c6c1daeSBarry Smith @*/ 490d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file) 491d71ae5a4SJacob Faibussowitsch { 492b665b14eSToby Isaac PetscLogHandler handler; 4934d86920dSPierre Jolivet 4945c6c1daeSBarry Smith PetscFunctionBegin; 495294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler)); 496b665b14eSToby Isaac if (handler) PetscFunctionReturn(PETSC_SUCCESS); 497b665b14eSToby Isaac PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler)); 498b665b14eSToby Isaac PetscCall(PetscLogHandlerStart(handler)); 499b665b14eSToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 500b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 501b665b14eSToby Isaac } 502a297a907SKarl Rupp 503b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *); 504b665b14eSToby Isaac 505b665b14eSToby Isaac /*@C 506b665b14eSToby Isaac PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop 507b665b14eSToby Isaac rates and object creation and should not slow programs down too much. 508b665b14eSToby Isaac 5098f14a041SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 510b665b14eSToby Isaac 511b665b14eSToby Isaac Options Database Keys: 512b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file 513b665b14eSToby Isaac 514b665b14eSToby Isaac Example Usage: 515b665b14eSToby Isaac .vb 516b665b14eSToby Isaac PetscInitialize(...); 517b665b14eSToby Isaac PetscLogNestedBegin(); 518b665b14eSToby Isaac ... code ... 519b665b14eSToby Isaac PetscLogView(viewer); 520b665b14eSToby Isaac PetscFinalize(); 521b665b14eSToby Isaac .ve 522b665b14eSToby Isaac 523b665b14eSToby Isaac Level: advanced 524b665b14eSToby Isaac 525b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()` 526b665b14eSToby Isaac @*/ 527b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void) 528b665b14eSToby Isaac { 529b665b14eSToby Isaac PetscFunctionBegin; 530294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED)); 5313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5325c6c1daeSBarry Smith } 5335c6c1daeSBarry Smith 53453e0a2f3SToby Isaac /*@C 53553e0a2f3SToby Isaac PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks 53653e0a2f3SToby Isaac matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`, 53753e0a2f3SToby Isaac `PetscLogPHC`, `PetscLogPHD`. 53853e0a2f3SToby Isaac 5398f14a041SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 54053e0a2f3SToby Isaac 54153e0a2f3SToby Isaac Input Parameters: 54253e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`) 54353e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`) 54453e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`) 54553e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`) 54653e0a2f3SToby Isaac 54753e0a2f3SToby Isaac Calling sequence of `PetscLogPLB`: 54853e0a2f3SToby Isaac + e - a `PetscLogEvent` that is beginning 54953e0a2f3SToby Isaac . _i - deprecated, unused 55053e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 55153e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 55253e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 55353e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 55453e0a2f3SToby Isaac 55553e0a2f3SToby Isaac Calling sequence of `PetscLogPLE`: 55653e0a2f3SToby Isaac + e - a `PetscLogEvent` that is beginning 55753e0a2f3SToby Isaac . _i - deprecated, unused 55853e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 55953e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 56053e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 56153e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 56253e0a2f3SToby Isaac 56353e0a2f3SToby Isaac Calling sequence of `PetscLogPHC`: 56453e0a2f3SToby Isaac . o - a `PetscObject` that has just been created 56553e0a2f3SToby Isaac 56653e0a2f3SToby Isaac Calling sequence of `PetscLogPHD`: 56753e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed 56853e0a2f3SToby Isaac 56953e0a2f3SToby Isaac Level: advanced 57053e0a2f3SToby Isaac 57153e0a2f3SToby Isaac Notes: 57253e0a2f3SToby Isaac This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code. 57353e0a2f3SToby Isaac 57453e0a2f3SToby Isaac This should help migrate external log handlers to use `PetscLogHandler`, but 57553e0a2f3SToby Isaac callbacks that depend on the deprecated `PetscLogStage` datatype will have to be 57653e0a2f3SToby Isaac updated. 57753e0a2f3SToby Isaac 57853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState` 57953e0a2f3SToby Isaac @*/ 58053e0a2f3SToby 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)) 58153e0a2f3SToby Isaac { 58253e0a2f3SToby Isaac PetscLogHandler handler; 58353e0a2f3SToby Isaac 58453e0a2f3SToby Isaac PetscFunctionBegin; 58553e0a2f3SToby Isaac PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler)); 58653e0a2f3SToby Isaac PetscCall(PetscLogHandlerStart(handler)); 58753e0a2f3SToby Isaac PetscCall(PetscLogHandlerDestroy(&handler)); 58853e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 58953e0a2f3SToby Isaac } 59053e0a2f3SToby Isaac 5912611ad71SToby Isaac #if defined(PETSC_HAVE_MPE) 5922611ad71SToby Isaac #include <mpe.h> 5932611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE; 5942611ad71SToby Isaac #endif 5952611ad71SToby Isaac 5962611ad71SToby Isaac /*@C 5972611ad71SToby Isaac PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the 5982611ad71SToby Isaac program down. 5992611ad71SToby Isaac 6008f14a041SBarry Smith Collective on `PETSC_COMM_WORLD` 6012611ad71SToby Isaac 6022611ad71SToby Isaac Options Database Key: 6032611ad71SToby Isaac . -log_mpe - Prints extensive log information 6042611ad71SToby Isaac 6052611ad71SToby Isaac Level: advanced 6062611ad71SToby Isaac 6072611ad71SToby Isaac Note: 6082611ad71SToby Isaac A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is 6092611ad71SToby Isaac intended for production runs since it logs only flop rates and object creation (and should 6102611ad71SToby Isaac not significantly slow the programs). 6112611ad71SToby Isaac 612b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`, 6132611ad71SToby Isaac `PetscLogEventDeactivate()` 6142611ad71SToby Isaac @*/ 6152611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void) 6162611ad71SToby Isaac { 6172611ad71SToby Isaac PetscFunctionBegin; 6182611ad71SToby Isaac #if defined(PETSC_HAVE_MPE) 6192611ad71SToby Isaac /* Do MPE initialization */ 6202611ad71SToby Isaac if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */ 6212611ad71SToby Isaac PetscCall(PetscInfo(0, "Initializing MPE.\n")); 6222611ad71SToby Isaac PetscCall(MPE_Init_log()); 6232611ad71SToby Isaac 6242611ad71SToby Isaac PetscBeganMPE = PETSC_TRUE; 6252611ad71SToby Isaac } else { 6262611ad71SToby Isaac PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n")); 6272611ad71SToby Isaac } 628294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE)); 6292611ad71SToby Isaac #else 6302611ad71SToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe"); 6312611ad71SToby Isaac #endif 6322611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 6332611ad71SToby Isaac } 6342611ad71SToby Isaac 63553e0a2f3SToby Isaac #if defined(PETSC_HAVE_TAU_PERFSTUBS) 63653e0a2f3SToby Isaac #include <../src/sys/perfstubs/timer.h> 63753e0a2f3SToby Isaac #endif 63853e0a2f3SToby Isaac 63953e0a2f3SToby Isaac /*@C 64053e0a2f3SToby Isaac PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface. 64153e0a2f3SToby Isaac 6428f14a041SBarry Smith Collective on `PETSC_COMM_WORLD` 64353e0a2f3SToby Isaac 64453e0a2f3SToby Isaac Options Database Key: 64553e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface 64653e0a2f3SToby Isaac 64753e0a2f3SToby Isaac Level: advanced 64853e0a2f3SToby Isaac 64953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()` 65053e0a2f3SToby Isaac @*/ 65153e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void) 65253e0a2f3SToby Isaac { 65353e0a2f3SToby Isaac PetscFunctionBegin; 65453e0a2f3SToby Isaac #if defined(PETSC_HAVE_TAU_PERFSTUBS) 655294de794SToby Isaac PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS)); 65653e0a2f3SToby Isaac #else 65753e0a2f3SToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs"); 65853e0a2f3SToby Isaac #endif 65953e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 66053e0a2f3SToby Isaac } 66153e0a2f3SToby Isaac 6625c6c1daeSBarry Smith /*@ 663b665b14eSToby Isaac PetscLogActions - Determines whether actions are logged for the default log handler. 6645c6c1daeSBarry Smith 6655c6c1daeSBarry Smith Not Collective 6665c6c1daeSBarry Smith 6675c6c1daeSBarry Smith Input Parameter: 668811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged 669811af0c4SBarry Smith 670811af0c4SBarry Smith Options Database Key: 671b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing 672b665b14eSToby Isaac - -log_include_actions - Turn on action logging 6735c6c1daeSBarry Smith 6745c6c1daeSBarry Smith Level: intermediate 6755c6c1daeSBarry Smith 676811af0c4SBarry Smith Note: 677811af0c4SBarry Smith Logging of actions continues to consume more memory as the program 6785c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 679aec76313SJacob Faibussowitsch 680b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()` 6815c6c1daeSBarry Smith @*/ 682d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag) 683d71ae5a4SJacob Faibussowitsch { 6845c6c1daeSBarry Smith PetscFunctionBegin; 685dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 686dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 687dff009beSToby Isaac 688dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag)); 689dff009beSToby Isaac } 6903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6915c6c1daeSBarry Smith } 6925c6c1daeSBarry Smith 6935c6c1daeSBarry Smith /*@ 6945c6c1daeSBarry Smith PetscLogObjects - Determines whether objects are logged for the graphical viewer. 6955c6c1daeSBarry Smith 6965c6c1daeSBarry Smith Not Collective 6975c6c1daeSBarry Smith 6985c6c1daeSBarry Smith Input Parameter: 699811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged 700811af0c4SBarry Smith 701811af0c4SBarry Smith Options Database Key: 702b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing 703b665b14eSToby Isaac - -log_include_objects - Turns on object logging 7045c6c1daeSBarry Smith 7055c6c1daeSBarry Smith Level: intermediate 7065c6c1daeSBarry Smith 707811af0c4SBarry Smith Note: 708811af0c4SBarry Smith Logging of objects continues to consume more memory as the program 7095c6c1daeSBarry Smith runs. Long running programs should consider turning this feature off. 7105c6c1daeSBarry Smith 711b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()` 7125c6c1daeSBarry Smith @*/ 713d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag) 714d71ae5a4SJacob Faibussowitsch { 7155c6c1daeSBarry Smith PetscFunctionBegin; 716dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 717dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 718dff009beSToby Isaac 719dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag)); 720dff009beSToby Isaac } 7213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7225c6c1daeSBarry Smith } 7235c6c1daeSBarry Smith 7245c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/ 7255c6c1daeSBarry Smith /*@C 72674c0405dSRichard Tran Mills PetscLogStageRegister - Attaches a character string name to a logging stage. 7275c6c1daeSBarry Smith 7285c6c1daeSBarry Smith Not Collective 7295c6c1daeSBarry Smith 7305c6c1daeSBarry Smith Input Parameter: 7315c6c1daeSBarry Smith . sname - The name to associate with that stage 7325c6c1daeSBarry Smith 7335c6c1daeSBarry Smith Output Parameter: 734b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`). 7355c6c1daeSBarry Smith 7365c6c1daeSBarry Smith Level: intermediate 7375c6c1daeSBarry Smith 738d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()` 7395c6c1daeSBarry Smith @*/ 740d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage) 741d71ae5a4SJacob Faibussowitsch { 742b665b14eSToby Isaac PetscLogState state; 7435c6c1daeSBarry Smith 7445c6c1daeSBarry Smith PetscFunctionBegin; 745b665b14eSToby Isaac *stage = -1; 746b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 747b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage)); 7483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7495c6c1daeSBarry Smith } 7505c6c1daeSBarry Smith 7515c6c1daeSBarry Smith /*@C 752811af0c4SBarry Smith PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage 7535c6c1daeSBarry Smith 7545c6c1daeSBarry Smith Not Collective 7555c6c1daeSBarry Smith 7565c6c1daeSBarry Smith Input Parameter: 7575c6c1daeSBarry Smith . stage - The stage on which to log 7585c6c1daeSBarry Smith 75910450e9eSJacob Faibussowitsch Example Usage: 760811af0c4SBarry Smith If the option -log_view is used to run the program containing the 7615c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 7625c6c1daeSBarry Smith PetscFinalize(). 7635c6c1daeSBarry Smith .vb 7645c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 7655c6c1daeSBarry Smith [stage 0 of code] 7665c6c1daeSBarry Smith PetscLogStagePush(1); 7675c6c1daeSBarry Smith [stage 1 of code] 7685c6c1daeSBarry Smith PetscLogStagePop(); 7695c6c1daeSBarry Smith PetscBarrier(...); 7705c6c1daeSBarry Smith [more stage 0 of code] 7715c6c1daeSBarry Smith PetscFinalize(); 7725c6c1daeSBarry Smith .ve 7735c6c1daeSBarry Smith 774d1f92df0SBarry Smith Level: intermediate 775d1f92df0SBarry Smith 776811af0c4SBarry Smith Note: 777811af0c4SBarry Smith Use `PetscLogStageRegister()` to register a stage. 7785c6c1daeSBarry Smith 779d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()` 7805c6c1daeSBarry Smith @*/ 781d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage) 782d71ae5a4SJacob Faibussowitsch { 783b665b14eSToby Isaac PetscLogState state; 7845c6c1daeSBarry Smith 7855c6c1daeSBarry Smith PetscFunctionBegin; 786b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 787b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 788b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 789b665b14eSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 790b665b14eSToby Isaac if (h) PetscCall(PetscLogHandlerStagePush(h, stage)); 791b665b14eSToby Isaac } 792b665b14eSToby Isaac PetscCall(PetscLogStateStagePush(state, stage)); 7933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7945c6c1daeSBarry Smith } 7955c6c1daeSBarry Smith 7965c6c1daeSBarry Smith /*@C 797811af0c4SBarry Smith PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()` 7985c6c1daeSBarry Smith 7995c6c1daeSBarry Smith Not Collective 8005c6c1daeSBarry Smith 80110450e9eSJacob Faibussowitsch Example Usage: 802811af0c4SBarry Smith If the option -log_view is used to run the program containing the 8035c6c1daeSBarry Smith following code, then 2 sets of summary data will be printed during 8045c6c1daeSBarry Smith PetscFinalize(). 8055c6c1daeSBarry Smith .vb 8065c6c1daeSBarry Smith PetscInitialize(int *argc,char ***args,0,0); 8075c6c1daeSBarry Smith [stage 0 of code] 8085c6c1daeSBarry Smith PetscLogStagePush(1); 8095c6c1daeSBarry Smith [stage 1 of code] 8105c6c1daeSBarry Smith PetscLogStagePop(); 8115c6c1daeSBarry Smith PetscBarrier(...); 8125c6c1daeSBarry Smith [more stage 0 of code] 8135c6c1daeSBarry Smith PetscFinalize(); 8145c6c1daeSBarry Smith .ve 8155c6c1daeSBarry Smith 8165c6c1daeSBarry Smith Level: intermediate 8175c6c1daeSBarry Smith 818d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()` 8195c6c1daeSBarry Smith @*/ 820d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void) 821d71ae5a4SJacob Faibussowitsch { 822b665b14eSToby Isaac PetscLogState state; 823b665b14eSToby Isaac PetscLogStage current_stage; 8245c6c1daeSBarry Smith 8255c6c1daeSBarry Smith PetscFunctionBegin; 826b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 827b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 828b665b14eSToby Isaac current_stage = state->current_stage; 829b665b14eSToby Isaac PetscCall(PetscLogStateStagePop(state)); 830b665b14eSToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 831b665b14eSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 832b665b14eSToby Isaac if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage)); 833b665b14eSToby Isaac } 8343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8355c6c1daeSBarry Smith } 8365c6c1daeSBarry Smith 8375c6c1daeSBarry Smith /*@ 838811af0c4SBarry Smith PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`. 8395c6c1daeSBarry Smith 8405c6c1daeSBarry Smith Not Collective 8415c6c1daeSBarry Smith 8425c6c1daeSBarry Smith Input Parameters: 8435c6c1daeSBarry Smith + stage - The stage 844811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8455c6c1daeSBarry Smith 8465c6c1daeSBarry Smith Level: intermediate 8475c6c1daeSBarry Smith 848811af0c4SBarry Smith Note: 849811af0c4SBarry Smith If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist 850811af0c4SBarry Smith 851d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 8525c6c1daeSBarry Smith @*/ 853d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive) 854d71ae5a4SJacob Faibussowitsch { 855b665b14eSToby Isaac PetscLogState state; 8565c6c1daeSBarry Smith 8575c6c1daeSBarry Smith PetscFunctionBegin; 858b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 859b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive)); 8603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8615c6c1daeSBarry Smith } 8625c6c1daeSBarry Smith 8635c6c1daeSBarry Smith /*@ 864811af0c4SBarry Smith PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`. 8655c6c1daeSBarry Smith 8665c6c1daeSBarry Smith Not Collective 8675c6c1daeSBarry Smith 8685c6c1daeSBarry Smith Input Parameter: 8695c6c1daeSBarry Smith . stage - The stage 8705c6c1daeSBarry Smith 8715c6c1daeSBarry Smith Output Parameter: 872811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8735c6c1daeSBarry Smith 8745c6c1daeSBarry Smith Level: intermediate 8755c6c1daeSBarry Smith 876d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 8775c6c1daeSBarry Smith @*/ 878d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive) 879d71ae5a4SJacob Faibussowitsch { 880b665b14eSToby Isaac PetscLogState state; 8815c6c1daeSBarry Smith 8825c6c1daeSBarry Smith PetscFunctionBegin; 883b665b14eSToby Isaac *isActive = PETSC_FALSE; 884b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 885b665b14eSToby Isaac if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive)); 8863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8875c6c1daeSBarry Smith } 8885c6c1daeSBarry Smith 8895c6c1daeSBarry Smith /*@ 890811af0c4SBarry Smith PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()` 8915c6c1daeSBarry Smith 8925c6c1daeSBarry Smith Not Collective 8935c6c1daeSBarry Smith 8945c6c1daeSBarry Smith Input Parameters: 8955c6c1daeSBarry Smith + stage - The stage 896811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 8975c6c1daeSBarry Smith 8985c6c1daeSBarry Smith Level: intermediate 8995c6c1daeSBarry Smith 900aec76313SJacob Faibussowitsch Developer Notes: 901b665b14eSToby Isaac Visibility only affects the default log handler in `PetscLogView()`: stages that are 902b665b14eSToby Isaac set to invisible are suppressed from output. 903811af0c4SBarry Smith 904b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 9055c6c1daeSBarry Smith @*/ 906d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible) 9075c6c1daeSBarry Smith 908dff009beSToby Isaac { 9095c6c1daeSBarry Smith PetscFunctionBegin; 910dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 911dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 912dff009beSToby Isaac 913dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible)); 914dff009beSToby Isaac } 9153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9165c6c1daeSBarry Smith } 9175c6c1daeSBarry Smith 9185c6c1daeSBarry Smith /*@ 919811af0c4SBarry Smith PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()` 9205c6c1daeSBarry Smith 9215c6c1daeSBarry Smith Not Collective 9225c6c1daeSBarry Smith 9235c6c1daeSBarry Smith Input Parameter: 9245c6c1daeSBarry Smith . stage - The stage 9255c6c1daeSBarry Smith 9265c6c1daeSBarry Smith Output Parameter: 927811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`) 9285c6c1daeSBarry Smith 9295c6c1daeSBarry Smith Level: intermediate 9305c6c1daeSBarry Smith 931b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 9325c6c1daeSBarry Smith @*/ 933d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible) 934d71ae5a4SJacob Faibussowitsch { 935b665b14eSToby Isaac PetscLogHandler handler; 9365c6c1daeSBarry Smith 9375c6c1daeSBarry Smith PetscFunctionBegin; 938b665b14eSToby Isaac *isVisible = PETSC_FALSE; 939294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 940dff009beSToby Isaac if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); } 9413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9425c6c1daeSBarry Smith } 9435c6c1daeSBarry Smith 9445c6c1daeSBarry Smith /*@C 9455c6c1daeSBarry Smith PetscLogStageGetId - Returns the stage id when given the stage name. 9465c6c1daeSBarry Smith 9475c6c1daeSBarry Smith Not Collective 9485c6c1daeSBarry Smith 9495c6c1daeSBarry Smith Input Parameter: 9505c6c1daeSBarry Smith . name - The stage name 9515c6c1daeSBarry Smith 9525c6c1daeSBarry Smith Output Parameter: 9535a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists 9545c6c1daeSBarry Smith 9555c6c1daeSBarry Smith Level: intermediate 9565c6c1daeSBarry Smith 957d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 9585c6c1daeSBarry Smith @*/ 959d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage) 960d71ae5a4SJacob Faibussowitsch { 961b665b14eSToby Isaac PetscLogState state; 9625c6c1daeSBarry Smith 9635c6c1daeSBarry Smith PetscFunctionBegin; 964b665b14eSToby Isaac *stage = -1; 965b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 966b665b14eSToby Isaac if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage)); 9673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9685c6c1daeSBarry Smith } 9695c6c1daeSBarry Smith 97053e0a2f3SToby Isaac /*@C 97153e0a2f3SToby Isaac PetscLogStageGetName - Returns the stage name when given the stage id. 97253e0a2f3SToby Isaac 97353e0a2f3SToby Isaac Not Collective 97453e0a2f3SToby Isaac 97553e0a2f3SToby Isaac Input Parameter: 97653e0a2f3SToby Isaac . stage - The stage 97753e0a2f3SToby Isaac 97853e0a2f3SToby Isaac Output Parameter: 97953e0a2f3SToby Isaac . name - The stage name 98053e0a2f3SToby Isaac 98153e0a2f3SToby Isaac Level: intermediate 98253e0a2f3SToby Isaac 98353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 98453e0a2f3SToby Isaac @*/ 98553e0a2f3SToby Isaac PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char **name) 98653e0a2f3SToby Isaac { 98753e0a2f3SToby Isaac PetscLogStageInfo stage_info; 98853e0a2f3SToby Isaac PetscLogState state; 98953e0a2f3SToby Isaac 99053e0a2f3SToby Isaac PetscFunctionBegin; 991b665b14eSToby Isaac *name = NULL; 99253e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 993b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 99453e0a2f3SToby Isaac PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info)); 99553e0a2f3SToby Isaac *name = stage_info.name; 99653e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 99753e0a2f3SToby Isaac } 99853e0a2f3SToby Isaac 9995c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/ 10007a101e5eSJacob Faibussowitsch 10015c6c1daeSBarry Smith /*@C 1002811af0c4SBarry Smith PetscLogEventRegister - Registers an event name for logging operations 10035c6c1daeSBarry Smith 10045c6c1daeSBarry Smith Not Collective 10055c6c1daeSBarry Smith 1006d8d19677SJose E. Roman Input Parameters: 10075c6c1daeSBarry Smith + name - The name associated with the event 10085c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with 1009811af0c4SBarry Smith `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones 10105c6c1daeSBarry Smith are only available in C code 10115c6c1daeSBarry Smith 10125c6c1daeSBarry Smith Output Parameter: 1013811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`. 10145c6c1daeSBarry Smith 101510450e9eSJacob Faibussowitsch Example Usage: 10165c6c1daeSBarry Smith .vb 10175c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 10185c6c1daeSBarry Smith PetscClassId classid; 10195c6c1daeSBarry Smith PetscLogDouble user_event_flops; 10205c6c1daeSBarry Smith PetscClassIdRegister("class name",&classid); 10215c6c1daeSBarry Smith PetscLogEventRegister("User event name",classid,&USER_EVENT); 10225c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT,0,0,0,0); 10235c6c1daeSBarry Smith [code segment to monitor] 10245c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 10255c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT,0,0,0,0); 10265c6c1daeSBarry Smith .ve 10275c6c1daeSBarry Smith 1028d1f92df0SBarry Smith Level: intermediate 1029d1f92df0SBarry Smith 10305c6c1daeSBarry Smith Notes: 10315c6c1daeSBarry Smith PETSc automatically logs library events if the code has been 1032a2553e36SBarry Smith configured with --with-log (which is the default) and 1033811af0c4SBarry Smith -log_view or -log_all is specified. `PetscLogEventRegister()` is 10345c6c1daeSBarry Smith intended for logging user events to supplement this PETSc 10355c6c1daeSBarry Smith information. 10365c6c1daeSBarry Smith 1037495fc317SBarry Smith PETSc can gather data for use with the utilities Jumpshot 10385c6c1daeSBarry Smith (part of the MPICH distribution). If PETSc has been compiled 10395c6c1daeSBarry Smith with flag -DPETSC_HAVE_MPE (MPE is an additional utility within 10405c6c1daeSBarry Smith MPICH), the user can employ another command line option, -log_mpe, 10415c6c1daeSBarry Smith to create a logfile, "mpe.log", which can be visualized 1042495fc317SBarry Smith Jumpshot. 10435c6c1daeSBarry Smith 10445c6c1daeSBarry Smith The classid is associated with each event so that classes of events 10455c6c1daeSBarry Smith can be disabled simultaneously, such as all matrix events. The user 1046811af0c4SBarry Smith can either use an existing classid, such as `MAT_CLASSID`, or create 10475c6c1daeSBarry Smith their own as shown in the example. 10485c6c1daeSBarry Smith 1049c5deb1d5SJed Brown If an existing event with the same name exists, its event handle is 1050c5deb1d5SJed Brown returned instead of creating a new event. 1051c5deb1d5SJed Brown 1052d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`, 1053db781477SPatrick Sanan `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()` 10545c6c1daeSBarry Smith @*/ 1055d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event) 1056d71ae5a4SJacob Faibussowitsch { 1057b665b14eSToby Isaac PetscLogState state; 10585c6c1daeSBarry Smith 10595c6c1daeSBarry Smith PetscFunctionBegin; 1060b665b14eSToby Isaac *event = -1; 1061b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1062b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event)); 10633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10645c6c1daeSBarry Smith } 10655c6c1daeSBarry Smith 10665c6c1daeSBarry Smith /*@ 1067217044c2SLisandro Dalcin PetscLogEventSetCollective - Indicates that a particular event is collective. 1068217044c2SLisandro Dalcin 10695aefd447SStefano Zampini Logically Collective 1070217044c2SLisandro Dalcin 1071d8d19677SJose E. Roman Input Parameters: 1072217044c2SLisandro Dalcin + event - The event id 1073d5b43468SJose E. Roman - collective - Boolean flag indicating whether a particular event is collective 1074217044c2SLisandro Dalcin 1075d1f92df0SBarry Smith Level: developer 1076d1f92df0SBarry Smith 1077811af0c4SBarry Smith Notes: 1078811af0c4SBarry Smith New events returned from `PetscLogEventRegister()` are collective by default. 1079811af0c4SBarry Smith 10805aefd447SStefano Zampini Collective events are handled specially if the command line option -log_sync is used. In that case the logging saves information about 1081811af0c4SBarry Smith two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication 10825aefd447SStefano Zampini to be performed. This option is useful to debug imbalance within the computations or communications. 1083217044c2SLisandro Dalcin 1084d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()` 1085217044c2SLisandro Dalcin @*/ 1086d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective) 1087d71ae5a4SJacob Faibussowitsch { 1088b665b14eSToby Isaac PetscLogState state; 1089217044c2SLisandro Dalcin 1090217044c2SLisandro Dalcin PetscFunctionBegin; 1091b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1092b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective)); 1093b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1094b665b14eSToby Isaac } 1095b665b14eSToby Isaac 1096b665b14eSToby Isaac /* 1097b665b14eSToby Isaac PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage. 1098b665b14eSToby Isaac 1099b665b14eSToby Isaac Not Collective 1100b665b14eSToby Isaac 1101b665b14eSToby Isaac Input Parameters: 1102b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1103b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers. 1104b665b14eSToby Isaac 1105b665b14eSToby Isaac Level: developer 1106b665b14eSToby Isaac 1107b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()` 1108b665b14eSToby Isaac */ 1109b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive) 1110b665b14eSToby Isaac { 1111b665b14eSToby Isaac PetscLogState state; 1112b665b14eSToby Isaac 1113b665b14eSToby Isaac PetscFunctionBegin; 1114b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1115b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive)); 11163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1117217044c2SLisandro Dalcin } 1118217044c2SLisandro Dalcin 1119217044c2SLisandro Dalcin /*@ 1120fa2bb9feSLisandro Dalcin PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage. 1121fa2bb9feSLisandro Dalcin 1122fa2bb9feSLisandro Dalcin Not Collective 1123fa2bb9feSLisandro Dalcin 1124fa2bb9feSLisandro Dalcin Input Parameter: 1125811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1126fa2bb9feSLisandro Dalcin 1127fa2bb9feSLisandro Dalcin Level: developer 1128fa2bb9feSLisandro Dalcin 1129d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 1130fa2bb9feSLisandro Dalcin @*/ 1131d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid) 1132d71ae5a4SJacob Faibussowitsch { 1133fa2bb9feSLisandro Dalcin PetscFunctionBegin; 1134b665b14eSToby Isaac PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE)); 11353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1136fa2bb9feSLisandro Dalcin } 1137fa2bb9feSLisandro Dalcin 1138fa2bb9feSLisandro Dalcin /*@ 1139fa2bb9feSLisandro Dalcin PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage. 1140fa2bb9feSLisandro Dalcin 1141fa2bb9feSLisandro Dalcin Not Collective 1142fa2bb9feSLisandro Dalcin 1143fa2bb9feSLisandro Dalcin Input Parameter: 1144811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1145fa2bb9feSLisandro Dalcin 1146fa2bb9feSLisandro Dalcin Level: developer 1147fa2bb9feSLisandro Dalcin 1148811af0c4SBarry Smith Note: 1149811af0c4SBarry Smith If a class is excluded then events associated with that class are not logged. 1150811af0c4SBarry Smith 1151d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()` 1152fa2bb9feSLisandro Dalcin @*/ 1153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid) 1154d71ae5a4SJacob Faibussowitsch { 1155b665b14eSToby Isaac PetscFunctionBegin; 1156b665b14eSToby Isaac PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE)); 1157b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1158b665b14eSToby Isaac } 1159b665b14eSToby Isaac 1160b665b14eSToby Isaac /* 1161b665b14eSToby Isaac PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage 1162b665b14eSToby Isaac 1163b665b14eSToby Isaac Not Collective 1164b665b14eSToby Isaac 1165b665b14eSToby Isaac Input Parameters: 1166b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage) 1167b665b14eSToby Isaac . event - A `PetscLogEvent` 1168b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage 1169b665b14eSToby Isaac 1170b665b14eSToby Isaac Usage: 1171b665b14eSToby Isaac .vb 1172b665b14eSToby Isaac PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE); 1173b665b14eSToby Isaac [code where you do not want to log VecSetValues()] 1174b665b14eSToby Isaac PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE); 1175b665b14eSToby Isaac [code where you do want to log VecSetValues()] 1176b665b14eSToby Isaac .ve 1177b665b14eSToby Isaac 1178b665b14eSToby Isaac Level: advanced 1179b665b14eSToby Isaac 1180b665b14eSToby Isaac Note: 1181b665b14eSToby Isaac The event may be either a pre-defined PETSc event (found in include/petsclog.h) 1182b665b14eSToby Isaac or an event number obtained with `PetscLogEventRegister()`. 1183b665b14eSToby Isaac 1184b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 1185b665b14eSToby Isaac */ 1186b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive) 1187b665b14eSToby Isaac { 1188b665b14eSToby Isaac PetscLogState state; 1189fa2bb9feSLisandro Dalcin 1190fa2bb9feSLisandro Dalcin PetscFunctionBegin; 1191b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1192b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive)); 11933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1194fa2bb9feSLisandro Dalcin } 1195fa2bb9feSLisandro Dalcin 1196fa2bb9feSLisandro Dalcin /*@ 11975c6c1daeSBarry Smith PetscLogEventActivate - Indicates that a particular event should be logged. 11985c6c1daeSBarry Smith 11995c6c1daeSBarry Smith Not Collective 12005c6c1daeSBarry Smith 12015c6c1daeSBarry Smith Input Parameter: 12025c6c1daeSBarry Smith . event - The event id 12035c6c1daeSBarry Smith 120410450e9eSJacob Faibussowitsch Example Usage: 12055c6c1daeSBarry Smith .vb 12065c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 12075c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 12085c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 12095c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 12105c6c1daeSBarry Smith .ve 12115c6c1daeSBarry Smith 1212d1f92df0SBarry Smith Level: advanced 1213d1f92df0SBarry Smith 12145c6c1daeSBarry Smith Note: 12155c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in include/petsclog.h) 1216811af0c4SBarry Smith or an event number obtained with `PetscLogEventRegister()`. 12175c6c1daeSBarry Smith 1218b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 12195c6c1daeSBarry Smith @*/ 1220d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event) 1221d71ae5a4SJacob Faibussowitsch { 12225c6c1daeSBarry Smith PetscFunctionBegin; 1223b665b14eSToby Isaac PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE)); 12243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12255c6c1daeSBarry Smith } 12265c6c1daeSBarry Smith 12275c6c1daeSBarry Smith /*@ 12285c6c1daeSBarry Smith PetscLogEventDeactivate - Indicates that a particular event should not be logged. 12295c6c1daeSBarry Smith 12305c6c1daeSBarry Smith Not Collective 12315c6c1daeSBarry Smith 12325c6c1daeSBarry Smith Input Parameter: 12335c6c1daeSBarry Smith . event - The event id 12345c6c1daeSBarry Smith 123510450e9eSJacob Faibussowitsch Example Usage: 12365c6c1daeSBarry Smith .vb 12375c6c1daeSBarry Smith PetscLogEventDeactivate(VEC_SetValues); 12385c6c1daeSBarry Smith [code where you do not want to log VecSetValues()] 12395c6c1daeSBarry Smith PetscLogEventActivate(VEC_SetValues); 12405c6c1daeSBarry Smith [code where you do want to log VecSetValues()] 12415c6c1daeSBarry Smith .ve 12425c6c1daeSBarry Smith 1243d1f92df0SBarry Smith Level: advanced 1244d1f92df0SBarry Smith 12455c6c1daeSBarry Smith Note: 12465c6c1daeSBarry Smith The event may be either a pre-defined PETSc event (found in 1247811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 12485c6c1daeSBarry Smith 1249d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()` 12505c6c1daeSBarry Smith @*/ 1251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event) 1252d71ae5a4SJacob Faibussowitsch { 12535c6c1daeSBarry Smith PetscFunctionBegin; 1254b665b14eSToby Isaac PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE)); 12553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12565c6c1daeSBarry Smith } 12575c6c1daeSBarry Smith 12585c6c1daeSBarry Smith /*@ 1259811af0c4SBarry Smith PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called 1260c00cb57fSBarry Smith 1261c00cb57fSBarry Smith Not Collective 1262c00cb57fSBarry Smith 1263c00cb57fSBarry Smith Input Parameter: 1264c00cb57fSBarry Smith . event - The event id 1265c00cb57fSBarry Smith 126610450e9eSJacob Faibussowitsch Example Usage: 1267c00cb57fSBarry Smith .vb 1268c00cb57fSBarry Smith PetscLogEventDeactivatePush(VEC_SetValues); 1269c00cb57fSBarry Smith [code where you do not want to log VecSetValues()] 1270c00cb57fSBarry Smith PetscLogEventDeactivatePop(VEC_SetValues); 1271c00cb57fSBarry Smith [code where you do want to log VecSetValues()] 1272c00cb57fSBarry Smith .ve 1273c00cb57fSBarry Smith 1274d1f92df0SBarry Smith Level: advanced 1275d1f92df0SBarry Smith 1276c00cb57fSBarry Smith Note: 1277c00cb57fSBarry Smith The event may be either a pre-defined PETSc event (found in 1278811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 1279c00cb57fSBarry Smith 1280baca6076SPierre Jolivet 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 suppressing events is not helpful in their output formats. 1281b665b14eSToby Isaac 12824b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePop()` 1283c00cb57fSBarry Smith @*/ 1284d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event) 1285d71ae5a4SJacob Faibussowitsch { 1286c00cb57fSBarry Smith PetscFunctionBegin; 1287dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1288dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1289dff009beSToby Isaac 1290dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event)); 1291dff009beSToby Isaac } 12923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1293c00cb57fSBarry Smith } 1294c00cb57fSBarry Smith 1295c00cb57fSBarry Smith /*@ 1296811af0c4SBarry Smith PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()` 1297c00cb57fSBarry Smith 1298c00cb57fSBarry Smith Not Collective 1299c00cb57fSBarry Smith 1300c00cb57fSBarry Smith Input Parameter: 1301c00cb57fSBarry Smith . event - The event id 1302c00cb57fSBarry Smith 130310450e9eSJacob Faibussowitsch Example Usage: 1304c00cb57fSBarry Smith .vb 1305c00cb57fSBarry Smith PetscLogEventDeactivatePush(VEC_SetValues); 1306c00cb57fSBarry Smith [code where you do not want to log VecSetValues()] 1307c00cb57fSBarry Smith PetscLogEventDeactivatePop(VEC_SetValues); 1308c00cb57fSBarry Smith [code where you do want to log VecSetValues()] 1309c00cb57fSBarry Smith .ve 1310c00cb57fSBarry Smith 1311d1f92df0SBarry Smith Level: advanced 1312d1f92df0SBarry Smith 1313c00cb57fSBarry Smith Note: 1314c00cb57fSBarry Smith The event may be either a pre-defined PETSc event (found in 1315811af0c4SBarry Smith include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`). 1316c00cb57fSBarry Smith 1317d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()` 1318c00cb57fSBarry Smith @*/ 1319d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event) 1320d71ae5a4SJacob Faibussowitsch { 1321c00cb57fSBarry Smith PetscFunctionBegin; 1322dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1323dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1324dff009beSToby Isaac 1325dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event)); 1326dff009beSToby Isaac } 13273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1328c00cb57fSBarry Smith } 1329c00cb57fSBarry Smith 1330c00cb57fSBarry Smith /*@ 1331811af0c4SBarry Smith PetscLogEventSetActiveAll - Turns on logging of all events 13325c6c1daeSBarry Smith 13335c6c1daeSBarry Smith Not Collective 13345c6c1daeSBarry Smith 13355c6c1daeSBarry Smith Input Parameters: 13365c6c1daeSBarry Smith + event - The event id 13375c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged 13385c6c1daeSBarry Smith 13395c6c1daeSBarry Smith Level: advanced 13405c6c1daeSBarry Smith 1341b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 13425c6c1daeSBarry Smith @*/ 1343d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive) 1344d71ae5a4SJacob Faibussowitsch { 1345b665b14eSToby Isaac PetscLogState state; 13465c6c1daeSBarry Smith 13475c6c1daeSBarry Smith PetscFunctionBegin; 1348b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1349b665b14eSToby Isaac if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive)); 1350b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 13515c6c1daeSBarry Smith } 1352b665b14eSToby Isaac 1353b665b14eSToby Isaac /* 1354b665b14eSToby Isaac PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage 1355b665b14eSToby Isaac 1356b665b14eSToby Isaac Not Collective 1357b665b14eSToby Isaac 1358b665b14eSToby Isaac Input Parameters: 1359b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage) 1360b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 1361b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers. 1362b665b14eSToby Isaac 1363b665b14eSToby Isaac Level: developer 1364b665b14eSToby Isaac 1365b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()` 1366b665b14eSToby Isaac */ 1367b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive) 1368b665b14eSToby Isaac { 1369b665b14eSToby Isaac PetscLogState state; 1370b665b14eSToby Isaac 1371b665b14eSToby Isaac PetscFunctionBegin; 1372b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1373b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive)); 13743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13755c6c1daeSBarry Smith } 13765c6c1daeSBarry Smith 13775c6c1daeSBarry Smith /*@ 1378811af0c4SBarry Smith PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage 13795c6c1daeSBarry Smith 13805c6c1daeSBarry Smith Not Collective 13815c6c1daeSBarry Smith 13825c6c1daeSBarry Smith Input Parameter: 1383811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 13845c6c1daeSBarry Smith 13855c6c1daeSBarry Smith Level: developer 13865c6c1daeSBarry Smith 1387d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 13885c6c1daeSBarry Smith @*/ 1389d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid) 1390d71ae5a4SJacob Faibussowitsch { 13915c6c1daeSBarry Smith PetscFunctionBegin; 1392b665b14eSToby Isaac PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE)); 13933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13945c6c1daeSBarry Smith } 13955c6c1daeSBarry Smith 13965c6c1daeSBarry Smith /*@ 1397811af0c4SBarry Smith PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage 13985c6c1daeSBarry Smith 13995c6c1daeSBarry Smith Not Collective 14005c6c1daeSBarry Smith 14015c6c1daeSBarry Smith Input Parameter: 1402811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc. 14035c6c1daeSBarry Smith 14045c6c1daeSBarry Smith Level: developer 14055c6c1daeSBarry Smith 1406d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()` 14075c6c1daeSBarry Smith @*/ 1408d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid) 1409d71ae5a4SJacob Faibussowitsch { 14105c6c1daeSBarry Smith PetscFunctionBegin; 1411b665b14eSToby Isaac PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE)); 14123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 14135c6c1daeSBarry Smith } 14145c6c1daeSBarry Smith 14155c6c1daeSBarry Smith /*MC 141662872c28SLisandro Dalcin PetscLogEventSync - Synchronizes the beginning of a user event. 141762872c28SLisandro Dalcin 141862872c28SLisandro Dalcin Synopsis: 141962872c28SLisandro Dalcin #include <petsclog.h> 1420b665b14eSToby Isaac PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm) 142162872c28SLisandro Dalcin 142262872c28SLisandro Dalcin Collective 142362872c28SLisandro Dalcin 142462872c28SLisandro Dalcin Input Parameters: 1425b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 142662872c28SLisandro Dalcin - comm - an MPI communicator 142762872c28SLisandro Dalcin 142810450e9eSJacob Faibussowitsch Example Usage: 142962872c28SLisandro Dalcin .vb 143062872c28SLisandro Dalcin PetscLogEvent USER_EVENT; 143110450e9eSJacob Faibussowitsch 143262872c28SLisandro Dalcin PetscLogEventRegister("User event", 0, &USER_EVENT); 143362872c28SLisandro Dalcin PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD); 143462872c28SLisandro Dalcin PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 143562872c28SLisandro Dalcin [code segment to monitor] 143662872c28SLisandro Dalcin PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0); 143762872c28SLisandro Dalcin .ve 143862872c28SLisandro Dalcin 1439d1f92df0SBarry Smith Level: developer 1440d1f92df0SBarry Smith 1441811af0c4SBarry Smith Note: 144210450e9eSJacob Faibussowitsch This routine should be called only if there is not a `PetscObject` available to pass to 144310450e9eSJacob Faibussowitsch `PetscLogEventBegin()`. 144462872c28SLisandro Dalcin 1445d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()` 144662872c28SLisandro Dalcin M*/ 144762872c28SLisandro Dalcin 144862872c28SLisandro Dalcin /*MC 14495c6c1daeSBarry Smith PetscLogEventBegin - Logs the beginning of a user event. 14505c6c1daeSBarry Smith 14515c6c1daeSBarry Smith Synopsis: 1452aaa7dc30SBarry Smith #include <petsclog.h> 1453b665b14eSToby Isaac PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 14545c6c1daeSBarry Smith 14555c6c1daeSBarry Smith Not Collective 14565c6c1daeSBarry Smith 14575c6c1daeSBarry Smith Input Parameters: 1458b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 1459baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL` 1460baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL` 1461baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL` 1462baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL` 14635c6c1daeSBarry Smith 14645c6c1daeSBarry Smith Fortran Synopsis: 14655c6c1daeSBarry Smith void PetscLogEventBegin(int e, PetscErrorCode ierr) 14665c6c1daeSBarry Smith 146710450e9eSJacob Faibussowitsch Example Usage: 14685c6c1daeSBarry Smith .vb 14695c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 147010450e9eSJacob Faibussowitsch 14715c6c1daeSBarry Smith PetscLogDouble user_event_flops; 14725c6c1daeSBarry Smith PetscLogEventRegister("User event",0, &USER_EVENT); 14735c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 14745c6c1daeSBarry Smith [code segment to monitor] 14755c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 14765c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 14775c6c1daeSBarry Smith .ve 14785c6c1daeSBarry Smith 1479d1f92df0SBarry Smith Level: intermediate 1480d1f92df0SBarry Smith 1481811af0c4SBarry Smith Developer Note: 148210450e9eSJacob Faibussowitsch `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly 148310450e9eSJacob Faibussowitsch handling the errors that occur in the macro directly because other packages that use this 148410450e9eSJacob Faibussowitsch macros have used them in their own functions or methods that do not return error codes and it 148510450e9eSJacob Faibussowitsch would be disruptive to change the current behavior. 1486d0609cedSBarry Smith 1487d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()` 14885c6c1daeSBarry Smith M*/ 14895c6c1daeSBarry Smith 14905c6c1daeSBarry Smith /*MC 14915c6c1daeSBarry Smith PetscLogEventEnd - Log the end of a user event. 14925c6c1daeSBarry Smith 14935c6c1daeSBarry Smith Synopsis: 1494aaa7dc30SBarry Smith #include <petsclog.h> 1495b665b14eSToby Isaac PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 14965c6c1daeSBarry Smith 14975c6c1daeSBarry Smith Not Collective 14985c6c1daeSBarry Smith 14995c6c1daeSBarry Smith Input Parameters: 1500b665b14eSToby Isaac + e - `PetscLogEvent` obtained from `PetscLogEventRegister()` 1501baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL` 1502baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL` 1503baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL` 1504baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL` 15055c6c1daeSBarry Smith 15065c6c1daeSBarry Smith Fortran Synopsis: 15075c6c1daeSBarry Smith void PetscLogEventEnd(int e, PetscErrorCode ierr) 15085c6c1daeSBarry Smith 150910450e9eSJacob Faibussowitsch Example Usage: 15105c6c1daeSBarry Smith .vb 15115c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 151210450e9eSJacob Faibussowitsch 15135c6c1daeSBarry Smith PetscLogDouble user_event_flops; 151410450e9eSJacob Faibussowitsch PetscLogEventRegister("User event", 0, &USER_EVENT); 15155c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 15165c6c1daeSBarry Smith [code segment to monitor] 15175c6c1daeSBarry Smith PetscLogFlops(user_event_flops); 15185c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 15195c6c1daeSBarry Smith .ve 15205c6c1daeSBarry Smith 15215c6c1daeSBarry Smith Level: intermediate 15225c6c1daeSBarry Smith 1523d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()` 15245c6c1daeSBarry Smith M*/ 15255c6c1daeSBarry Smith 15265c6c1daeSBarry Smith /*@C 15278b08f494SToby Isaac PetscLogStageGetPerfInfo - Return the performance information about the given stage 15288b08f494SToby Isaac 15298b08f494SToby Isaac Input Parameters: 15308b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage 15318b08f494SToby Isaac 15328b08f494SToby Isaac Output Parameter: 15338b08f494SToby Isaac . info - This structure is filled with the performance information 15348b08f494SToby Isaac 15358b08f494SToby Isaac Level: intermediate 15368b08f494SToby Isaac 15378b08f494SToby Isaac Notes: 15388b08f494SToby Isaac This is a low level routine used by the logging functions in PETSc. 15398b08f494SToby Isaac 15408b08f494SToby Isaac A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with 15415804573cSPierre Jolivet `PetscLogDefaultBegin()` or from the command line with `-log_view`. If it was not started, 15420ba5dad9SToby Isaac all performance statistics in `info` will be zeroed. 15438b08f494SToby Isaac 15448b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()` 15458b08f494SToby Isaac @*/ 15468b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info) 15478b08f494SToby Isaac { 15488b08f494SToby Isaac PetscLogHandler handler; 15498b08f494SToby Isaac PetscEventPerfInfo *event_info; 15508b08f494SToby Isaac 15518b08f494SToby Isaac PetscFunctionBegin; 15528b08f494SToby Isaac PetscAssertPointer(info, 2); 15530ba5dad9SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 15540ba5dad9SToby Isaac if (handler) { 15558b08f494SToby Isaac PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info)); 15568b08f494SToby Isaac *info = *event_info; 15570ba5dad9SToby Isaac } else { 15580ba5dad9SToby Isaac PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogStageGetPerfInfo() returning zeros\n")); 15590ba5dad9SToby Isaac PetscCall(PetscMemzero(info, sizeof(*info))); 15600ba5dad9SToby Isaac } 15618b08f494SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 15628b08f494SToby Isaac } 15638b08f494SToby Isaac 15648b08f494SToby Isaac /*@C 1565b665b14eSToby Isaac PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage 1566b665b14eSToby Isaac 1567b665b14eSToby Isaac Input Parameters: 1568b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage 1569b665b14eSToby Isaac - event - The event number 1570b665b14eSToby Isaac 1571b665b14eSToby Isaac Output Parameter: 1572b665b14eSToby Isaac . info - This structure is filled with the performance information 1573b665b14eSToby Isaac 1574b665b14eSToby Isaac Level: intermediate 1575b665b14eSToby Isaac 1576b665b14eSToby Isaac Note: 1577b665b14eSToby Isaac This is a low level routine used by the logging functions in PETSc 1578b665b14eSToby Isaac 15790ba5dad9SToby Isaac A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with 15805804573cSPierre Jolivet `PetscLogDefaultBegin()` or from the command line with `-log_view`. If it was not started, 15810ba5dad9SToby Isaac all performance statistics in `info` will be zeroed. 15820ba5dad9SToby Isaac 1583b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()` 1584b665b14eSToby Isaac @*/ 1585b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info) 1586b665b14eSToby Isaac { 1587b665b14eSToby Isaac PetscLogHandler handler; 1588b665b14eSToby Isaac PetscEventPerfInfo *event_info; 1589b665b14eSToby Isaac 1590b665b14eSToby Isaac PetscFunctionBegin; 1591b665b14eSToby Isaac PetscAssertPointer(info, 3); 15920ba5dad9SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 15930ba5dad9SToby Isaac if (handler) { 1594dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info)); 1595b665b14eSToby Isaac *info = *event_info; 15960ba5dad9SToby Isaac } else { 15970ba5dad9SToby Isaac PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogEventGetPerfInfo() returning zeros\n")); 15980ba5dad9SToby Isaac PetscCall(PetscMemzero(info, sizeof(*info))); 15990ba5dad9SToby Isaac } 1600b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1601b665b14eSToby Isaac } 1602b665b14eSToby Isaac 1603b665b14eSToby Isaac /*@C 1604b665b14eSToby Isaac PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event 1605b665b14eSToby Isaac 1606b665b14eSToby Isaac Not Collective 1607b665b14eSToby Isaac 1608b665b14eSToby Isaac Input Parameters: 1609b665b14eSToby Isaac + event - The event id to log 1610b665b14eSToby Isaac . n - The dof index, in [0, 8) 1611b665b14eSToby Isaac - dof - The number of dofs 1612b665b14eSToby Isaac 1613b665b14eSToby Isaac Options Database Key: 1614b665b14eSToby Isaac . -log_view - Activates log summary 1615b665b14eSToby Isaac 1616b665b14eSToby Isaac Level: developer 1617b665b14eSToby Isaac 1618b665b14eSToby Isaac Note: 1619b665b14eSToby Isaac This is to enable logging of convergence 1620b665b14eSToby Isaac 1621b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()` 1622b665b14eSToby Isaac @*/ 1623b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof) 1624b665b14eSToby Isaac { 1625b665b14eSToby Isaac PetscFunctionBegin; 1626b665b14eSToby Isaac PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n); 1627dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1628dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1629dff009beSToby Isaac 1630dff009beSToby Isaac if (h) { 1631dff009beSToby Isaac PetscEventPerfInfo *event_info; 1632dff009beSToby Isaac 1633dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info)); 1634dff009beSToby Isaac if (event_info) event_info->dof[n] = dof; 1635dff009beSToby Isaac } 1636b665b14eSToby Isaac } 1637b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1638b665b14eSToby Isaac } 1639b665b14eSToby Isaac 1640b665b14eSToby Isaac /*@C 1641b665b14eSToby Isaac PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event 1642b665b14eSToby Isaac 1643b665b14eSToby Isaac Not Collective 1644b665b14eSToby Isaac 1645b665b14eSToby Isaac Input Parameters: 1646b665b14eSToby Isaac + event - The event id to log 1647b665b14eSToby Isaac . n - The error index, in [0, 8) 1648b665b14eSToby Isaac - error - The error 1649b665b14eSToby Isaac 1650b665b14eSToby Isaac Options Database Key: 1651b665b14eSToby Isaac . -log_view - Activates log summary 1652b665b14eSToby Isaac 1653b665b14eSToby Isaac Level: developer 1654b665b14eSToby Isaac 1655b665b14eSToby Isaac Notes: 1656b665b14eSToby Isaac This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example, 1657b665b14eSToby Isaac as different norms, or as errors for different fields 1658b665b14eSToby Isaac 1659b665b14eSToby Isaac This is a low level routine used by the logging functions in PETSc 1660b665b14eSToby Isaac 1661b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()` 1662b665b14eSToby Isaac @*/ 1663b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error) 1664b665b14eSToby Isaac { 1665b665b14eSToby Isaac PetscFunctionBegin; 1666b665b14eSToby Isaac PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n); 1667dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1668dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1669dff009beSToby Isaac 1670dff009beSToby Isaac if (h) { 1671dff009beSToby Isaac PetscEventPerfInfo *event_info; 1672dff009beSToby Isaac 1673dff009beSToby Isaac PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info)); 1674dff009beSToby Isaac if (event_info) event_info->errors[n] = error; 1675dff009beSToby Isaac } 1676b665b14eSToby Isaac } 1677b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1678b665b14eSToby Isaac } 1679b665b14eSToby Isaac 1680b665b14eSToby Isaac /*@C 16815c6c1daeSBarry Smith PetscLogEventGetId - Returns the event id when given the event name. 16825c6c1daeSBarry Smith 16835c6c1daeSBarry Smith Not Collective 16845c6c1daeSBarry Smith 16855c6c1daeSBarry Smith Input Parameter: 16865c6c1daeSBarry Smith . name - The event name 16875c6c1daeSBarry Smith 16885c6c1daeSBarry Smith Output Parameter: 1689c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists 16905c6c1daeSBarry Smith 16915c6c1daeSBarry Smith Level: intermediate 16925c6c1daeSBarry Smith 1693d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()` 16945c6c1daeSBarry Smith @*/ 1695d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event) 1696d71ae5a4SJacob Faibussowitsch { 1697b665b14eSToby Isaac PetscLogState state; 16985c6c1daeSBarry Smith 16995c6c1daeSBarry Smith PetscFunctionBegin; 1700b665b14eSToby Isaac *event = -1; 1701b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 1702b665b14eSToby Isaac if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event)); 17033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17045c6c1daeSBarry Smith } 17055c6c1daeSBarry Smith 170653e0a2f3SToby Isaac /*@C 170753e0a2f3SToby Isaac PetscLogEventGetName - Returns the event name when given the event id. 170853e0a2f3SToby Isaac 170953e0a2f3SToby Isaac Not Collective 171053e0a2f3SToby Isaac 171153e0a2f3SToby Isaac Input Parameter: 171253e0a2f3SToby Isaac . event - The event 171353e0a2f3SToby Isaac 171453e0a2f3SToby Isaac Output Parameter: 171553e0a2f3SToby Isaac . name - The event name 171653e0a2f3SToby Isaac 171753e0a2f3SToby Isaac Level: intermediate 171853e0a2f3SToby Isaac 171953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 172053e0a2f3SToby Isaac @*/ 172153e0a2f3SToby Isaac PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char **name) 172253e0a2f3SToby Isaac { 172353e0a2f3SToby Isaac PetscLogEventInfo event_info; 172453e0a2f3SToby Isaac PetscLogState state; 172553e0a2f3SToby Isaac 172653e0a2f3SToby Isaac PetscFunctionBegin; 1727b665b14eSToby Isaac *name = NULL; 172853e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 1729b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 173053e0a2f3SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &event_info)); 173153e0a2f3SToby Isaac *name = event_info.name; 173253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 173353e0a2f3SToby Isaac } 173453e0a2f3SToby Isaac 173553e0a2f3SToby Isaac /*@ 173653e0a2f3SToby 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. 173753e0a2f3SToby Isaac 173853e0a2f3SToby Isaac Not collective 173953e0a2f3SToby Isaac 174053e0a2f3SToby Isaac Level: advanced 174153e0a2f3SToby Isaac 174253e0a2f3SToby Isaac Notes: 174353e0a2f3SToby 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()`). 174453e0a2f3SToby Isaac 174553e0a2f3SToby Isaac Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function. 174653e0a2f3SToby Isaac 1747b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()` 174853e0a2f3SToby Isaac @*/ 174953e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void) 175053e0a2f3SToby Isaac { 175153e0a2f3SToby Isaac PetscFunctionBegin; 1752dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1753dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1754dff009beSToby Isaac 1755dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventsPause(h)); 1756dff009beSToby Isaac } 175753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 175853e0a2f3SToby Isaac } 175953e0a2f3SToby Isaac 176053e0a2f3SToby Isaac /*@ 176153e0a2f3SToby Isaac PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`. 176253e0a2f3SToby Isaac 176353e0a2f3SToby Isaac Not collective 176453e0a2f3SToby Isaac 176553e0a2f3SToby Isaac Level: advanced 176653e0a2f3SToby Isaac 1767b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()` 176853e0a2f3SToby Isaac @*/ 176953e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void) 177053e0a2f3SToby Isaac { 177153e0a2f3SToby Isaac PetscFunctionBegin; 1772dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 1773dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 1774dff009beSToby Isaac 1775dff009beSToby Isaac if (h) PetscCall(PetscLogHandlerEventsResume(h)); 1776dff009beSToby Isaac } 177753e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 177853e0a2f3SToby Isaac } 177953e0a2f3SToby Isaac 17801c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/ 17811c1ad86eSToby Isaac 17821c1ad86eSToby Isaac /*MC 17831c1ad86eSToby Isaac PetscLogObjectCreate - Log the creation of a `PetscObject` 17841c1ad86eSToby Isaac 17851c1ad86eSToby Isaac Synopsis: 17861c1ad86eSToby Isaac #include <petsclog.h> 17871c1ad86eSToby Isaac PetscErrorCode PetscLogObjectCreate(PetscObject h) 17881c1ad86eSToby Isaac 17891c1ad86eSToby Isaac Not Collective 17901c1ad86eSToby Isaac 17911c1ad86eSToby Isaac Input Parameters: 17921c1ad86eSToby Isaac . h - A `PetscObject` 17931c1ad86eSToby Isaac 17941c1ad86eSToby Isaac Level: developer 17951c1ad86eSToby Isaac 17961c1ad86eSToby Isaac Developer Note: 17971c1ad86eSToby Isaac Called internally by PETSc when creating objects: users do not need to call this directly. 1798b665b14eSToby Isaac Notification of the object creation is sent to each `PetscLogHandler` that is running. 17991c1ad86eSToby Isaac 1800b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()` 18011c1ad86eSToby Isaac M*/ 18021c1ad86eSToby Isaac 18031c1ad86eSToby Isaac /*MC 18041c1ad86eSToby Isaac PetscLogObjectDestroy - Logs the destruction of a `PetscObject` 18051c1ad86eSToby Isaac 18061c1ad86eSToby Isaac Synopsis: 18071c1ad86eSToby Isaac #include <petsclog.h> 18081c1ad86eSToby Isaac PetscErrorCode PetscLogObjectDestroy(PetscObject h) 18091c1ad86eSToby Isaac 18101c1ad86eSToby Isaac Not Collective 18111c1ad86eSToby Isaac 18121c1ad86eSToby Isaac Input Parameters: 18131c1ad86eSToby Isaac . h - A `PetscObject` 18141c1ad86eSToby Isaac 18151c1ad86eSToby Isaac Level: developer 18161c1ad86eSToby Isaac 18171c1ad86eSToby Isaac Developer Note: 18181c1ad86eSToby Isaac Called internally by PETSc when destroying objects: users do not need to call this directly. 1819b665b14eSToby Isaac Notification of the object creation is sent to each `PetscLogHandler` that is running. 18201c1ad86eSToby Isaac 1821b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()` 18221c1ad86eSToby Isaac M*/ 18231c1ad86eSToby Isaac 182453e0a2f3SToby Isaac /*@C 182553e0a2f3SToby Isaac PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name. 182653e0a2f3SToby Isaac 182753e0a2f3SToby Isaac Not Collective 182853e0a2f3SToby Isaac 182953e0a2f3SToby Isaac Input Parameter: 183053e0a2f3SToby Isaac . name - The class name 183153e0a2f3SToby Isaac 183253e0a2f3SToby Isaac Output Parameter: 183353e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists 183453e0a2f3SToby Isaac 183553e0a2f3SToby Isaac Level: intermediate 183653e0a2f3SToby Isaac 183753e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()` 183853e0a2f3SToby Isaac @*/ 183953e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid) 184053e0a2f3SToby Isaac { 184153e0a2f3SToby Isaac PetscLogClass log_class; 184253e0a2f3SToby Isaac PetscLogClassInfo class_info; 184353e0a2f3SToby Isaac PetscLogState state; 184453e0a2f3SToby Isaac 184553e0a2f3SToby Isaac PetscFunctionBegin; 1846b665b14eSToby Isaac *classid = -1; 184753e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 1848b665b14eSToby Isaac if (!state) PetscFunctionReturn(PETSC_SUCCESS); 184953e0a2f3SToby Isaac PetscCall(PetscLogStateGetClassFromName(state, name, &log_class)); 185053e0a2f3SToby Isaac if (log_class < 0) { 185153e0a2f3SToby Isaac *classid = -1; 185253e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 185353e0a2f3SToby Isaac } 185453e0a2f3SToby Isaac PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info)); 185553e0a2f3SToby Isaac *classid = class_info.classid; 185653e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 185753e0a2f3SToby Isaac } 185853e0a2f3SToby Isaac 185953e0a2f3SToby Isaac /*@C 186053e0a2f3SToby Isaac PetscLogClassIdGetName - Returns a `PetscClassId`'s name. 186153e0a2f3SToby Isaac 186253e0a2f3SToby Isaac Not Collective 186353e0a2f3SToby Isaac 186453e0a2f3SToby Isaac Input Parameter: 186553e0a2f3SToby Isaac . classid - A `PetscClassId` 186653e0a2f3SToby Isaac 186753e0a2f3SToby Isaac Output Parameter: 186853e0a2f3SToby Isaac . name - The class name 186953e0a2f3SToby Isaac 187053e0a2f3SToby Isaac Level: intermediate 187153e0a2f3SToby Isaac 187253e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()` 187353e0a2f3SToby Isaac @*/ 187453e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name) 187553e0a2f3SToby Isaac { 187653e0a2f3SToby Isaac PetscLogClass log_class; 187753e0a2f3SToby Isaac PetscLogClassInfo class_info; 187853e0a2f3SToby Isaac PetscLogState state; 187953e0a2f3SToby Isaac 188053e0a2f3SToby Isaac PetscFunctionBegin; 188153e0a2f3SToby Isaac PetscCall(PetscLogGetState(&state)); 188253e0a2f3SToby Isaac PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class)); 188353e0a2f3SToby Isaac PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info)); 188453e0a2f3SToby Isaac *name = class_info.name; 188553e0a2f3SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 188653e0a2f3SToby Isaac } 188753e0a2f3SToby Isaac 18885c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/ 18895c6c1daeSBarry Smith /*@C 18905c6c1daeSBarry Smith PetscLogDump - Dumps logs of objects to a file. This file is intended to 18915c6c1daeSBarry Smith be read by bin/petscview. This program no longer exists. 18925c6c1daeSBarry Smith 1893811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 18945c6c1daeSBarry Smith 18955c6c1daeSBarry Smith Input Parameter: 1896aec76313SJacob Faibussowitsch . sname - an optional file name 18975c6c1daeSBarry Smith 189810450e9eSJacob Faibussowitsch Example Usage: 18995c6c1daeSBarry Smith .vb 19005c6c1daeSBarry Smith PetscInitialize(...); 1901b665b14eSToby Isaac PetscLogDefaultBegin(); 1902b665b14eSToby Isaac // ... code ... 19035c6c1daeSBarry Smith PetscLogDump(filename); 19045c6c1daeSBarry Smith PetscFinalize(); 19055c6c1daeSBarry Smith .ve 19065c6c1daeSBarry Smith 1907d1f92df0SBarry Smith Level: advanced 1908d1f92df0SBarry Smith 1909811af0c4SBarry Smith Note: 191037fdd005SBarry Smith The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified, 19115c6c1daeSBarry Smith this file will be used. 19125c6c1daeSBarry Smith 1913b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()` 19145c6c1daeSBarry Smith @*/ 1915d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[]) 1916d71ae5a4SJacob Faibussowitsch { 1917b665b14eSToby Isaac PetscLogHandler handler; 19185c6c1daeSBarry Smith 19195c6c1daeSBarry Smith PetscFunctionBegin; 1920294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 1921dff009beSToby Isaac PetscCall(PetscLogHandlerDump(handler, sname)); 1922b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 19235c6c1daeSBarry Smith } 1924b665b14eSToby Isaac 1925b665b14eSToby Isaac /*@C 1926b665b14eSToby Isaac PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot. 1927b665b14eSToby Isaac 19288f14a041SBarry Smith Collective on `PETSC_COMM_WORLD` 1929b665b14eSToby Isaac 1930b665b14eSToby Isaac Input Parameter: 1931b665b14eSToby Isaac . sname - filename for the MPE logfile 1932b665b14eSToby Isaac 1933b665b14eSToby Isaac Level: advanced 1934b665b14eSToby Isaac 1935b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()` 1936b665b14eSToby Isaac @*/ 1937b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[]) 1938b665b14eSToby Isaac { 1939b665b14eSToby Isaac PetscFunctionBegin; 1940b665b14eSToby Isaac #if defined(PETSC_HAVE_MPE) 1941b665b14eSToby Isaac if (PetscBeganMPE) { 1942b665b14eSToby Isaac char name[PETSC_MAX_PATH_LEN]; 1943b665b14eSToby Isaac 1944b665b14eSToby Isaac PetscCall(PetscInfo(0, "Finalizing MPE.\n")); 1945b665b14eSToby Isaac if (sname) { 1946b665b14eSToby Isaac PetscCall(PetscStrncpy(name, sname, sizeof(name))); 19475c6c1daeSBarry Smith } else { 1948b665b14eSToby Isaac PetscCall(PetscGetProgramName(name, sizeof(name))); 19495c6c1daeSBarry Smith } 1950b665b14eSToby Isaac PetscCall(MPE_Finish_log(name)); 19515c6c1daeSBarry Smith } else { 1952b665b14eSToby Isaac PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n")); 19535c6c1daeSBarry Smith } 1954c2a741eeSJunchao Zhang #else 1955b665b14eSToby Isaac SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe"); 1956c2a741eeSJunchao Zhang #endif 19573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19585c6c1daeSBarry Smith } 19595c6c1daeSBarry Smith 19607d6c928cSSatish Balay /*@C 19617d6c928cSSatish Balay PetscLogView - Prints a summary of the logging. 19625c6c1daeSBarry Smith 19638f14a041SBarry Smith Collective 19645c6c1daeSBarry Smith 19655c6c1daeSBarry Smith Input Parameter: 1966f14045dbSBarry Smith . viewer - an ASCII viewer 19675c6c1daeSBarry Smith 19685c6c1daeSBarry Smith Options Database Keys: 1969bb1d7374SBarry Smith + -log_view [:filename] - Prints summary of log information 1970bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file 1971607d249eSBarry 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) 1972d0a29bd7SConnor 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) 1973156b51fbSBarry Smith . -log_view_memory - Also display memory usage in each event 1974156b51fbSBarry Smith . -log_view_gpu_time - Also display time in each event for GPU kernels (Note this may slow the computation) 1975811af0c4SBarry Smith . -log_all - Saves a file Log.rank for each MPI rank with details of each step of the computation 1976bb1d7374SBarry Smith - -log_trace [filename] - Displays a trace of what each process is doing 19775c6c1daeSBarry Smith 1978d1f92df0SBarry Smith Level: beginner 1979d1f92df0SBarry Smith 19805c6c1daeSBarry Smith Notes: 1981da81f932SPierre Jolivet It is possible to control the logging programmatically but we recommend using the options database approach whenever possible 19825c6c1daeSBarry Smith By default the summary is printed to stdout. 19835c6c1daeSBarry Smith 1984bb1d7374SBarry Smith Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin() 1985bb1d7374SBarry Smith 1986bb1d7374SBarry Smith If PETSc is configured with --with-logging=0 then this functionality is not available 1987bb1d7374SBarry Smith 1988607d249eSBarry Smith To view the nested XML format filename.xml first copy ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current 1989607d249eSBarry Smith directory then open filename.xml with your browser. Specific notes for certain browsers 19901d27aa22SBarry Smith .vb 19911d27aa22SBarry Smith Firefox and Internet explorer - simply open the file 19921d27aa22SBarry Smith Google Chrome - you must start up Chrome with the option --allow-file-access-from-files 19931d27aa22SBarry Smith Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access 19941d27aa22SBarry Smith .ve 19951d27aa22SBarry 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 1996607d249eSBarry Smith your browser. 19972add09c0SLisandro Dalcin Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser 19982add09c0SLisandro Dalcin window and render the XML log file contents. 1999607d249eSBarry Smith 2000bb1d7374SBarry Smith The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij MARITIME RESEARCH INSTITUTE NETHERLANDS 2001bb1d7374SBarry Smith 20021d27aa22SBarry Smith The Flame Graph output can be visualised using either the original Flame Graph script <https://github.com/brendangregg/FlameGraph> 20031d27aa22SBarry Smith or using speedscope <https://www.speedscope.app>. 2004d0a29bd7SConnor Ward Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py. 2005d0a29bd7SConnor Ward 2006d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()` 20075c6c1daeSBarry Smith @*/ 2008d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer) 2009d71ae5a4SJacob Faibussowitsch { 2010f14045dbSBarry Smith PetscBool isascii; 2011f14045dbSBarry Smith PetscViewerFormat format; 2012b665b14eSToby Isaac int stage; 2013b665b14eSToby Isaac PetscLogState state; 2014b665b14eSToby Isaac PetscIntStack temp_stack; 2015b665b14eSToby Isaac PetscLogHandler handler; 2016b665b14eSToby Isaac PetscBool is_empty; 20175c6c1daeSBarry Smith 20185c6c1daeSBarry Smith PetscFunctionBegin; 2019b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 202037b78d16SBarry Smith /* Pop off any stages the user forgot to remove */ 2021b665b14eSToby Isaac PetscCall(PetscIntStackCreate(&temp_stack)); 2022b665b14eSToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 202337b78d16SBarry Smith while (stage >= 0) { 2024b665b14eSToby Isaac PetscCall(PetscLogStagePop()); 2025b665b14eSToby Isaac PetscCall(PetscIntStackPush(temp_stack, stage)); 2026b665b14eSToby Isaac PetscCall(PetscLogStateGetCurrentStage(state, &stage)); 202737b78d16SBarry Smith } 20289566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 202928b400f6SJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII"); 20309566063dSJacob Faibussowitsch PetscCall(PetscViewerGetFormat(viewer, &format)); 2031b665b14eSToby Isaac if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 2032294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler)); 2033b665b14eSToby Isaac PetscCall(PetscLogHandlerView(handler, viewer)); 2034b665b14eSToby Isaac } else { 2035294de794SToby Isaac PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler)); 2036b665b14eSToby Isaac PetscCall(PetscLogHandlerView(handler, viewer)); 20375c6c1daeSBarry Smith } 2038b665b14eSToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &is_empty)); 2039b665b14eSToby Isaac while (!is_empty) { 2040b665b14eSToby Isaac PetscCall(PetscIntStackPop(temp_stack, &stage)); 2041b665b14eSToby Isaac PetscCall(PetscLogStagePush(stage)); 2042b665b14eSToby Isaac PetscCall(PetscIntStackEmpty(temp_stack, &is_empty)); 2043b665b14eSToby Isaac } 2044b665b14eSToby Isaac PetscCall(PetscIntStackDestroy(temp_stack)); 20453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20465c6c1daeSBarry Smith } 20475c6c1daeSBarry Smith 2048f14045dbSBarry Smith /*@C 2049811af0c4SBarry Smith PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed. 2050f14045dbSBarry Smith 2051811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD` 2052f14045dbSBarry Smith 2053811af0c4SBarry Smith Level: developer 2054f14045dbSBarry Smith 2055d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()` 2056f14045dbSBarry Smith @*/ 2057d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void) 2058d71ae5a4SJacob Faibussowitsch { 2059ad2e3d55SToby Isaac PetscInt n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX; 2060ad2e3d55SToby Isaac PetscViewer viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX]; 2061ad2e3d55SToby Isaac PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX]; 2062f14045dbSBarry Smith PetscBool flg; 2063f14045dbSBarry Smith 2064f14045dbSBarry Smith PetscFunctionBegin; 2065ad2e3d55SToby Isaac PetscCall(PetscOptionsGetViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg)); 2066ad2e3d55SToby Isaac for (PetscInt i = 0; i < n_max; i++) { 2067ad2e3d55SToby Isaac PetscCall(PetscViewerPushFormat(viewers[i], formats[i])); 2068ad2e3d55SToby Isaac PetscCall(PetscLogView(viewers[i])); 2069ad2e3d55SToby Isaac PetscCall(PetscViewerPopFormat(viewers[i])); 2070f4f49eeaSPierre Jolivet PetscCall(PetscOptionsRestoreViewer(&viewers[i])); 2071f14045dbSBarry Smith } 20723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2073f14045dbSBarry Smith } 2074f14045dbSBarry Smith 2075b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *); 2076b665b14eSToby Isaac 2077b665b14eSToby Isaac /*@ 2078b665b14eSToby Isaac PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event 2079b665b14eSToby Isaac that takes 1 or more percent of the time. 2080b665b14eSToby Isaac 20818f14a041SBarry Smith Logically Collective on `PETSC_COMM_WORLD` 2082b665b14eSToby Isaac 2083b665b14eSToby Isaac Input Parameter: 2084b665b14eSToby Isaac . newThresh - the threshold to use 2085b665b14eSToby Isaac 2086b665b14eSToby Isaac Output Parameter: 2087b665b14eSToby Isaac . oldThresh - the previously set threshold value 2088b665b14eSToby Isaac 2089b665b14eSToby Isaac Options Database Keys: 2090b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file 2091b665b14eSToby Isaac 2092b665b14eSToby Isaac Example Usage: 2093b665b14eSToby Isaac .vb 2094b665b14eSToby Isaac PetscInitialize(...); 2095b665b14eSToby Isaac PetscLogNestedBegin(); 2096b665b14eSToby Isaac PetscLogSetThreshold(0.1,&oldthresh); 2097b665b14eSToby Isaac // ... code ... 2098b665b14eSToby Isaac PetscLogView(viewer); 2099b665b14eSToby Isaac PetscFinalize(); 2100b665b14eSToby Isaac .ve 2101b665b14eSToby Isaac 2102b665b14eSToby Isaac Level: advanced 2103b665b14eSToby Isaac 2104b665b14eSToby Isaac Note: 2105b665b14eSToby Isaac This threshold is only used by the nested log handler 2106b665b14eSToby Isaac 2107b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`, 2108b665b14eSToby Isaac `PetscLogNestedBegin()` 2109b665b14eSToby Isaac @*/ 2110b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh) 2111b665b14eSToby Isaac { 2112b665b14eSToby Isaac PetscLogHandler handler; 2113b665b14eSToby Isaac 2114b665b14eSToby Isaac PetscFunctionBegin; 2115294de794SToby Isaac PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler)); 2116b665b14eSToby Isaac PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh)); 2117b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2118b665b14eSToby Isaac } 2119b665b14eSToby Isaac 21205c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/ 21215c6c1daeSBarry Smith /*@C 21225c6c1daeSBarry Smith PetscGetFlops - Returns the number of flops used on this processor 21235c6c1daeSBarry Smith since the program began. 21245c6c1daeSBarry Smith 21255c6c1daeSBarry Smith Not Collective 21265c6c1daeSBarry Smith 21275c6c1daeSBarry Smith Output Parameter: 212810450e9eSJacob Faibussowitsch . flops - number of floating point operations 21295c6c1daeSBarry Smith 2130d1f92df0SBarry Smith Level: intermediate 2131d1f92df0SBarry Smith 21325c6c1daeSBarry Smith Notes: 21335c6c1daeSBarry Smith A global counter logs all PETSc flop counts. The user can use 2134811af0c4SBarry Smith `PetscLogFlops()` to increment this counter to include flops for the 21355c6c1daeSBarry Smith application code. 21365c6c1daeSBarry Smith 21374b7c4d4dSPierre Jolivet A separate counter `PetscLogGpuFlops()` logs the flops that occur on any GPU associated with this MPI rank 2138811af0c4SBarry Smith 21394b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscTime()`, `PetscLogFlops()` 21405c6c1daeSBarry Smith @*/ 2141d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops) 2142d71ae5a4SJacob Faibussowitsch { 21435c6c1daeSBarry Smith PetscFunctionBegin; 21445c6c1daeSBarry Smith *flops = petsc_TotalFlops; 21453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21465c6c1daeSBarry Smith } 21475c6c1daeSBarry Smith 21481c1ad86eSToby Isaac /*@C 21491c1ad86eSToby Isaac PetscLogObjectState - Record information about an object with the default log handler 21501c1ad86eSToby Isaac 21511c1ad86eSToby Isaac Not Collective 21521c1ad86eSToby Isaac 21531c1ad86eSToby Isaac Input Parameters: 21541c1ad86eSToby Isaac + obj - the `PetscObject` 21551c1ad86eSToby Isaac . format - a printf-style format string 21561c1ad86eSToby Isaac - ... - printf arguments to format 21571c1ad86eSToby Isaac 21581c1ad86eSToby Isaac Level: developer 21591c1ad86eSToby Isaac 2160b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()` 21611c1ad86eSToby Isaac @*/ 2162d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 2163d71ae5a4SJacob Faibussowitsch { 21645c6c1daeSBarry Smith PetscFunctionBegin; 2165dff009beSToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 2166dff009beSToby Isaac PetscLogHandler h = PetscLogHandlers[i].handler; 2167dff009beSToby Isaac 2168dff009beSToby Isaac if (h) { 2169dff009beSToby Isaac va_list Argp; 21705c6c1daeSBarry Smith va_start(Argp, format); 2171dff009beSToby Isaac PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp)); 21725c6c1daeSBarry Smith va_end(Argp); 2173b665b14eSToby Isaac } 2174dff009beSToby Isaac } 21753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21765c6c1daeSBarry Smith } 21775c6c1daeSBarry Smith 21785c6c1daeSBarry Smith /*MC 21795c6c1daeSBarry Smith PetscLogFlops - Adds floating point operations to the global counter. 21805c6c1daeSBarry Smith 21815c6c1daeSBarry Smith Synopsis: 2182aaa7dc30SBarry Smith #include <petsclog.h> 21835c6c1daeSBarry Smith PetscErrorCode PetscLogFlops(PetscLogDouble f) 21845c6c1daeSBarry Smith 21855c6c1daeSBarry Smith Not Collective 21865c6c1daeSBarry Smith 21875c6c1daeSBarry Smith Input Parameter: 21885c6c1daeSBarry Smith . f - flop counter 21895c6c1daeSBarry Smith 219010450e9eSJacob Faibussowitsch Example Usage: 21915c6c1daeSBarry Smith .vb 21925c6c1daeSBarry Smith PetscLogEvent USER_EVENT; 219310450e9eSJacob Faibussowitsch 21945c6c1daeSBarry Smith PetscLogEventRegister("User event", 0, &USER_EVENT); 21955c6c1daeSBarry Smith PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0); 21965c6c1daeSBarry Smith [code segment to monitor] 21975c6c1daeSBarry Smith PetscLogFlops(user_flops) 21985c6c1daeSBarry Smith PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0); 21995c6c1daeSBarry Smith .ve 22005c6c1daeSBarry Smith 2201d1f92df0SBarry Smith Level: intermediate 2202d1f92df0SBarry Smith 2203811af0c4SBarry Smith Note: 220410450e9eSJacob Faibussowitsch A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment 220510450e9eSJacob Faibussowitsch this counter to include flops for the application code. 22065c6c1daeSBarry Smith 22074b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()` 22085c6c1daeSBarry Smith M*/ 22095c6c1daeSBarry Smith 22105c6c1daeSBarry Smith /*MC 221110450e9eSJacob Faibussowitsch PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate 221210450e9eSJacob Faibussowitsch timings 22135c6c1daeSBarry Smith 22145c6c1daeSBarry Smith Synopsis: 2215aaa7dc30SBarry Smith #include <petsclog.h> 22165c6c1daeSBarry Smith void PetscPreLoadBegin(PetscBool flag, char *name); 22175c6c1daeSBarry Smith 22185c6c1daeSBarry Smith Not Collective 22195c6c1daeSBarry Smith 2220d8d19677SJose E. Roman Input Parameters: 222110450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command 222210450e9eSJacob Faibussowitsch line option `-preload true|false` 222310450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded 22245c6c1daeSBarry Smith 222510450e9eSJacob Faibussowitsch Example Usage: 22265c6c1daeSBarry Smith .vb 222710450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE, "first stage"); 222810450e9eSJacob Faibussowitsch // lines of code 22295c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 223010450e9eSJacob Faibussowitsch // lines of code 22315c6c1daeSBarry Smith PetscPreLoadEnd(); 22325c6c1daeSBarry Smith .ve 22335c6c1daeSBarry Smith 2234d1f92df0SBarry Smith Level: intermediate 2235d1f92df0SBarry Smith 2236811af0c4SBarry Smith Note: 223795452b02SPatrick Sanan Only works in C/C++, not Fortran 22385c6c1daeSBarry Smith 223910450e9eSJacob Faibussowitsch Flags available within the macro\: 224010450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading 224110450e9eSJacob Faibussowitsch . PetscPreLoadingOn - `PETSC_TRUE` if it is CURRENTLY doing preload 224210450e9eSJacob Faibussowitsch . PetscPreLoadIt - `0` for the first computation (with preloading turned off it is only 224310450e9eSJacob Faibussowitsch `0`) `1` for the second 224410450e9eSJacob Faibussowitsch - PetscPreLoadMax - number of times it will do the computation, only one when preloading is 224510450e9eSJacob Faibussowitsch turned on 224610450e9eSJacob Faibussowitsch 224710450e9eSJacob Faibussowitsch The first two variables are available throughout the program, the second two only between the 224810450e9eSJacob Faibussowitsch `PetscPreLoadBegin()` and `PetscPreLoadEnd()` 22495c6c1daeSBarry Smith 2250d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()` 22515c6c1daeSBarry Smith M*/ 22525c6c1daeSBarry Smith 22535c6c1daeSBarry Smith /*MC 225410450e9eSJacob Faibussowitsch PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate 225510450e9eSJacob Faibussowitsch timings 22565c6c1daeSBarry Smith 22575c6c1daeSBarry Smith Synopsis: 2258aaa7dc30SBarry Smith #include <petsclog.h> 22595c6c1daeSBarry Smith void PetscPreLoadEnd(void); 22605c6c1daeSBarry Smith 22615c6c1daeSBarry Smith Not Collective 22625c6c1daeSBarry Smith 226310450e9eSJacob Faibussowitsch Example Usage: 22645c6c1daeSBarry Smith .vb 226510450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE, "first stage"); 226610450e9eSJacob Faibussowitsch // lines of code 22675c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 226810450e9eSJacob Faibussowitsch // lines of code 22695c6c1daeSBarry Smith PetscPreLoadEnd(); 22705c6c1daeSBarry Smith .ve 22715c6c1daeSBarry Smith 2272d1f92df0SBarry Smith Level: intermediate 2273d1f92df0SBarry Smith 2274811af0c4SBarry Smith Note: 2275dd01b7e5SBarry Smith Only works in C/C++ not Fortran 22765c6c1daeSBarry Smith 2277d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()` 22785c6c1daeSBarry Smith M*/ 22795c6c1daeSBarry Smith 22805c6c1daeSBarry Smith /*MC 228110450e9eSJacob Faibussowitsch PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings 22825c6c1daeSBarry Smith 22835c6c1daeSBarry Smith Synopsis: 2284aaa7dc30SBarry Smith #include <petsclog.h> 22855c6c1daeSBarry Smith void PetscPreLoadStage(char *name); 22865c6c1daeSBarry Smith 22875c6c1daeSBarry Smith Not Collective 22885c6c1daeSBarry Smith 228910450e9eSJacob Faibussowitsch Example Usage: 22905c6c1daeSBarry Smith .vb 229110450e9eSJacob Faibussowitsch PetscPreLoadBegin(PETSC_TRUE,"first stage"); 229210450e9eSJacob Faibussowitsch // lines of code 22935c6c1daeSBarry Smith PetscPreLoadStage("second stage"); 229410450e9eSJacob Faibussowitsch // lines of code 22955c6c1daeSBarry Smith PetscPreLoadEnd(); 22965c6c1daeSBarry Smith .ve 22975c6c1daeSBarry Smith 2298d1f92df0SBarry Smith Level: intermediate 2299d1f92df0SBarry Smith 2300811af0c4SBarry Smith Note: 2301dd01b7e5SBarry Smith Only works in C/C++ not Fortran 23025c6c1daeSBarry Smith 2303d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()` 23045c6c1daeSBarry Smith M*/ 23055c6c1daeSBarry Smith 2306a4af0ceeSJacob Faibussowitsch #if PetscDefined(HAVE_DEVICE) 2307a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h> 23089ffd0706SHong Zhang 2309156b51fbSBarry Smith /*@C 2310156b51fbSBarry Smith PetscLogGpuTime - turn on the logging of GPU time for GPU kernels 2311156b51fbSBarry Smith 2312811af0c4SBarry Smith Options Database Key: 2313efa05fe8SBarry Smith . -log_view_gpu_time - provide the GPU times for all events in the `-log_view` output 2314156b51fbSBarry Smith 2315d1f92df0SBarry Smith Level: advanced 2316d1f92df0SBarry Smith 2317156b51fbSBarry Smith Notes: 231810450e9eSJacob Faibussowitsch Turning on the timing of the GPU kernels can slow down the entire computation and should only 2319efa05fe8SBarry Smith be used when studying the performance of individual operations on GPU such as vector operations and 232010450e9eSJacob Faibussowitsch matrix-vector operations. 2321156b51fbSBarry Smith 2322efa05fe8SBarry Smith If this option is not used then times for most of the events in the `-log_view` output will be listed as Nan, indicating the times are not available 2323efa05fe8SBarry Smith 232410450e9eSJacob Faibussowitsch This routine should only be called once near the beginning of the program. Once it is started 232510450e9eSJacob Faibussowitsch it cannot be turned off. 2326156b51fbSBarry Smith 2327d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()` 2328156b51fbSBarry Smith @*/ 2329d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void) 2330d71ae5a4SJacob Faibussowitsch { 2331473903fcSJunchao Zhang PetscFunctionBegin; 2332473903fcSJunchao Zhang PetscCheck(petsc_gtime == 0.0, PETSC_COMM_SELF, PETSC_ERR_SUP, "GPU logging has already been turned on"); 2333156b51fbSBarry Smith PetscLogGpuTimeFlag = PETSC_TRUE; 2334473903fcSJunchao Zhang PetscFunctionReturn(PETSC_SUCCESS); 2335156b51fbSBarry Smith } 2336156b51fbSBarry Smith 23379ffd0706SHong Zhang /*@C 23389ffd0706SHong Zhang PetscLogGpuTimeBegin - Start timer for device 23399ffd0706SHong Zhang 2340d1f92df0SBarry Smith Level: intermediate 2341d1f92df0SBarry Smith 23429ffd0706SHong Zhang Notes: 2343*7d766218SJunchao Zhang When GPU is enabled, the timer is run on the GPU, it is a separate logging of time 234410450e9eSJacob Faibussowitsch devoted to GPU computations (excluding kernel launch times). 2345811af0c4SBarry Smith 2346*7d766218SJunchao Zhang When GPU is not available, the timer is run on the CPU, it is a separate logging of 234710450e9eSJacob Faibussowitsch time devoted to GPU computations (including kernel launch times). 2348811af0c4SBarry Smith 234910450e9eSJacob Faibussowitsch There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and 235010450e9eSJacob Faibussowitsch `PetscLogGpuTimeEnd()` 2351811af0c4SBarry Smith 235210450e9eSJacob Faibussowitsch This timer should NOT include times for data transfers between the GPU and CPU, nor setup 235310450e9eSJacob Faibussowitsch actions such as allocating space. 2354811af0c4SBarry Smith 235510450e9eSJacob Faibussowitsch The regular logging captures the time for data transfers and any CPU activities during the 235610450e9eSJacob Faibussowitsch event. It is used to compute the flop rate on the GPU as it is actively engaged in running a 235710450e9eSJacob Faibussowitsch kernel. 23589ffd0706SHong Zhang 23599ffd0706SHong Zhang Developer Notes: 236010450e9eSJacob Faibussowitsch The GPU event timer captures the execution time of all the kernels launched in the default 236110450e9eSJacob Faibussowitsch stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`. 2362811af0c4SBarry Smith 236310450e9eSJacob Faibussowitsch `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the 236410450e9eSJacob Faibussowitsch default stream (stream 0). The device will record a time stamp for the event when it reaches 236510450e9eSJacob Faibussowitsch that event in the stream. The function xxxEventSynchronize() is called in 236610450e9eSJacob Faibussowitsch `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the 236710450e9eSJacob Faibussowitsch timer event is recorded. 23689ffd0706SHong Zhang 2369d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()` 23709ffd0706SHong Zhang @*/ 2371d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void) 2372d71ae5a4SJacob Faibussowitsch { 2373b665b14eSToby Isaac PetscBool isActive; 2374b665b14eSToby Isaac 23759ffd0706SHong Zhang PetscFunctionBegin; 2376b665b14eSToby Isaac PetscCall(PetscLogEventBeginIsActive(&isActive)); 2377b665b14eSToby Isaac if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS); 2378*7d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU) 2379*7d766218SJunchao Zhang { 2380a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 2381a4af0ceeSJacob Faibussowitsch 23829566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 23839566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextBeginTimer_Internal(dctx)); 2384a4af0ceeSJacob Faibussowitsch } 2385*7d766218SJunchao Zhang #else 2386*7d766218SJunchao Zhang PetscCall(PetscTimeSubtract(&petsc_gtime)); 2387*7d766218SJunchao Zhang #endif 23883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23899ffd0706SHong Zhang } 23909ffd0706SHong Zhang 23919ffd0706SHong Zhang /*@C 23929ffd0706SHong Zhang PetscLogGpuTimeEnd - Stop timer for device 23939ffd0706SHong Zhang 23949ffd0706SHong Zhang Level: intermediate 23959ffd0706SHong Zhang 2396d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()` 23979ffd0706SHong Zhang @*/ 2398d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void) 2399d71ae5a4SJacob Faibussowitsch { 2400b665b14eSToby Isaac PetscBool isActive; 2401b665b14eSToby Isaac 24029ffd0706SHong Zhang PetscFunctionBegin; 2403b665b14eSToby Isaac PetscCall(PetscLogEventEndIsActive(&isActive)); 2404b665b14eSToby Isaac if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS); 2405*7d766218SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU) 2406*7d766218SJunchao Zhang { 2407a4af0ceeSJacob Faibussowitsch PetscDeviceContext dctx; 2408a4af0ceeSJacob Faibussowitsch PetscLogDouble elapsed; 2409a4af0ceeSJacob Faibussowitsch 24109566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextGetCurrentContext(&dctx)); 24119566063dSJacob Faibussowitsch PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed)); 2412a4af0ceeSJacob Faibussowitsch petsc_gtime += (elapsed / 1000.0); 2413a4af0ceeSJacob Faibussowitsch } 2414*7d766218SJunchao Zhang #else 2415*7d766218SJunchao Zhang PetscCall(PetscTimeAdd(&petsc_gtime)); 2416*7d766218SJunchao Zhang #endif 24173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 24189ffd0706SHong Zhang } 2419c708d6e3SStefano Zampini 24209ffd0706SHong Zhang #endif /* end of PETSC_HAVE_DEVICE */ 24219ffd0706SHong Zhang 2422cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/ 2423cb9ef012SToby Isaac 2424dd01b7e5SBarry Smith /* -- Utility functions for logging from Fortran -- */ 2425b665b14eSToby Isaac 2426b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype) 2427b665b14eSToby Isaac { 2428b665b14eSToby Isaac PetscFunctionBegin; 2429cb9ef012SToby Isaac #if PetscDefined(USE_LOG) 2430b665b14eSToby Isaac PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1)); 2431b665b14eSToby Isaac #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 2432b665b14eSToby Isaac PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th)); 2433b665b14eSToby Isaac #endif 2434cb9ef012SToby Isaac #endif 2435b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2436b665b14eSToby Isaac } 2437b665b14eSToby Isaac 2438b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype) 2439b665b14eSToby Isaac { 2440b665b14eSToby Isaac PetscFunctionBegin; 2441cb9ef012SToby Isaac #if PetscDefined(USE_LOG) 2442b665b14eSToby Isaac PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1)); 2443b665b14eSToby Isaac #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) 2444b665b14eSToby Isaac PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th)); 2445b665b14eSToby Isaac #endif 2446cb9ef012SToby Isaac #endif 2447b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2448b665b14eSToby Isaac } 2449b665b14eSToby Isaac 2450b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void) 2451b665b14eSToby Isaac { 2452b665b14eSToby Isaac PetscFunctionBegin; 2453cb9ef012SToby Isaac if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1)); 2454b665b14eSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2455b665b14eSToby Isaac } 2456b665b14eSToby Isaac 24575c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 24585c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID = 0; 24595c6c1daeSBarry Smith 24602611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE; 24612611ad71SToby Isaac 24622611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void) 24632611ad71SToby Isaac { 24642611ad71SToby Isaac int stage; 24652611ad71SToby Isaac 24662611ad71SToby Isaac PetscFunctionBegin; 24672611ad71SToby Isaac if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS); 24682611ad71SToby Isaac PetscLogInitializeCalled = PETSC_TRUE; 24692611ad71SToby Isaac if (PetscDefined(USE_LOG)) { 24702611ad71SToby Isaac /* Setup default logging structures */ 24712611ad71SToby Isaac PetscCall(PetscLogStateCreate(&petsc_log_state)); 24722611ad71SToby Isaac for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) { 24732611ad71SToby Isaac if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state)); 24742611ad71SToby Isaac } 24752611ad71SToby Isaac PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage)); 24762611ad71SToby Isaac PetscCall(PetscSpinlockCreate(&PetscLogSpinLock)); 24772611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY) 24782611ad71SToby Isaac petsc_log_tid = 0; 24792611ad71SToby Isaac petsc_log_gid = 0; 24802611ad71SToby Isaac #endif 24812611ad71SToby Isaac 24822611ad71SToby Isaac /* All processors sync here for more consistent logging */ 24832611ad71SToby Isaac PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 24842611ad71SToby Isaac PetscCall(PetscTime(&petsc_BaseTime)); 24852611ad71SToby Isaac PetscCall(PetscLogStagePush(stage)); 24862611ad71SToby Isaac } 24872611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 24882611ad71SToby Isaac } 24892611ad71SToby Isaac 24902611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void) 24912611ad71SToby Isaac { 24922611ad71SToby Isaac PetscFunctionBegin; 24932611ad71SToby Isaac if (PetscDefined(USE_LOG)) { 2494b665b14eSToby Isaac /* Resetting phase */ 2495b665b14eSToby Isaac // pop remaining stages 2496b665b14eSToby Isaac if (petsc_log_state) { 2497b665b14eSToby Isaac while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); } 2498b665b14eSToby Isaac } 24992611ad71SToby Isaac for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler)); 25002611ad71SToby Isaac PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX)); 25012611ad71SToby Isaac PetscCall(PetscLogStateDestroy(&petsc_log_state)); 25022611ad71SToby Isaac 25032611ad71SToby Isaac petsc_TotalFlops = 0.0; 25042611ad71SToby Isaac petsc_BaseTime = 0.0; 25052611ad71SToby Isaac petsc_TotalFlops = 0.0; 25062611ad71SToby Isaac petsc_send_ct = 0.0; 25072611ad71SToby Isaac petsc_recv_ct = 0.0; 25082611ad71SToby Isaac petsc_send_len = 0.0; 25092611ad71SToby Isaac petsc_recv_len = 0.0; 25102611ad71SToby Isaac petsc_isend_ct = 0.0; 25112611ad71SToby Isaac petsc_irecv_ct = 0.0; 25122611ad71SToby Isaac petsc_isend_len = 0.0; 25132611ad71SToby Isaac petsc_irecv_len = 0.0; 25142611ad71SToby Isaac petsc_wait_ct = 0.0; 25152611ad71SToby Isaac petsc_wait_any_ct = 0.0; 25162611ad71SToby Isaac petsc_wait_all_ct = 0.0; 25172611ad71SToby Isaac petsc_sum_of_waits_ct = 0.0; 25182611ad71SToby Isaac petsc_allreduce_ct = 0.0; 25192611ad71SToby Isaac petsc_gather_ct = 0.0; 25202611ad71SToby Isaac petsc_scatter_ct = 0.0; 25212611ad71SToby Isaac petsc_TotalFlops_th = 0.0; 25222611ad71SToby Isaac petsc_send_ct_th = 0.0; 25232611ad71SToby Isaac petsc_recv_ct_th = 0.0; 25242611ad71SToby Isaac petsc_send_len_th = 0.0; 25252611ad71SToby Isaac petsc_recv_len_th = 0.0; 25262611ad71SToby Isaac petsc_isend_ct_th = 0.0; 25272611ad71SToby Isaac petsc_irecv_ct_th = 0.0; 25282611ad71SToby Isaac petsc_isend_len_th = 0.0; 25292611ad71SToby Isaac petsc_irecv_len_th = 0.0; 25302611ad71SToby Isaac petsc_wait_ct_th = 0.0; 25312611ad71SToby Isaac petsc_wait_any_ct_th = 0.0; 25322611ad71SToby Isaac petsc_wait_all_ct_th = 0.0; 25332611ad71SToby Isaac petsc_sum_of_waits_ct_th = 0.0; 25342611ad71SToby Isaac petsc_allreduce_ct_th = 0.0; 25352611ad71SToby Isaac petsc_gather_ct_th = 0.0; 25362611ad71SToby Isaac petsc_scatter_ct_th = 0.0; 25372611ad71SToby Isaac 25382611ad71SToby Isaac petsc_ctog_ct = 0.0; 25392611ad71SToby Isaac petsc_gtoc_ct = 0.0; 25402611ad71SToby Isaac petsc_ctog_sz = 0.0; 25412611ad71SToby Isaac petsc_gtoc_sz = 0.0; 25422611ad71SToby Isaac petsc_gflops = 0.0; 25432611ad71SToby Isaac petsc_gtime = 0.0; 25442611ad71SToby Isaac petsc_ctog_ct_th = 0.0; 25452611ad71SToby Isaac petsc_gtoc_ct_th = 0.0; 25462611ad71SToby Isaac petsc_ctog_sz_th = 0.0; 25472611ad71SToby Isaac petsc_gtoc_sz_th = 0.0; 25482611ad71SToby Isaac petsc_gflops_th = 0.0; 25492611ad71SToby Isaac petsc_gtime_th = 0.0; 25502611ad71SToby Isaac } 25512611ad71SToby Isaac PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 25522611ad71SToby Isaac PETSC_OBJECT_CLASSID = 0; 25532611ad71SToby Isaac PetscLogInitializeCalled = PETSC_FALSE; 25542611ad71SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 25552611ad71SToby Isaac } 25562611ad71SToby Isaac 25575c6c1daeSBarry Smith /*@C 25585c6c1daeSBarry Smith PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code. 25595c6c1daeSBarry Smith 25605c6c1daeSBarry Smith Not Collective 25615c6c1daeSBarry Smith 25625c6c1daeSBarry Smith Input Parameter: 25635c6c1daeSBarry Smith . name - The class name 25645c6c1daeSBarry Smith 25655c6c1daeSBarry Smith Output Parameter: 25665c6c1daeSBarry Smith . oclass - The class id or classid 25675c6c1daeSBarry Smith 25685c6c1daeSBarry Smith Level: developer 25695c6c1daeSBarry Smith 2570d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()` 25715c6c1daeSBarry Smith @*/ 2572d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass) 2573d71ae5a4SJacob Faibussowitsch { 25745c6c1daeSBarry Smith PetscFunctionBegin; 25755c6c1daeSBarry Smith *oclass = ++PETSC_LARGEST_CLASSID; 25765c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 2577b665b14eSToby Isaac { 2578b665b14eSToby Isaac PetscLogState state; 2579b665b14eSToby Isaac PetscLogClass logclass; 2580b665b14eSToby Isaac 2581b665b14eSToby Isaac PetscCall(PetscLogGetState(&state)); 2582b665b14eSToby Isaac if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass)); 2583b665b14eSToby Isaac } 25845c6c1daeSBarry Smith #endif 25853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25865c6c1daeSBarry Smith } 2587