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