xref: /petsc/src/sys/logging/handler/impls/roctx/logroctx.c (revision 6147a03054b7508bfa2c7c36641bdd5b75587eab)
1*56a72328SZach Atkins #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/
2*56a72328SZach Atkins #include <petsc/private/loghandlerimpl.h>
3*56a72328SZach Atkins #include <petscdevice_hip.h>
4*56a72328SZach Atkins 
5*56a72328SZach Atkins #if PetscDefined(HAVE_ROCTX)
6*56a72328SZach Atkins 
7*56a72328SZach Atkins   #if PETSC_PKG_HIP_VERSION_GE(6, 4, 0)
8*56a72328SZach Atkins     #include <rocprofiler-sdk-roctx/roctx.h>
9*56a72328SZach Atkins 
PetscLogHandlerEventsPause_ROCTX(PetscLogHandler h)10*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventsPause_ROCTX(PetscLogHandler h)
11*56a72328SZach Atkins {
12*56a72328SZach Atkins   PetscFunctionBegin;
13*56a72328SZach Atkins   /* Pause all profiling */
14*56a72328SZach Atkins   PetscInt err = roctxProfilerPause(0);
15*56a72328SZach Atkins   PetscCheck(err == 0, PETSC_COMM_SELF, PETSC_ERR_GPU, "Failed to pause ROCTX profiler");
16*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
17*56a72328SZach Atkins }
18*56a72328SZach Atkins 
PetscLogHandlerEventsResume_ROCTX(PetscLogHandler h)19*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventsResume_ROCTX(PetscLogHandler h)
20*56a72328SZach Atkins {
21*56a72328SZach Atkins   PetscFunctionBegin;
22*56a72328SZach Atkins   /* Resume all profiling */
23*56a72328SZach Atkins   PetscInt err = roctxProfilerResume(0);
24*56a72328SZach Atkins   PetscCheck(err == 0, PETSC_COMM_SELF, PETSC_ERR_GPU, "Failed to resume ROCTX profiler");
25*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
26*56a72328SZach Atkins }
27*56a72328SZach Atkins 
28*56a72328SZach Atkins   #elif PETSC_PKG_HIP_VERSION_GE(6, 0, 0)
29*56a72328SZach Atkins     #include <roctracer/roctx.h>
30*56a72328SZach Atkins   #elif PETSC_PKG_HIP_VERSION_GE(5, 0, 0)
31*56a72328SZach Atkins     #include <roctx.h>
32*56a72328SZach Atkins   #endif
33*56a72328SZach Atkins 
34*56a72328SZach Atkins #endif
35*56a72328SZach Atkins 
36*56a72328SZach Atkins #if PetscDefined(HAVE_ROCTX)
37*56a72328SZach Atkins 
PetscLogHandlerEventBegin_ROCTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)38*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventBegin_ROCTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
39*56a72328SZach Atkins {
40*56a72328SZach Atkins   PetscLogState     state;
41*56a72328SZach Atkins   PetscLogEventInfo info;
42*56a72328SZach Atkins 
43*56a72328SZach Atkins   PetscFunctionBegin;
44*56a72328SZach Atkins   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
45*56a72328SZach Atkins     PetscCall(PetscLogHandlerGetState(handler, &state));
46*56a72328SZach Atkins     PetscCall(PetscLogStateEventGetInfo(state, event, &info));
47*56a72328SZach Atkins     (void)roctxRangePush(info.name);
48*56a72328SZach Atkins   }
49*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
50*56a72328SZach Atkins }
51*56a72328SZach Atkins 
PetscLogHandlerEventEnd_ROCTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)52*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventEnd_ROCTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
53*56a72328SZach Atkins {
54*56a72328SZach Atkins   PetscFunctionBegin;
55*56a72328SZach Atkins   if (PetscDeviceInitialized(PETSC_DEVICE_HIP)) {
56*56a72328SZach Atkins     (void)roctxRangePush("StreamSync0");
57*56a72328SZach Atkins     /* Sync the default stream to ensure proper timing within event*/
58*56a72328SZach Atkins     PetscCallHIP(hipDeviceSynchronize());
59*56a72328SZach Atkins     (void)roctxRangePop();
60*56a72328SZach Atkins     (void)roctxRangePop();
61*56a72328SZach Atkins   }
62*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
63*56a72328SZach Atkins }
64*56a72328SZach Atkins 
65*56a72328SZach Atkins #else
66*56a72328SZach Atkins 
PetscLogHandlerEventBegin_ROCTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)67*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventBegin_ROCTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
68*56a72328SZach Atkins {
69*56a72328SZach Atkins   PetscFunctionBegin;
70*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
71*56a72328SZach Atkins }
72*56a72328SZach Atkins 
PetscLogHandlerEventEnd_ROCTX(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)73*56a72328SZach Atkins static PetscErrorCode PetscLogHandlerEventEnd_ROCTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
74*56a72328SZach Atkins {
75*56a72328SZach Atkins   PetscFunctionBegin;
76*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
77*56a72328SZach Atkins }
78*56a72328SZach Atkins 
79*56a72328SZach Atkins #endif
80*56a72328SZach Atkins 
81*56a72328SZach Atkins /*MC
82*56a72328SZach Atkins   PETSCLOGHANDLERROCTX - PETSCLOGHANDLERROCTX = "roctx" -  A `PetscLogHandler` that creates an ROCTX range (which appears in rocprof profiling) for each PETSc event.
83*56a72328SZach Atkins 
84*56a72328SZach Atkins   Options Database Keys:
85*56a72328SZach Atkins + -log_roctx   - start an roctx log handler manually
86*56a72328SZach Atkins - -log_roctx 0 - stop the roctx log handler from starting automatically in `PetscInitialize()` in a program run within a rocprof profiling session
87*56a72328SZach Atkins 
88*56a72328SZach Atkins   Level: developer
89*56a72328SZach Atkins 
90*56a72328SZach Atkins .seealso: [](ch_profiling), `PetscLogHandler`
91*56a72328SZach Atkins M*/
92*56a72328SZach Atkins 
PetscLogHandlerCreate_ROCTX(PetscLogHandler handler)93*56a72328SZach Atkins PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_ROCTX(PetscLogHandler handler)
94*56a72328SZach Atkins {
95*56a72328SZach Atkins   PetscFunctionBegin;
96*56a72328SZach Atkins   handler->ops->eventbegin = PetscLogHandlerEventBegin_ROCTX;
97*56a72328SZach Atkins   handler->ops->eventend   = PetscLogHandlerEventEnd_ROCTX;
98*56a72328SZach Atkins #if PetscDefined(HAVE_ROCTX)
99*56a72328SZach Atkins   #if PETSC_PKG_HIP_VERSION_GE(6, 4, 0)
100*56a72328SZach Atkins   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsPause_C", PetscLogHandlerEventsPause_ROCTX));
101*56a72328SZach Atkins   PetscCall(PetscObjectComposeFunction((PetscObject)handler, "PetscLogHandlerEventsResume_C", PetscLogHandlerEventsResume_ROCTX));
102*56a72328SZach Atkins   #endif
103*56a72328SZach Atkins #endif
104*56a72328SZach Atkins   PetscCall(PetscInfo(handler, "roctx log handler created\n"));
105*56a72328SZach Atkins   PetscFunctionReturn(PETSC_SUCCESS);
106*56a72328SZach Atkins }
107