xref: /petsc/src/sys/memory/mhbw.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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