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