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 */ 102f21b5c6SHong Zhang extern PetscErrorCode PetscMallocAlign(size_t,int,const char[],const char[],void**); 112f21b5c6SHong Zhang extern PetscErrorCode PetscFreeAlign(void*,int,const char[],const char[]); 122f21b5c6SHong Zhang 132f21b5c6SHong Zhang /* 142f21b5c6SHong Zhang PetscHBWMalloc - HBW malloc. 152f21b5c6SHong Zhang 162f21b5c6SHong Zhang Input Parameters: 172f21b5c6SHong Zhang + a - number of bytes to allocate 182f21b5c6SHong Zhang . lineno - line number where used 192f21b5c6SHong Zhang . function - function calling routine 202f21b5c6SHong Zhang - filename - file name where used 212f21b5c6SHong Zhang 222f21b5c6SHong Zhang Returns: 232f21b5c6SHong Zhang double aligned pointer to requested storage, or null if not 242f21b5c6SHong Zhang available. 252f21b5c6SHong Zhang */ 262f21b5c6SHong Zhang PetscErrorCode PetscHBWMalloc(size_t a,int lineno,const char function[],const char filename[],void **result) 272f21b5c6SHong Zhang { 282f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 292f21b5c6SHong Zhang return PetscMallocAlign(a,lineno,function,filename,result); 302f21b5c6SHong Zhang #else 312f21b5c6SHong Zhang if (!a) { *result = NULL; return 0; } 322f21b5c6SHong Zhang /* 332f21b5c6SHong Zhang The default policy is if insufficient memory is available from the high bandwidth memory 342f21b5c6SHong Zhang fall back to standard memory. If we use the HBW_POLICY_BIND policy, errno is set to ENOMEM 352f21b5c6SHong Zhang and the allocated pointer is set to NULL if there is not enough HWB memory available. 362f21b5c6SHong Zhang */ 372f21b5c6SHong Zhang { 382f21b5c6SHong Zhang int ierr = hbw_posix_memalign(result,PETSC_MEMALIGN,a); 392f21b5c6SHong Zhang if (ierr || !*result) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MEM,"HBW Memory requested %.0f",(PetscLogDouble)a); 402f21b5c6SHong Zhang } 412f21b5c6SHong Zhang return 0; 422f21b5c6SHong Zhang #endif 432f21b5c6SHong Zhang } 442f21b5c6SHong Zhang 452f21b5c6SHong Zhang PetscErrorCode PetscHBWFree(void *aa,int line,const char function[],const char file[]) 462f21b5c6SHong Zhang { 472f21b5c6SHong Zhang #if !defined(PETSC_HAVE_MEMKIND) 482f21b5c6SHong Zhang return PetscFreeAlign(aa,line,function,file); 492f21b5c6SHong Zhang #else 502f21b5c6SHong Zhang hbw_free(aa); 512f21b5c6SHong Zhang return 0; 522f21b5c6SHong Zhang #endif 53*13850c04SHong Zhang } 54*13850c04SHong Zhang 55*13850c04SHong Zhang PetscErrorCode PetscSetUseHBWMalloc_Private(void) 56*13850c04SHong Zhang { 57*13850c04SHong Zhang PetscErrorCode ierr; 58*13850c04SHong Zhang 59*13850c04SHong Zhang PetscFunctionBegin; 60*13850c04SHong Zhang ierr = PetscMallocSet(PetscHBWMalloc,PetscHBWFree);CHKERRQ(ierr); 61*13850c04SHong Zhang PetscTrRealloc = NULL; 62*13850c04SHong Zhang PetscFunctionReturn(0); 632f21b5c6SHong Zhang } 64