Actual source code: cupmcontext.hip.cxx

  1: #include "../cupmcontext.hpp" /*I "petscdevice.h" I*/

  3: using namespace Petsc::device::cupm;

  5: PetscErrorCode PetscDeviceContextCreate_HIP(PetscDeviceContext dctx)
  6: {
  7:   static constexpr auto hip_context = CUPMContextHip();

  9:   PetscFunctionBegin;
 10:   PetscCall(hip_context.initialize(dctx->device));
 11:   dctx->data = new PetscDeviceContext_(HIP);
 12:   *dctx->ops = hip_context.ops;
 13:   PetscFunctionReturn(PETSC_SUCCESS);
 14: }

 16: /*
 17:  Management of HIPBLAS and HIPSOLVER handles

 19:  Unlike CUDA, hipSOLVER is just for dense matrices so there is
 20:  no distinguishing being dense and sparse.  Also, hipSOLVER is
 21:  very immature so we often have to do the mapping between roc and
 22:  cuda manually.
 23:  */

 25: /*@C
 26:   PetscHIPBLASGetHandle - Get the hipBLAS handle associated with PETSc's current `PetscDeviceContext`

 28:   Not Collective; No Fortran Support

 30:   Output Parameter:
 31: . handle - the `hipblasHandle_t` for the current context

 33:   Level: developer

 35:   Note:
 36:   The current device context must be of type `PETSC_DEVICE_HIP`. The returned handle is owned by
 37:   PETSc and must not be destroyed by the caller.

 39: .seealso: `PetscDeviceContext`, `PetscHIPSOLVERGetHandle()`, `PetscGetCurrentHIPStream()`
 40: @*/
 41: PetscErrorCode PetscHIPBLASGetHandle(hipblasHandle_t *handle)
 42: {
 43:   PetscDeviceContext dctx;

 45:   PetscFunctionBegin;
 46:   PetscAssertPointer(handle, 1);
 47:   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
 48:   PetscCall(PetscDeviceContextGetBLASHandle_Internal(dctx, handle));
 49:   PetscFunctionReturn(PETSC_SUCCESS);
 50: }

 52: /*@C
 53:   PetscHIPSOLVERGetHandle - Get the hipSOLVER handle associated with PETSc's current `PetscDeviceContext`

 55:   Not Collective; No Fortran Support

 57:   Output Parameter:
 58: . handle - the `hipsolverHandle_t` for the current context

 60:   Level: developer

 62:   Note:
 63:   The current device context must be of type `PETSC_DEVICE_HIP`. The returned handle is owned by
 64:   PETSc and must not be destroyed by the caller.

 66: .seealso: `PetscDeviceContext`, `PetscHIPBLASGetHandle()`, `PetscGetCurrentHIPStream()`
 67: @*/
 68: PetscErrorCode PetscHIPSOLVERGetHandle(hipsolverHandle_t *handle)
 69: {
 70:   PetscDeviceContext dctx;

 72:   PetscFunctionBegin;
 73:   PetscAssertPointer(handle, 1);
 74:   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
 75:   PetscCall(PetscDeviceContextGetSOLVERHandle_Internal(dctx, handle));
 76:   PetscFunctionReturn(PETSC_SUCCESS);
 77: }

 79: /*@C
 80:   PetscGetCurrentHIPStream - Get the HIP stream associated with PETSc's current `PetscDeviceContext`

 82:   Not Collective; No Fortran Support

 84:   Output Parameter:
 85: . stream - the `hipStream_t` for the current context

 87:   Level: developer

 89:   Note:
 90:   The current device context must be of type `PETSC_DEVICE_HIP`. The returned stream is owned by
 91:   PETSc and must not be destroyed by the caller.

 93: .seealso: `PetscDeviceContext`, `PetscHIPBLASGetHandle()`, `PetscHIPSOLVERGetHandle()`
 94: @*/
 95: PetscErrorCode PetscGetCurrentHIPStream(hipStream_t *stream)
 96: {
 97:   PetscDeviceContext dctx;
 98:   void              *handle;

100:   PetscFunctionBegin;
101:   PetscAssertPointer(stream, 1);
102:   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
103:   PetscCall(PetscDeviceContextGetStreamHandle(dctx, &handle));
104:   *stream = *(hipStream_t *)handle;
105:   PetscFunctionReturn(PETSC_SUCCESS);
106: }