1*2f21b5c6SHong Zhang #include <petscsys.h> /*I "petscsys.h" I*/ 2*2f21b5c6SHong Zhang 3*2f21b5c6SHong Zhang #if defined(PETSC_HAVE_MEMKIND) 4*2f21b5c6SHong Zhang #include <hbwmalloc.h> 5*2f21b5c6SHong Zhang #endif 6*2f21b5c6SHong Zhang 7*2f21b5c6SHong Zhang /* 8*2f21b5c6SHong Zhang These are defined in mal.c and ensure that malloced space is PetscScalar aligned 9*2f21b5c6SHong Zhang */ 10*2f21b5c6SHong Zhang extern PetscErrorCode PetscMallocAlign(size_t,int,const char[],const char[],void**); 11*2f21b5c6SHong Zhang extern PetscErrorCode PetscFreeAlign(void*,int,const char[],const char[]); 12*2f21b5c6SHong Zhang 13*2f21b5c6SHong Zhang /* 14*2f21b5c6SHong Zhang PetscHBWMalloc - HBW malloc. 15*2f21b5c6SHong Zhang 16*2f21b5c6SHong Zhang Input Parameters: 17*2f21b5c6SHong Zhang + a - number of bytes to allocate 18*2f21b5c6SHong Zhang . lineno - line number where used 19*2f21b5c6SHong Zhang . function - function calling routine 20*2f21b5c6SHong Zhang - filename - file name where used 21*2f21b5c6SHong Zhang 22*2f21b5c6SHong Zhang Returns: 23*2f21b5c6SHong Zhang double aligned pointer to requested storage, or null if not 24*2f21b5c6SHong Zhang available. 25*2f21b5c6SHong Zhang */ 26*2f21b5c6SHong Zhang PetscErrorCode PetscHBWMalloc(size_t a,int lineno,const char function[],const char filename[],void **result) 27*2f21b5c6SHong Zhang { 28*2f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 29*2f21b5c6SHong Zhang return PetscMallocAlign(a,lineno,function,filename,result); 30*2f21b5c6SHong Zhang #else 31*2f21b5c6SHong Zhang if (!a) { *result = NULL; return 0; } 32*2f21b5c6SHong Zhang /* 33*2f21b5c6SHong Zhang The default policy is if insufficient memory is available from the high bandwidth memory 34*2f21b5c6SHong Zhang fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM 35*2f21b5c6SHong Zhang and the allocated pointer is set to NULL if there is not enough HWB memory available. 36*2f21b5c6SHong Zhang */ 37*2f21b5c6SHong Zhang { 38*2f21b5c6SHong Zhang int ierr = hbw_posix_memalign(result,PETSC_MEMALIGN,a); 39*2f21b5c6SHong Zhang if (ierr || !*result) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MEM,"HBW Memory requested %.0f",(PetscLogDouble)a); 40*2f21b5c6SHong Zhang } 41*2f21b5c6SHong Zhang return 0; 42*2f21b5c6SHong Zhang #endif 43*2f21b5c6SHong Zhang } 44*2f21b5c6SHong Zhang 45*2f21b5c6SHong Zhang PetscErrorCode PetscHBWFree(void *aa,int line,const char function[],const char file[]) 46*2f21b5c6SHong Zhang { 47*2f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 48*2f21b5c6SHong Zhang return PetscFreeAlign(aa,line,function,file); 49*2f21b5c6SHong Zhang #else 50*2f21b5c6SHong Zhang hbw_free(aa); 51*2f21b5c6SHong Zhang return 0; 52*2f21b5c6SHong Zhang #endif 53*2f21b5c6SHong Zhang } 54