1*61cc7448SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 2*61cc7448SToby Isaac #include <petsc/private/loghandlerimpl.h> 3*61cc7448SToby Isaac #include <petscdevice.h> 4*61cc7448SToby Isaac #include <nvToolsExt.h> 5*61cc7448SToby Isaac 6*61cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 7*61cc7448SToby Isaac { 8*61cc7448SToby Isaac PetscLogState state; 9*61cc7448SToby Isaac PetscLogEventInfo info; 10*61cc7448SToby Isaac 11*61cc7448SToby Isaac PetscFunctionBegin; 12*61cc7448SToby Isaac if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) { 13*61cc7448SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 14*61cc7448SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &info)); 15*61cc7448SToby Isaac (void)nvtxRangePushA(info.name); 16*61cc7448SToby Isaac } 17*61cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 18*61cc7448SToby Isaac } 19*61cc7448SToby Isaac 20*61cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 21*61cc7448SToby Isaac { 22*61cc7448SToby Isaac PetscFunctionBegin; 23*61cc7448SToby Isaac if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) (void)nvtxRangePop(); 24*61cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 25*61cc7448SToby Isaac } 26*61cc7448SToby Isaac 27*61cc7448SToby Isaac /*MC 28*61cc7448SToby Isaac PETSCLOGHANDLERNVTX - PETSCLOGHANDLERNVTX = "nvtx" - A 29*61cc7448SToby Isaac `PetscLogHandler` that creates an NVTX range (which appears in Nvidia Nsight 30*61cc7448SToby Isaac profiling) for each PETSc event. 31*61cc7448SToby Isaac 32*61cc7448SToby Isaac Options Database Keys: 33*61cc7448SToby Isaac + -log_nvtx - start an nvtx log handler manually 34*61cc7448SToby Isaac - -log_nvtx 0 - stop the nvtx log handler from starting automatically in `PetscInitialize()` in a program run within an nsys profiling session (see Note) 35*61cc7448SToby Isaac 36*61cc7448SToby Isaac Level: developer 37*61cc7448SToby Isaac 38*61cc7448SToby Isaac Note: 39*61cc7448SToby Isaac If `PetscInitialize()` detects the environment variable `NSYS_PROFILING_SESSION_ID` (which is defined by `nsys 40*61cc7448SToby Isaac profile`) or `NVPROF_ID` (which is defined by `nvprof`) an instance of this log handler will automatically be 41*61cc7448SToby Isaac started. 42*61cc7448SToby Isaac 43*61cc7448SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler` 44*61cc7448SToby Isaac M*/ 45*61cc7448SToby Isaac 46*61cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler handler) 47*61cc7448SToby Isaac { 48*61cc7448SToby Isaac PetscFunctionBegin; 49*61cc7448SToby Isaac handler->ops->eventbegin = PetscLogHandlerEventBegin_NVTX; 50*61cc7448SToby Isaac handler->ops->eventend = PetscLogHandlerEventEnd_NVTX; 51*61cc7448SToby Isaac PetscCall(PetscInfo(handler, "nvtx log handler created\n")); 52*61cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 53*61cc7448SToby Isaac } 54