Actual source code: logroctx.c

  1: #include <petsc/private/logimpl.h>
  2: #include <petsc/private/loghandlerimpl.h>
  3: #include <petscdevice_hip.h>

  5: #if PetscDefined(HAVE_ROCTX)

  7:   #if PETSC_PKG_HIP_VERSION_GE(6, 4, 0)
  8:     #include <rocprofiler-sdk-roctx/roctx.h>

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

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

 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

 34: #endif

 36: #if PetscDefined(HAVE_ROCTX)

 38: static PetscErrorCode PetscLogHandlerEventBegin_ROCTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
 39: {
 40:   PetscLogState     state;
 41:   PetscLogEventInfo info;

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

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

 65: #else

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

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

 79: #endif

 81: /*MC
 82:   PETSCLOGHANDLERROCTX - PETSCLOGHANDLERROCTX = "roctx" -  A `PetscLogHandler` that creates an ROCTX range (which appears in rocprof profiling) for each PETSc event.

 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

 88:   Level: developer

 90: .seealso: [](ch_profiling), `PetscLogHandler`
 91: M*/

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