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 */
PetscHBWMalloc(size_t a,PetscBool clear,int lineno,const char function[],const char filename[],void ** result)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
PetscHBWFree(void * aa,int lineno,const char function[],const char filename[])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
PetscHBWRealloc(size_t a,int lineno,const char function[],const char filename[],void ** result)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
PetscSetUseHBWMalloc_Private(void)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