1 #include <petscsys.h> /*I "petscsys.h" I*/ 2 3 #if defined(PETSC_HAVE_MEMKIND) 4 #include <hbwmalloc.h> 5 #endif 6 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 **); 13 14 /* 15 PetscHBWMalloc - HBW malloc. 16 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 22 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); 43 PetscCheck(!err && *result, PETSC_COMM_SELF, PETSC_ERR_MEM, "HBW Memory requested %.0f", (PetscLogDouble)a); 44 } 45 return 0; 46 #endif 47 } 48 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 } 58 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); 71 PetscCheck(*result, PETSC_COMM_SELF, PETSC_ERR_MEM, "Memory requested %.0f", (PetscLogDouble)a); 72 return 0; 73 #endif 74 } 75 76 PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void) 77 { 78 PetscFunctionBegin; 79 PetscCall(PetscMallocSet(PetscHBWMalloc, PetscHBWFree, PetscHBWRealloc)); 80 PetscFunctionReturn(PETSC_SUCCESS); 81 } 82