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