1: #include "../cupmcontext.hpp" /*I "petscdevice.h" I*/ 3: using namespace Petsc::device::cupm; 5: PetscErrorCode PetscDeviceContextCreate_CUDA(PetscDeviceContext dctx) 6: { 7: static constexpr auto cuda_context = CUPMContextCuda(); 9: PetscFunctionBegin; 10: PetscCall(cuda_context.initialize(dctx->device)); 11: dctx->data = new PetscDeviceContext_(CUDA); 12: *dctx->ops = cuda_context.ops; 13: PetscFunctionReturn(PETSC_SUCCESS); 14: } 16: /* Management of CUBLAS and CUSOLVER handles */ 17: PetscErrorCode PetscCUBLASGetHandle(cublasHandle_t *handle) 18: { 19: PetscDeviceContext dctx; 21: PetscFunctionBegin; 22: PetscAssertPointer(handle, 1); 23: PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_CUDA)); 24: PetscCall(PetscDeviceContextGetBLASHandle_Internal(dctx, handle)); 25: PetscFunctionReturn(PETSC_SUCCESS); 26: } 28: PetscErrorCode PetscCUSOLVERDnGetHandle(cusolverDnHandle_t *handle) 29: { 30: PetscDeviceContext dctx; 32: PetscFunctionBegin; 33: PetscAssertPointer(handle, 1); 34: PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_CUDA)); 35: PetscCall(PetscDeviceContextGetSOLVERHandle_Internal(dctx, handle)); 36: PetscFunctionReturn(PETSC_SUCCESS); 37: } 39: PetscErrorCode PetscGetCurrentCUDAStream(cudaStream_t *stream) 40: { 41: PetscDeviceContext dctx; 42: void *handle; 44: PetscFunctionBegin; 45: PetscAssertPointer(stream, 1); 46: PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_CUDA)); 47: PetscCall(PetscDeviceContextGetStreamHandle(dctx, &handle)); 48: *stream = *(cudaStream_t *)handle; 49: PetscFunctionReturn(PETSC_SUCCESS); 50: }