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 */ 27d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscHBWMalloc(size_t a, PetscBool clear, int lineno, const char function[], const char filename[], void **result) 28d71ae5a4SJacob Faibussowitsch { 292f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 30071fcb05SBarry Smith return PetscMallocAlign(a, clear, lineno, function, filename, result); 312f21b5c6SHong Zhang #else 329371c9d4SSatish Balay if (!a) { 339371c9d4SSatish Balay *result = NULL; 349371c9d4SSatish Balay return 0; 359371c9d4SSatish Balay } 362f21b5c6SHong Zhang /* 372f21b5c6SHong Zhang The default policy is if insufficient memory is available from the high bandwidth memory 382f21b5c6SHong Zhang fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM 392f21b5c6SHong Zhang and the allocated pointer is set to NULL if there is not enough HWB memory available. 402f21b5c6SHong Zhang */ 412f21b5c6SHong Zhang { 422da392ccSBarry Smith int err = hbw_posix_memalign(result, PETSC_MEMALIGN, a); 4308401ef6SPierre Jolivet PetscCheck(!err && *result, PETSC_COMM_SELF, PETSC_ERR_MEM, "HBW Memory requested %.0f", (PetscLogDouble)a); 442f21b5c6SHong Zhang } 452f21b5c6SHong Zhang return 0; 462f21b5c6SHong Zhang #endif 472f21b5c6SHong Zhang } 482f21b5c6SHong Zhang 49d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscHBWFree(void *aa, int lineno, const char function[], const char filename[]) 50d71ae5a4SJacob Faibussowitsch { 512f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 520bf43a65SHong Zhang return PetscFreeAlign(aa, lineno, function, filename); 532f21b5c6SHong Zhang #else 542f21b5c6SHong Zhang hbw_free(aa); 552f21b5c6SHong Zhang return 0; 562f21b5c6SHong Zhang #endif 5713850c04SHong Zhang } 5813850c04SHong Zhang 59d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscHBWRealloc(size_t a, int lineno, const char function[], const char filename[], void **result) 60d71ae5a4SJacob Faibussowitsch { 610bf43a65SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 620bf43a65SHong Zhang return PetscReallocAlign(a, lineno, function, filename, result); 630bf43a65SHong Zhang #else 640bf43a65SHong Zhang if (!a) { 652da392ccSBarry Smith int err = PetscFreeAlign(*result, lineno, function, filename); 662da392ccSBarry Smith if (err) return err; 670bf43a65SHong Zhang *result = NULL; 680bf43a65SHong Zhang return 0; 690bf43a65SHong Zhang } 700bf43a65SHong Zhang *result = hbw_realloc(*result, a); 7108401ef6SPierre Jolivet PetscCheck(*result, PETSC_COMM_SELF, PETSC_ERR_MEM, "Memory requested %.0f", (PetscLogDouble)a); 720bf43a65SHong Zhang return 0; 730bf43a65SHong Zhang #endif 740bf43a65SHong Zhang } 750bf43a65SHong Zhang 76d71ae5a4SJacob Faibussowitsch PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void) 77d71ae5a4SJacob Faibussowitsch { 7813850c04SHong Zhang PetscFunctionBegin; 794c01b45eSJacob Faibussowitsch PetscCall(PetscMallocSet(PetscHBWMalloc, PetscHBWFree, PetscHBWRealloc)); 80*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 812f21b5c6SHong Zhang } 82