Actual source code: mhbw.c

  1: #include <petscsys.h>

  3: #if defined(PETSC_HAVE_MEMKIND)
  4:   #include <hbwmalloc.h>
  5: #endif

  7: /*
  8:    These are defined in mal.c and ensure that malloced space is PetscScalar aligned
  9: */
 10: PETSC_EXTERN PetscErrorCode PetscMallocAlign(size_t, PetscBool, int, const char[], const char[], void **);
 11: PETSC_EXTERN PetscErrorCode PetscFreeAlign(void *, int, const char[], const char[]);
 12: PETSC_EXTERN PetscErrorCode PetscReallocAlign(size_t, int, const char[], const char[], void **);

 14: /*
 15:    PetscHBWMalloc - HBW malloc.

 17:    Input Parameters:
 18:    +   a   - number of bytes to allocate
 19:    .   lineno - line number where used
 20:    .   function - function calling routine
 21:    -   filename  - file name where used

 23:    Returns:
 24:    double aligned pointer to requested storage, or null if not
 25:    available.
 26: */
 27: static PetscErrorCode PetscHBWMalloc(size_t a, PetscBool clear, int lineno, const char function[], const char filename[], void **result)
 28: {
 29: #if !defined(PETSC_HAVE_MEMKIND)
 30:   return PetscMallocAlign(a, clear, lineno, function, filename, result);
 31: #else
 32:   if (!a) {
 33:     *result = NULL;
 34:     return 0;
 35:   }
 36:   /*
 37:     The default policy is if insufficient memory is available from the high bandwidth memory
 38:     fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM
 39:     and the allocated pointer is set to NULL if there is not enough HWB memory available.
 40:   */
 41:   {
 42:     int err = hbw_posix_memalign(result, PETSC_MEMALIGN, a);
 44:   }
 45:   return 0;
 46: #endif
 47: }

 49: static PetscErrorCode PetscHBWFree(void *aa, int lineno, const char function[], const char filename[])
 50: {
 51: #if !defined(PETSC_HAVE_MEMKIND)
 52:   return PetscFreeAlign(aa, lineno, function, filename);
 53: #else
 54:   hbw_free(aa);
 55:   return 0;
 56: #endif
 57: }

 59: static PetscErrorCode PetscHBWRealloc(size_t a, int lineno, const char function[], const char filename[], void **result)
 60: {
 61: #if !defined(PETSC_HAVE_MEMKIND)
 62:   return PetscReallocAlign(a, lineno, function, filename, result);
 63: #else
 64:   if (!a) {
 65:     int err = PetscFreeAlign(*result, lineno, function, filename);
 66:     if (err) return err;
 67:     *result = NULL;
 68:     return 0;
 69:   }
 70:   *result = hbw_realloc(*result, a);
 72:   return 0;
 73: #endif
 74: }

 76: PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void)
 77: {
 78:   PetscMallocSet(PetscHBWMalloc, PetscHBWFree, NULL);
 79:   PetscTrRealloc = PetscHBWRealloc;
 80:   return 0;
 81: }