xref: /petsc/src/sys/objects/device/impls/cupm/hip/cupmcontext.hip.cxx (revision daba9d70159ea2f6905738fcbec7404635487b2b)
1*d52a580bSJunchao Zhang #include "../cupmcontext.hpp" /*I "petscdevice.h" I*/
2*d52a580bSJunchao Zhang 
3*d52a580bSJunchao Zhang using namespace Petsc::device::cupm;
4*d52a580bSJunchao Zhang 
PetscDeviceContextCreate_HIP(PetscDeviceContext dctx)5*d52a580bSJunchao Zhang PetscErrorCode PetscDeviceContextCreate_HIP(PetscDeviceContext dctx)
6*d52a580bSJunchao Zhang {
7*d52a580bSJunchao Zhang   static constexpr auto hip_context = CUPMContextHip();
8*d52a580bSJunchao Zhang 
9*d52a580bSJunchao Zhang   PetscFunctionBegin;
10*d52a580bSJunchao Zhang   PetscCall(hip_context.initialize(dctx->device));
11*d52a580bSJunchao Zhang   dctx->data = new PetscDeviceContext_(HIP);
12*d52a580bSJunchao Zhang   *dctx->ops = hip_context.ops;
13*d52a580bSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
14*d52a580bSJunchao Zhang }
15*d52a580bSJunchao Zhang 
16*d52a580bSJunchao Zhang /*
17*d52a580bSJunchao Zhang  Management of HIPBLAS and HIPSOLVER handles
18*d52a580bSJunchao Zhang 
19*d52a580bSJunchao Zhang  Unlike CUDA, hipSOLVER is just for dense matrices so there is
20*d52a580bSJunchao Zhang  no distinguishing being dense and sparse.  Also, hipSOLVER is
21*d52a580bSJunchao Zhang  very immature so we often have to do the mapping between roc and
22*d52a580bSJunchao Zhang  cuda manually.
23*d52a580bSJunchao Zhang  */
24*d52a580bSJunchao Zhang 
PetscHIPBLASGetHandle(hipblasHandle_t * handle)25*d52a580bSJunchao Zhang PetscErrorCode PetscHIPBLASGetHandle(hipblasHandle_t *handle)
26*d52a580bSJunchao Zhang {
27*d52a580bSJunchao Zhang   PetscDeviceContext dctx;
28*d52a580bSJunchao Zhang 
29*d52a580bSJunchao Zhang   PetscFunctionBegin;
30*d52a580bSJunchao Zhang   PetscAssertPointer(handle, 1);
31*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
32*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetBLASHandle_Internal(dctx, handle));
33*d52a580bSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
34*d52a580bSJunchao Zhang }
35*d52a580bSJunchao Zhang 
PetscHIPSOLVERGetHandle(hipsolverHandle_t * handle)36*d52a580bSJunchao Zhang PetscErrorCode PetscHIPSOLVERGetHandle(hipsolverHandle_t *handle)
37*d52a580bSJunchao Zhang {
38*d52a580bSJunchao Zhang   PetscDeviceContext dctx;
39*d52a580bSJunchao Zhang 
40*d52a580bSJunchao Zhang   PetscFunctionBegin;
41*d52a580bSJunchao Zhang   PetscAssertPointer(handle, 1);
42*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
43*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetSOLVERHandle_Internal(dctx, handle));
44*d52a580bSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
45*d52a580bSJunchao Zhang }
46*d52a580bSJunchao Zhang 
PetscGetCurrentHIPStream(hipStream_t * stream)47*d52a580bSJunchao Zhang PetscErrorCode PetscGetCurrentHIPStream(hipStream_t *stream)
48*d52a580bSJunchao Zhang {
49*d52a580bSJunchao Zhang   PetscDeviceContext dctx;
50*d52a580bSJunchao Zhang   void              *handle;
51*d52a580bSJunchao Zhang 
52*d52a580bSJunchao Zhang   PetscFunctionBegin;
53*d52a580bSJunchao Zhang   PetscAssertPointer(stream, 1);
54*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_HIP));
55*d52a580bSJunchao Zhang   PetscCall(PetscDeviceContextGetStreamHandle(dctx, &handle));
56*d52a580bSJunchao Zhang   *stream = *(hipStream_t *)handle;
57*d52a580bSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
58*d52a580bSJunchao Zhang }
59