161cc7448SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 261cc7448SToby Isaac #include <petsc/private/loghandlerimpl.h> 361cc7448SToby Isaac #include <petscdevice.h> 4*cb359cd4SJunchao Zhang #if PETSC_PKG_CUDA_VERSION_GE(10, 0, 0) 5*cb359cd4SJunchao Zhang #include <nvtx3/nvToolsExt.h> 6*cb359cd4SJunchao Zhang #else 761cc7448SToby Isaac #include <nvToolsExt.h> 8*cb359cd4SJunchao Zhang #endif 961cc7448SToby Isaac 1061cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 1161cc7448SToby Isaac { 1261cc7448SToby Isaac PetscLogState state; 1361cc7448SToby Isaac PetscLogEventInfo info; 1461cc7448SToby Isaac 1561cc7448SToby Isaac PetscFunctionBegin; 1661cc7448SToby Isaac if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) { 1761cc7448SToby Isaac PetscCall(PetscLogHandlerGetState(handler, &state)); 1861cc7448SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, event, &info)); 1961cc7448SToby Isaac (void)nvtxRangePushA(info.name); 2061cc7448SToby Isaac } 2161cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2261cc7448SToby Isaac } 2361cc7448SToby Isaac 2461cc7448SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_NVTX(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 2561cc7448SToby Isaac { 2661cc7448SToby Isaac PetscFunctionBegin; 2761cc7448SToby Isaac if (PetscDeviceInitialized(PETSC_DEVICE_CUDA)) (void)nvtxRangePop(); 2861cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2961cc7448SToby Isaac } 3061cc7448SToby Isaac 3161cc7448SToby Isaac /*MC 3261cc7448SToby Isaac PETSCLOGHANDLERNVTX - PETSCLOGHANDLERNVTX = "nvtx" - A 3361cc7448SToby Isaac `PetscLogHandler` that creates an NVTX range (which appears in Nvidia Nsight 3461cc7448SToby Isaac profiling) for each PETSc event. 3561cc7448SToby Isaac 3661cc7448SToby Isaac Options Database Keys: 3761cc7448SToby Isaac + -log_nvtx - start an nvtx log handler manually 3861cc7448SToby 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) 3961cc7448SToby Isaac 4061cc7448SToby Isaac Level: developer 4161cc7448SToby Isaac 4261cc7448SToby Isaac Note: 4361cc7448SToby Isaac If `PetscInitialize()` detects the environment variable `NSYS_PROFILING_SESSION_ID` (which is defined by `nsys 4461cc7448SToby Isaac profile`) or `NVPROF_ID` (which is defined by `nvprof`) an instance of this log handler will automatically be 4561cc7448SToby Isaac started. 4661cc7448SToby Isaac 4761cc7448SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler` 4861cc7448SToby Isaac M*/ 4961cc7448SToby Isaac 5061cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler handler) 5161cc7448SToby Isaac { 5261cc7448SToby Isaac PetscFunctionBegin; 5361cc7448SToby Isaac handler->ops->eventbegin = PetscLogHandlerEventBegin_NVTX; 5461cc7448SToby Isaac handler->ops->eventend = PetscLogHandlerEventEnd_NVTX; 5561cc7448SToby Isaac PetscCall(PetscInfo(handler, "nvtx log handler created\n")); 5661cc7448SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 5761cc7448SToby Isaac } 58