1*d52a580bSJunchao Zhang #include "../cupmcontext.hpp" /*I "petscdevice.h" I*/ 2*d52a580bSJunchao Zhang 3*d52a580bSJunchao Zhang using namespace Petsc::device::cupm; 4*d52a580bSJunchao Zhang 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 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 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 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