12f21b5c6SHong Zhang #include <petscsys.h> /*I "petscsys.h" I*/ 22f21b5c6SHong Zhang 32f21b5c6SHong Zhang #if defined(PETSC_HAVE_MEMKIND) 42f21b5c6SHong Zhang #include <hbwmalloc.h> 52f21b5c6SHong Zhang #endif 62f21b5c6SHong Zhang 72f21b5c6SHong Zhang /* 82f21b5c6SHong Zhang These are defined in mal.c and ensure that malloced space is PetscScalar aligned 92f21b5c6SHong Zhang */ 10071fcb05SBarry Smith PETSC_EXTERN PetscErrorCode PetscMallocAlign(size_t, PetscBool, int, const char[], const char[], void **); 1195c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscFreeAlign(void *, int, const char[], const char[]); 1295c0884eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscReallocAlign(size_t, int, const char[], const char[], void **); 132f21b5c6SHong Zhang 142f21b5c6SHong Zhang /* 152f21b5c6SHong Zhang PetscHBWMalloc - HBW malloc. 162f21b5c6SHong Zhang 172f21b5c6SHong Zhang Input Parameters: 182f21b5c6SHong Zhang + a - number of bytes to allocate 192f21b5c6SHong Zhang . lineno - line number where used 202f21b5c6SHong Zhang . function - function calling routine 212f21b5c6SHong Zhang - filename - file name where used 222f21b5c6SHong Zhang 232f21b5c6SHong Zhang Returns: 242f21b5c6SHong Zhang double aligned pointer to requested storage, or null if not 252f21b5c6SHong Zhang available. 262f21b5c6SHong Zhang */ 27*9371c9d4SSatish Balay static PetscErrorCode PetscHBWMalloc(size_t a, PetscBool clear, int lineno, const char function[], const char filename[], void **result) { 282f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 29071fcb05SBarry Smith return PetscMallocAlign(a, clear, lineno, function, filename, result); 302f21b5c6SHong Zhang #else 31*9371c9d4SSatish Balay if (!a) { 32*9371c9d4SSatish Balay *result = NULL; 33*9371c9d4SSatish Balay return 0; 34*9371c9d4SSatish Balay } 352f21b5c6SHong Zhang /* 362f21b5c6SHong Zhang The default policy is if insufficient memory is available from the high bandwidth memory 372f21b5c6SHong Zhang fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM 382f21b5c6SHong Zhang and the allocated pointer is set to NULL if there is not enough HWB memory available. 392f21b5c6SHong Zhang */ 402f21b5c6SHong Zhang { 412da392ccSBarry Smith int err = hbw_posix_memalign(result, PETSC_MEMALIGN, a); 4208401ef6SPierre Jolivet PetscCheck(!err && *result, PETSC_COMM_SELF, PETSC_ERR_MEM, "HBW Memory requested %.0f", (PetscLogDouble)a); 432f21b5c6SHong Zhang } 442f21b5c6SHong Zhang return 0; 452f21b5c6SHong Zhang #endif 462f21b5c6SHong Zhang } 472f21b5c6SHong Zhang 48*9371c9d4SSatish Balay static PetscErrorCode PetscHBWFree(void *aa, int lineno, const char function[], const char filename[]) { 492f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 500bf43a65SHong Zhang return PetscFreeAlign(aa, lineno, function, filename); 512f21b5c6SHong Zhang #else 522f21b5c6SHong Zhang hbw_free(aa); 532f21b5c6SHong Zhang return 0; 542f21b5c6SHong Zhang #endif 5513850c04SHong Zhang } 5613850c04SHong Zhang 57*9371c9d4SSatish Balay static PetscErrorCode PetscHBWRealloc(size_t a, int lineno, const char function[], const char filename[], void **result) { 580bf43a65SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 590bf43a65SHong Zhang return PetscReallocAlign(a, lineno, function, filename, result); 600bf43a65SHong Zhang #else 610bf43a65SHong Zhang if (!a) { 622da392ccSBarry Smith int err = PetscFreeAlign(*result, lineno, function, filename); 632da392ccSBarry Smith if (err) return err; 640bf43a65SHong Zhang *result = NULL; 650bf43a65SHong Zhang return 0; 660bf43a65SHong Zhang } 670bf43a65SHong Zhang *result = hbw_realloc(*result, a); 6808401ef6SPierre Jolivet PetscCheck(*result, PETSC_COMM_SELF, PETSC_ERR_MEM, "Memory requested %.0f", (PetscLogDouble)a); 690bf43a65SHong Zhang return 0; 700bf43a65SHong Zhang #endif 710bf43a65SHong Zhang } 720bf43a65SHong Zhang 73*9371c9d4SSatish Balay PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void) { 7413850c04SHong Zhang PetscFunctionBegin; 759566063dSJacob Faibussowitsch PetscCall(PetscMallocSet(PetscHBWMalloc, PetscHBWFree, NULL)); 760bf43a65SHong Zhang PetscTrRealloc = PetscHBWRealloc; 7713850c04SHong Zhang PetscFunctionReturn(0); 782f21b5c6SHong Zhang } 79