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