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