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 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 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 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 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 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 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 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