1 #include "../cupmcontext.hpp" /*I "petscdevice.h" I*/ 2 3 using namespace Petsc::Device::CUPM; 4 5 PetscErrorCode PetscDeviceContextCreate_CUDA(PetscDeviceContext dctx) { 6 static constexpr auto contextCuda = CUPMContextCuda(); 7 PetscDeviceContext_(CUDA) * dci; 8 9 PetscFunctionBegin; 10 PetscCall(contextCuda.initialize()); 11 PetscCall(PetscNew(&dci)); 12 dctx->data = static_cast<decltype(dctx->data)>(dci); 13 PetscCall(PetscMemcpy(dctx->ops, &contextCuda.ops, sizeof(contextCuda.ops))); 14 PetscFunctionReturn(0); 15 } 16 17 /* Management of CUBLAS and CUSOLVER handles */ 18 PetscErrorCode PetscCUBLASGetHandle(cublasHandle_t *handle) { 19 PetscDeviceContext dctx; 20 21 PetscFunctionBegin; 22 PetscValidPointer(handle, 1); 23 PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_CUDA)); 24 PetscCall(PetscDeviceContextGetBLASHandle_Internal(dctx, handle)); 25 PetscFunctionReturn(0); 26 } 27 28 PetscErrorCode PetscCUSOLVERDnGetHandle(cusolverDnHandle_t *handle) { 29 PetscDeviceContext dctx; 30 31 PetscFunctionBegin; 32 PetscValidPointer(handle, 1); 33 PetscCall(PetscDeviceContextGetCurrentContextAssertType_Internal(&dctx, PETSC_DEVICE_CUDA)); 34 PetscCall(PetscDeviceContextGetSOLVERHandle_Internal(dctx, handle)); 35 PetscFunctionReturn(0); 36 } 37