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