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