Actual source code: cupmcontext.cu
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: }