Actual source code: mcudahost.cu
1: #include <petscsys.h>
2: #include <petscdevice_cuda.h>
4: static PetscErrorCode PetscCUDAHostMalloc(size_t a, PetscBool, int, const char[], const char[], void **result)
5: {
6: PetscCallCUDA(cudaMallocHost(result, a));
7: return PETSC_SUCCESS;
8: }
10: static PetscErrorCode PetscCUDAHostFree(void *aa, int, const char[], const char[])
11: {
12: PetscCallCUDA(cudaFreeHost(aa));
13: return PETSC_SUCCESS;
14: }
16: static PetscErrorCode PetscCUDAHostRealloc(size_t, int, const char[], const char[], void **)
17: {
18: SETERRQ(PETSC_COMM_SELF, PETSC_ERR_MEM, "CUDA has no Realloc()");
19: }
21: static PetscErrorCode (*PetscMallocOld)(size_t, PetscBool, int, const char[], const char[], void **);
22: static PetscErrorCode (*PetscReallocOld)(size_t, int, const char[], const char[], void **);
23: static PetscErrorCode (*PetscFreeOld)(void *, int, const char[], const char[]);
25: /*@C
26: PetscMallocSetCUDAHost - Set `PetscMalloc()` to use `CUDAHostMalloc()`
27: Switch the current malloc and free routines to the CUDA malloc and free routines
29: Not Collective
31: Level: developer
33: Note:
34: This provides a way to use the CUDA malloc and free routines temporarily. One
35: can switch back to the previous choice by calling `PetscMallocResetCUDAHost()`.
37: .seealso: `PetscCUDAHostMalloc()`, `PetscMallocResetCUDAHost()`, `PetscMallocSetHIPHost()`
38: @*/
39: PetscErrorCode PetscMallocSetCUDAHost(void)
40: {
41: PetscFunctionBegin;
42: /* Save the previous choice */
43: PetscMallocOld = PetscTrMalloc;
44: PetscReallocOld = PetscTrRealloc;
45: PetscFreeOld = PetscTrFree;
46: PetscTrMalloc = PetscCUDAHostMalloc;
47: PetscTrRealloc = PetscCUDAHostRealloc;
48: PetscTrFree = PetscCUDAHostFree;
49: PetscFunctionReturn(PETSC_SUCCESS);
50: }
52: /*@C
53: PetscMallocResetCUDAHost - Reset the changes made by `PetscMallocSetCUDAHost()`
55: Not Collective
57: Level: developer
59: .seealso: `PetscCUDAHostMalloc()`, `PetscMallocSetCUDAHost()`
60: @*/
61: PetscErrorCode PetscMallocResetCUDAHost(void)
62: {
63: PetscFunctionBegin;
64: PetscTrMalloc = PetscMallocOld;
65: PetscTrRealloc = PetscReallocOld;
66: PetscTrFree = PetscFreeOld;
67: PetscFunctionReturn(PETSC_SUCCESS);
68: }