1 #include <petscsys.h> /*I "petscsys.h" I*/ 2 #include <petsccublas.h> /* Needed to provide CHKERRCUDA() */ 3 4 static PetscErrorCode PetscCUDAHostMalloc(size_t a,PetscBool clear,int lineno,const char function[],const char filename[],void **result) 5 { 6 cudaError_t ierr; 7 ierr = cudaMallocHost(result,a);CHKERRCUDA(ierr); 8 return 0; 9 } 10 11 static PetscErrorCode PetscCUDAHostFree(void *aa,int lineno,const char function[],const char filename[]) 12 { 13 cudaError_t ierr; 14 ierr = cudaFreeHost(aa);CHKERRCUDA(ierr); 15 return 0; 16 } 17 18 static PetscErrorCode PetscCUDAHostRealloc(size_t a,int lineno,const char function[],const char filename[],void **result) 19 { 20 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MEM,"CUDA has no Realloc()"); 21 } 22 23 static PetscErrorCode (*PetscMallocOld)(size_t,PetscBool,int,const char[],const char[],void**); 24 static PetscErrorCode (*PetscReallocOld)(size_t,int,const char[],const char[],void**); 25 static PetscErrorCode (*PetscFreeOld)(void*,int,const char[],const char[]); 26 27 /*@C 28 PetscMallocSetCUDAHost - Set PetscMalloc to use CUDAHostMalloc 29 Switch the current malloc and free routines to the CUDA malloc and free routines 30 31 Not Collective 32 33 Level: developer 34 35 Notes: 36 This provides a way to use the CUDA malloc and free routines temporarily. One 37 can switch back to the previous choice by calling PetscMallocResetCUDAHost(). 38 39 .seealso: PetscMallocResetCUDAHost() 40 @*/ 41 PetscErrorCode PetscMallocSetCUDAHost(void) 42 { 43 PetscFunctionBegin; 44 /* Save the previous choice */ 45 PetscMallocOld = PetscTrMalloc; 46 PetscReallocOld = PetscTrRealloc; 47 PetscFreeOld = PetscTrFree; 48 PetscTrMalloc = PetscCUDAHostMalloc; 49 PetscTrRealloc = PetscCUDAHostRealloc; 50 PetscTrFree = PetscCUDAHostFree; 51 PetscFunctionReturn(0); 52 } 53 54 /*@C 55 PetscMallocResetCUDAHost - Reset the changes made by PetscMallocSetCUDAHost 56 57 Not Collective 58 59 Level: developer 60 61 .seealso: PetscMallocSetCUDAHost() 62 @*/ 63 PetscErrorCode PetscMallocResetCUDAHost(void) 64 { 65 PetscFunctionBegin; 66 PetscTrMalloc = PetscMallocOld; 67 PetscTrRealloc = PetscReallocOld; 68 PetscTrFree = PetscFreeOld; 69 PetscFunctionReturn(0); 70 } 71