xref: /petsc/src/sys/logging/handler/impls/nvtx/lognvtx.c (revision 586b72174521427559d8855856d614fb70566f6f)
161cc7448SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/
261cc7448SToby Isaac #include <petsc/private/loghandlerimpl.h>
361cc7448SToby Isaac #include <petscdevice.h>
4*cb359cd4SJunchao Zhang #if PETSC_PKG_CUDA_VERSION_GE(10, 0, 0)
5*cb359cd4SJunchao Zhang   #include <nvtx3/nvToolsExt.h>
6*cb359cd4SJunchao Zhang #else
761cc7448SToby Isaac   #include <nvToolsExt.h>
8*cb359cd4SJunchao Zhang #endif
961cc7448SToby Isaac 
PetscLogHandlerEventBegin_NVTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)1061cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
1161cc7448SToby Isaac {
1261cc7448SToby Isaac   PetscLogState     state;
1361cc7448SToby Isaac   PetscLogEventInfo info;
1461cc7448SToby Isaac 
1561cc7448SToby Isaac   PetscFunctionBegin;
1661cc7448SToby Isaac   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
1761cc7448SToby Isaac     PetscCall(PetscLogHandlerGetState(handler, &state));
1861cc7448SToby Isaac     PetscCall(PetscLogStateEventGetInfo(state, event, &info));
1961cc7448SToby Isaac     (void)nvtxRangePushA(info.name);
2061cc7448SToby Isaac   }
2161cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2261cc7448SToby Isaac }
2361cc7448SToby Isaac 
PetscLogHandlerEventEnd_NVTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)2461cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
2561cc7448SToby Isaac {
2661cc7448SToby Isaac   PetscFunctionBegin;
2761cc7448SToby Isaac   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) (void)nvtxRangePop();
2861cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2961cc7448SToby Isaac }
3061cc7448SToby Isaac 
3161cc7448SToby Isaac /*MC
3261cc7448SToby Isaac   PETSCLOGHANDLERNVTX - PETSCLOGHANDLERNVTX = "nvtx" -  A
3361cc7448SToby Isaac   `PetscLogHandler` that creates an NVTX range (which appears in Nvidia Nsight
3461cc7448SToby Isaac   profiling) for each PETSc event.
3561cc7448SToby Isaac 
3661cc7448SToby Isaac   Options Database Keys:
3761cc7448SToby Isaac + -log_nvtx   - start an nvtx log handler manually
3861cc7448SToby Isaac - -log_nvtx 0 - stop the nvtx log handler from starting automatically in `PetscInitialize()` in a program run within an nsys profiling session (see Note)
3961cc7448SToby Isaac 
4061cc7448SToby Isaac   Level: developer
4161cc7448SToby Isaac 
4261cc7448SToby Isaac   Note:
4361cc7448SToby Isaac   If `PetscInitialize()` detects the environment variable `NSYS_PROFILING_SESSION_ID` (which is defined by `nsys
4461cc7448SToby Isaac   profile`) or `NVPROF_ID` (which is defined by `nvprof`) an instance of this log handler will automatically be
4561cc7448SToby Isaac   started.
4661cc7448SToby Isaac 
4761cc7448SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`
4861cc7448SToby Isaac M*/
4961cc7448SToby Isaac 
PetscLogHandlerCreate_NVTX(PetscLogHandler handler)5061cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler handler)
5161cc7448SToby Isaac {
5261cc7448SToby Isaac   PetscFunctionBegin;
5361cc7448SToby Isaac   handler->ops->eventbegin = PetscLogHandlerEventBegin_NVTX;
5461cc7448SToby Isaac   handler->ops->eventend   = PetscLogHandlerEventEnd_NVTX;
5561cc7448SToby Isaac   PetscCall(PetscInfo(handler, "nvtx log handler created\n"));
5661cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
5761cc7448SToby Isaac }
58