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