xref: /petsc/src/sys/logging/handler/impls/nvtx/lognvtx.c (revision 61cc744836451fb4d1d6f02ab6992be430960ed1)
1*61cc7448SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/
2*61cc7448SToby Isaac #include <petsc/private/loghandlerimpl.h>
3*61cc7448SToby Isaac #include <petscdevice.h>
4*61cc7448SToby Isaac #include <nvToolsExt.h>
5*61cc7448SToby Isaac 
6*61cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
7*61cc7448SToby Isaac {
8*61cc7448SToby Isaac   PetscLogState     state;
9*61cc7448SToby Isaac   PetscLogEventInfo info;
10*61cc7448SToby Isaac 
11*61cc7448SToby Isaac   PetscFunctionBegin;
12*61cc7448SToby Isaac   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {
13*61cc7448SToby Isaac     PetscCall(PetscLogHandlerGetState(handler, &state));
14*61cc7448SToby Isaac     PetscCall(PetscLogStateEventGetInfo(state, event, &info));
15*61cc7448SToby Isaac     (void)nvtxRangePushA(info.name);
16*61cc7448SToby Isaac   }
17*61cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
18*61cc7448SToby Isaac }
19*61cc7448SToby Isaac 
20*61cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
21*61cc7448SToby Isaac {
22*61cc7448SToby Isaac   PetscFunctionBegin;
23*61cc7448SToby Isaac   if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) (void)nvtxRangePop();
24*61cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25*61cc7448SToby Isaac }
26*61cc7448SToby Isaac 
27*61cc7448SToby Isaac /*MC
28*61cc7448SToby Isaac   PETSCLOGHANDLERNVTX - PETSCLOGHANDLERNVTX = "nvtx" -  A
29*61cc7448SToby Isaac   `PetscLogHandler` that creates an NVTX range (which appears in Nvidia Nsight
30*61cc7448SToby Isaac   profiling) for each PETSc event.
31*61cc7448SToby Isaac 
32*61cc7448SToby Isaac   Options Database Keys:
33*61cc7448SToby Isaac + -log_nvtx   - start an nvtx log handler manually
34*61cc7448SToby 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)
35*61cc7448SToby Isaac 
36*61cc7448SToby Isaac   Level: developer
37*61cc7448SToby Isaac 
38*61cc7448SToby Isaac   Note:
39*61cc7448SToby Isaac   If `PetscInitialize()` detects the environment variable `NSYS_PROFILING_SESSION_ID` (which is defined by `nsys
40*61cc7448SToby Isaac   profile`) or `NVPROF_ID` (which is defined by `nvprof`) an instance of this log handler will automatically be
41*61cc7448SToby Isaac   started.
42*61cc7448SToby Isaac 
43*61cc7448SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`
44*61cc7448SToby Isaac M*/
45*61cc7448SToby Isaac 
46*61cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler handler)
47*61cc7448SToby Isaac {
48*61cc7448SToby Isaac   PetscFunctionBegin;
49*61cc7448SToby Isaac   handler->ops->eventbegin = PetscLogHandlerEventBegin_NVTX;
50*61cc7448SToby Isaac   handler->ops->eventend   = PetscLogHandlerEventEnd_NVTX;
51*61cc7448SToby Isaac   PetscCall(PetscInfo(handler, "nvtx log handler created\n"));
52*61cc7448SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
53*61cc7448SToby Isaac }
54