Provided by: libmemkind-dev_1.14.0-1_amd64 bug

NAME

       memkind - Heap manager that enables allocations to memory with different properties.
       This  header  expose  STANDARD  and EXPERIMENTAL API. API Standards are described below in
       this man page.

SYNOPSIS

       #include <memkind.h>

       Link with -lmemkind

   EXPERIMENTAL API:
       HEAP MANAGEMENT:
       int memkind_posix_memalign(memkind_t kind, void **memptr, size_t alignment, size_t size);

       KIND MANAGEMENT:
       int   memkind_create_kind(memkind_memtype_t   memtype_flags,   memkind_policy_t    policy,
       memkind_bits_t flags, memkind_t *kind);

   STANDARD API:
       ERROR HANDLING:
       void memkind_error_message(int err, char *msg, size_t size);

       LIBRARY VERSION:
       int memkind_get_version();

       HEAP MANAGEMENT:
       void *memkind_malloc(memkind_t kind, size_t size);
       void *memkind_calloc(memkind_t kind, size_t num, size_t size);
       void *memkind_realloc(memkind_t kind, void *ptr, size_t size);
       void memkind_free(memkind_t kind, void *ptr);
       size_t memkind_malloc_usable_size(memkind_t kind, void *ptr);
       void *memkind_defrag_reallocate(memkind_t kind, void *ptr);
       memkind_t memkind_detect_kind(void *ptr);

       KIND CONFIGURATION MANAGEMENT:
       struct memkind_config *memkind_config_new();
       void memkind_config_delete(struct memkind_config *cfg);
       void memkind_config_set_path(struct memkind_config *cfg, const char *pmem_dir);
       void memkind_config_set_size(struct memkind_config *cfg, size_t pmem_size);
       void        memkind_config_set_memory_usage_policy(struct       memkind_config       *cfg,
       memkind_mem_usage_policy policy);

       KIND MANAGEMENT:
       int memkind_create_fixed(void *addr, size_t size, memkind_t *kind);
       int memkind_create_pmem(const char *dir, size_t max_size, memkind_t *kind);
       int memkind_create_pmem_with_config(struct memkind_config *cfg, memkind_t *kind);
       int memkind_destroy_kind(memkind_t kind);
       int memkind_check_available(memkind_t kind);
       ssize_t memkind_get_capacity(memkind_t kind);
       int memkind_check_dax_path(const char *pmem_dir);

       STATISTICS:
       int memkind_update_cached_stats(void);
       int memkind_get_stat(memkind_t kind, memkind_stat stat, size_t *value);
       int  memkind_stats_print(void  (*write_cb)  (void  *,  const  char  *),  void   *cbopaque,
       memkind_stat_print_opt opts);

       DECORATORS:
       void memkind_malloc_pre(memkind_t *kind, size_t *size);
       void memkind_malloc_post(memkind_t kind, size_t size, void **result);
       void memkind_calloc_pre(memkind_t *kind, size_t *nmemb, size_t *size);
       void memkind_calloc_post(memkind_t kind, size_t nmemb, size_t size, void **result);
       void  memkind_posix_memalign_pre(memkind_t *kind, void **memptr, size_t *alignment, size_t
       *size);
       void memkind_posix_memalign_post(memkind_t kind, void **memptr, size_t  alignment,  size_t
       size, int *err);
       void memkind_realloc_pre(memkind_t *kind, void **ptr, size_t *size);
       void memkind_realloc_post(memkind_t *kind, void *ptr, size_t size, void **result);
       void memkind_free_pre(memkind_t *kind, void **ptr);
       void memkind_free_post(memkind_t kind, void *ptr);

       ENHANCEMENTS:
       int memkind_set_bg_threads(bool state);

DESCRIPTION

       memkind_error_message()  converts  an error number err returned by a member of the memkind
       interface to an error message msg where the maximum size of the message is passed  by  the
       size parameter.

       HEAP MANAGEMENT:
       The functions described in this section define a heap manager with an interface modeled on
       the ISO C standard API's, except that the user must specify the kind of  memory  with  the
       first argument to each function. See the KINDS section below for a full description of the
       implemented  kinds.   For  file-backed  kind  of  memory  see   memkind_create_pmem()   or
       memkind_create_pmem_with_config().  For memory kind created on user-specified area, please
       check memkind_create_fixed().

       memkind_malloc() allocates size bytes of uninitialized memory of the specified kind.   The
       allocated  space  is suitably aligned (after possible pointer coercion) for storage of any
       type of object. If size is 0, then memkind_malloc() returns NULL.

       memkind_calloc() allocates space for num objects each size bytes in length  in  memory  of
       the  specified kind.  The result is identical to calling memkind_malloc() with an argument
       of num * size, with the exception that the allocated memory is explicitly  initialized  to
       zero bytes.  If num or size is 0, then memkind_calloc() returns NULL.

       memkind_realloc() changes the size of the previously allocated memory referenced by ptr to
       size bytes of the specified kind.  The contents of the memory remain unchanged up  to  the
       lesser  of  the  new  and  old sizes. If the new size is larger, the contents of the newly
       allocated portion of the memory are undefined. Upon success, the memory referenced by  ptr
       is freed and a pointer to the newly allocated memory is returned.

       Note:  memkind_realloc()  may  move the memory allocation, resulting in a different return
       value than ptr.

       If ptr is NULL, the memkind_realloc() function behaves identically to memkind_malloc() for
       the  specified  size.   If  size  is  equal to zero, and ptr is not NULL, then the call is
       equivalent to memkind_free(kind, ptr) and NULL is returned. The address ptr, if not  NULL,
       must  have  been  returned  by  a  previous  call  to  memkind_malloc(), memkind_calloc(),
       memkind_realloc(), memkind_defrag_reallocate() or memkind_posix_memalign() with  the  same
       kind as specified to the call to memkind_realloc().  Otherwise, if memkind_free(kind, ptr)
       was called before, undefined behavior occurs.  In cases where the kind is unknown  in  the
       context  of  the  call  to  memkind_realloc()  NULL  can be given as the kind specified to
       memkind_realloc(), but this will require an internal look up for correct kind.  Note:  The
       look  up  for  kind  could  result in serious performance penalty, which can be avoided by
       specifying a correct kind.  If kind is  NULL  and  ptr  is  NULL,  then  memkind_realloc()
       returns NULL and sets errno to EINVAL.

       memkind_posix_memalign()  allocates size bytes of memory of a specified kind such that the
       allocation's base address is an even multiple of alignment, and returns the allocation  in
       the  value pointed to by memptr.  The requested alignment must be a power of 2 at least as
       large as sizeof(void*).  If size is 0, then memkind_posix_memalign()  returns  0,  with  a
       NULL returned in memptr.

       memkind_malloc_usable_size()     function     provides     the     same    semantics    as
       malloc_usable_size(3), but operates on specified kind.
       Note:  In  cases  where  the  kind  is  unknown  in   the   context   of   the   call   to
       memkind_malloc_usable_size()    NULL   can   be   given   as   the   kind   specified   to
       memkind_malloc_usable_size(), but this could require a internal look up for correct  kind.
       memkind_malloc_usable_size()  is  supported  by  TBB heap manager described in ENVIRONMENT
       section since Intel TBB 2019 Update 4.

       memkind_defrag_reallocate() reallocates the object  conditionally  inside  specific  kind.
       Function  determines  if  it's  worthwhile to move allocation to reduce degree of external
       fragmentation of the heap.  In case of failure function returns NULL,  otherwise  function
       returns  a  pointer  to  reallocated  memory and memory referenced by ptr was released and
       should not be accessed.  If ptr is NULL, then  memkind_defrag_reallocate()  returns  NULL.
       In   cases   where   the   kind   is   unknown   in   the   context   of   the   call   to
       memkind_defrag_reallocate()   NULL   can   be   given   as   the   kind    specified    to
       memkind_defrag_reallocate(),  but  this will require an internal look up for correct kind.
       Note: The look up for kind could result in  serious  performance  penalty,  which  can  be
       avoided by specifying a correct kind.

       memkind_detect_kind() returns the kind associated with allocated memory referenced by ptr.
       This  pointer  must  have  been  returned  by  a  previous   call   to   memkind_malloc(),
       memkind_calloc(),         memkind_realloc(),         memkind_defrag_reallocate()        or
       memkind_posix_memalign().  If ptr is NULL, then memkind_detect_kind() returns NULL.  Note:
       This function has non-trivial performance overhead.

       memkind_free()  causes  the  allocated  memory  referenced by ptr to be made available for
       future  allocations.  This  pointer  must  have  been  returned  by  a  previous  call  to
       memkind_malloc(),   memkind_calloc(),  memkind_realloc(),  memkind_defrag_reallocate()  or
       memkind_posix_memalign().   Otherwise,  if  memkind_free(kind,  ptr)  was  already  called
       before,  undefined  behavior occurs.  If ptr is NULL, no operation is performed.  In cases
       where the kind is unknown in the context of the call to memkind_free() NULL can  be  given
       as  the  kind  specified  to memkind_free(), but this will require an internal look up for
       correct kind.  Note: The look up for kind could result  in  serious  performance  penalty,
       which can be avoided by specifying a correct kind.

       KIND CONFIGURATION MANAGEMENT:
       The  functions  described  in  this section define a way to create, delete and update kind
       specific configuration.  Except of memkind_config_new(), user  must  specify  the  memkind
       configuration with the first argument to each function.  API described here is most useful
       with file-backed kind of memory, e.g.  memkind_create_pmem_with_config() method.

       memkind_config_new() creates the memkind configuration.

       memkind_config_delete() deletes previously created memkind configuration, which must  have
       been returned by a previous call to memkind_config_new().

       memkind_config_set_path()  updates  the  memkind  pmem_dir  configuration parameter, which
       specifies directory path, where file-backed kind of memory will be  created.   Note:  This
       function does not validate that pmem_dir specifies a valid path.

       memkind_config_set_size()  updates  the  memkind  pmem_size configuration parameter, which
       allows to limit the file-backed kind memory  partition.   Note:  This  function  does  not
       validate that pmem_size is in valid range.

       memkind_config_set_memory_usage_policy()   updates   the   memkind   policy  configuration
       parameter, which allows to tune up memory utilization.  The  user  should  set  the  value
       based  on  the  characteristics  of application that is using the library (e.g. prioritize
       memory usage, CPU utilization), for more details about policy see the MEMORY USAGE  POLICY
       section below.  Note: This function does not validate that policy is in valid range.

       KIND MANAGEMENT:
       There  are  built-in kinds that are always available and these are enumerated in the KINDS
       section. The user can also create their own kinds of memory. This  section  describes  the
       API's  that  enable  the  tracking  of the different kinds of memory and determining their
       properties.

       memkind_create_fixed() is a function used to create a kind under  user-specified  area  of
       memory.  The  memory can be allocated in any possible way, e.g. it might be a static array
       or an mmapped area. User can specify any properties using functions such as mbind. User is
       also  responsible  for de-allocation of memory after the kind destruction. The memory area
       must remain valid until fixed_kind is destroyed. The area starts at address addr  and  has
       size  size.   When  heap manager runs out of memory (located under user-specified area), a
       call to memkind_malloc() returns NULL and errno is set to ENOMEM.

       memkind_create_pmem() is a convenient function  used  to  create  a  file-backed  kind  of
       memory.  It allocates a temporary file in the given directory dir.  The file is created in
       a fashion similar to tmpfile(3), so that the file name does not appear when the  directory
       is  listed  and the space is automatically freed when the program terminates.  The file is
       truncated to a size of max_size bytes and the resulting space is memory-mapped.
       Note that the actual file system space is not allocated immediately, but only on a call to
       memkind_pmem_mmap()  (see  memkind_pmem(3)).   This  allows  to create a pmem memkind of a
       pretty large size without the need to reserve in advance  the  corresponding  file  system
       space for the entire heap. If the value of max_size equals 0, pmem memkind is only limited
       by the capacity of the file system mounted under dir argument.  The minimum max_size value
       which allows to limit the size of kind by the library is defined as MEMKIND_PMEM_MIN_SIZE.
       Calling memkind_create_pmem() with a size smaller than that  and  different  than  0  will
       return  an  error.   The  maximum  allowed size is not limited by memkind, but by the file
       system specified by the dir argument.  The max_size passed in  is  the  raw  size  of  the
       memory  pool  and jemalloc will use some of that space for its own metadata.  Returns zero
       if the pmem memkind is created successfully or an error code from the  ERRORS  section  if
       not.

       memkind_create_pmem_with_config()  is  a second function used to create a file-backed kind
       of memory.  Function behaves simillar to memkind_create_pmem() but instead of passing  dir
       and  max_size  arguments, it uses config param to specify characteristics of created file-
       backed kind of memory (see KIND CONFIGURATION MANAGEMENT section).

       memkind_create_kind() creates kind that allocates memory with specific memory type, memory
       binding  policy and flags (see MEMORY FLAGS section).  The memtype_flags (see MEMORY TYPES
       section) determine memory types to allocate, policy argument is policy for specifying page
       binding  to memory types selected by memtype_flags.  Returns zero if the specified kind is
       created successfully or an error code from the ERRORS section if not.

       memkind_destroy_kind() destroys previously created  kind  object,  which  must  have  been
       returned by a previous call to memkind_create_pmem(), memkind_create_pmem_with_config() or
       memkind_create_kind().  Otherwise, or if  memkind_destroy_kind(kind)  was  already  called
       before,   undefined   behavior   occurs.   Note  that,  when  the  kind  was  returned  by
       memkind_create_kind() all allocated  memory  must  be  freed  before  kind  is  destroyed,
       otherwise this will cause memory leak. When the kind was returned by memkind_create_pmem()
       or memkind_create_pmem_with_config() all allocated memory will be freed after kind will be
       destroyed.

       memkind_check_available() returns zero if the specified kind is available or an error code
       from the ERRORS section if it is not.

       memkind_get_capacity() returns memory capacity of nodes available to a  given  kind  (file
       size  or  filesystem  capacity  in case of a file-backed PMEM kind; total area size in the
       case of fixed-kind) or -1 in case of an  error.   Supported  kinds  are:  MEMKIND_DEFAULT,
       MEMKIND_HIGHEST_CAPACITY,   MEMKIND_HIGHEST_CAPACITY_LOCAL,  MEMKIND_LOWEST_LATENCY_LOCAL,
       MEMKIND_HIGHEST_BANDWIDTH_LOCAL,   MEMKIND_HUGETLB,    MEMKIND_INTERLEAVE,    MEMKIND_HBW,
       MEMKIND_HBW_ALL,     MEMKIND_HBW_INTERLEAVE,    MEMKIND_DAX_KMEM,    MEMKIND_DAX_KMEM_ALL,
       MEMKIND_DAX_KMEM_INTERLEAVE, MEMKIND_REGULAR , file-backed  PMEM  and  fixed-kind.   kind.
       For MEMKIND_HUGETLB only pages with a default size of 2MB are supported.

       memkind_check_dax_path()  returns  zero  if  file-backed  kind  memory is in the specified
       directory path pmem_dir can be created with the DAX attribute or an error  code  from  the
       ERRORS section if it is not.

       MEMKIND_PMEM_MIN_SIZE  The  minimum  size  which  allows  to  limit the file-backed memory
       partition.

       STATISTICS:
       The functions described in this section define a way to  get  specific  memory  allocation
       statistics.

       memkind_update_cached_stats()  is  used  to  force  an  update of cached dynamic allocator
       statistics.  Statistics are not updated real-time  by  memkind  library  and  this  method
       allows to force its update.

       memkind_get_stat() retrieves statistic of the specified type and returns it in value.  For
       more details about stat see the MEMORY STATISTICS TYPE section below.  Measured  statistic
       applies to specific kind, when NULL is given as kind then statistic applies to memory used
       by the whole memkind library.  Note: You need to call memkind_update_cached_stats() before
       calling memkind_get_stat() because statistics are cached by memkind library.

       memkind_stats_print()  prints  summary statistics. This function wraps jemalloc's function
       je_malloc_stats_print().  Uses write_cb function to  print  the  output.  While  providing
       custom  writer  function,  use syscall(2) rather than write(2).  Pass NULL in order to use
       the default write_cb function  which  prints  the  output  to  the  stderr.  Use  cbopaque
       parameter  in  order  to pass some data to your write_cb function. Pass additional options
       using opts.  For more details on opts see the  MEMORY  STATISTICS  PRINT  OPTIONS  section
       below.  Returns MEMKIND_ERROR_INVALID when failed to parse options string, MEMKIND_SUCCESS
       on success.

       DECORATORS:
       The memkind library enables the user to define decorator  functions  that  can  be  called
       before  and  after each memkind heap management API. The decorators that are called at the
       beginning of the function end are named after that function with _pre appended to the name
       and  those  that  are called at the end of the function are named after that function with
       _post appended to the name. These are weak symbols and if they are  not  present  at  link
       time  they  are  not  called.  The memkind library does not define these symbols which are
       reserved for user definition.  These decorators can be used to track  calls  to  the  heap
       management  interface  or  to  modify  parameters.  The  decorators that are called at the
       beginning of the allocator pass all inputs by reference and the decorators that are called
       at the end of the allocator pass the output by reference. This enables the modification of
       the input and output of each heap management function by the decorators.

       ENHANCEMENTS:
       memkind_set_bg_threads() enables/disables internal background worker threads in jemalloc.

       LIBRARY VERSION:
       The memkind library version scheme consist major, minor and  patch  numbers  separated  by
       dot. Combining those numbers, we got the following representation:
       major.minor.patch, where:
            -major   number   is   incremented   whenever   API  is  changed  (loss  of  backward
       compatibility),
            -minor number  is  incremented  whenever  additional  extensions  are  introduced  or
       behavior has been changed,
            -patch number is incremented whenever small bug fixes are added.

       memkind  library  provide  numeric representation of the version by exposing the following
       API:

       memkind_get_version() returns version number  represented  by  a  single  integer  number,
       obtained from the formula:
       major * 1000000 + minor * 1000 + patch

       Note: major < 1 means unstable API.

       API standards:
       -STANDARD API, API is considered as stable
       -NON-STANDARD  API, API is considered as stable, however this is not a standard way to use
       memkind
       -EXPERIMENTAL API, API is considered as unstable and the subject to change

RETURN VALUE

       memkind_calloc(),  memkind_malloc(),  memkind_realloc()  and   memkind_defrag_reallocate()
       returns   the   pointer   to   the   allocated  memory  or  NULL  if  the  request  fails.
       memkind_malloc_usable_size() returns the number of usable bytes in the block of  allocated
       memory  pointed to by ptr, a pointer to a block of memory allocated by memkind_malloc() or
       a  related  function.   If   ptr   is   NULL,   0   is   returned.    memkind_free()   and
       memkind_error_message()  do not have return values.  All other memkind API's return 0 upon
       success and an error code defined in the ERRORS section upon failure.  The memkind library
       avoids  setting errno directly, but calls to underlying libraries and system calls may set
       errno (e.g.  memkind_create_pmem()).

KINDS

       The available kinds of memory:

       MEMKIND_DEFAULT
              Default allocation using standard memory and default page size.

       MEMKIND_HIGHEST_CAPACITY
              Allocate from a NUMA node(s) that has the highest capacity among all nodes  in  the
              system.

       MEMKIND_HIGHEST_CAPACITY_PREFERRED
              Same  as  MEMKIND_HIGHEST_CAPACITY except that if there is not enough memory in the
              NUMA node that has the highest capacity in the local domain to satisfy the request,
              the allocation will fall back on other memory NUMA nodes.  Note: For this kind, the
              allocation will not succeed if there are two or  more  NUMA  nodes  that  have  the
              highest capacity.

       MEMKIND_HIGHEST_CAPACITY_LOCAL
              Allocate  from  a NUMA node that has the highest capacity among all NUMA Nodes from
              the local domain.  NUMA Nodes have  the  same  local  domain  for  a  set  of  CPUs
              associated with them, e.g. socket or sub-NUMA cluster.  Note: If there are multiple
              NUMA nodes in the same local domain that have the  highest  capacity  -  allocation
              will  be  done  from  NUMA  node  with worse latency attribute.  This kind requires
              locality information described in SYSTEM CONFIGURATION section.

       MEMKIND_HIGHEST_CAPACITY_LOCAL_PREFERRED
              Same as MEMKIND_HIGHEST_CAPACITY_LOCAL except that if there is not enough memory in
              the  NUMA node that has the highest capacity to satisfy the request, the allocation
              will fall back on other memory NUMA nodes.

       MEMKIND_LOWEST_LATENCY_LOCAL
              Allocate from a NUMA node that has the lowest latency among all NUMA Nodes from the
              local  domain.   NUMA Nodes have the same local domain for a set of CPUs associated
              with them, e.g. socket or sub-NUMA cluster.  Note: If there are multiple NUMA nodes
              in  the  same  local  domain that have the lowest latency - allocation will be done
              from NUMA node with smaller memory  capacity.   This  kind  requires  locality  and
              memory  performance  characteristics  information described in SYSTEM CONFIGURATION
              section.

       MEMKIND_LOWEST_LATENCY_LOCAL_PREFERRED
              Same as MEMKIND_LOWEST_LATENCY_LOCAL except that if there is not enough  memory  in
              the  NUMA  node  that has the lowest latency to satisfy the request, the allocation
              will fall back on other memory NUMA nodes.

       MEMKIND_HIGHEST_BANDWIDTH_LOCAL
              Allocate from a NUMA node that has the highest bandwidth among all NUMA Nodes  from
              the  local  domain.   NUMA  Nodes  have  the  same  local  domain for a set of CPUs
              associated with them, e.g. socket or sub-NUMA cluster.  Note: If there are multiple
              NUMA  nodes  in  the same local domain that have the highest bandwidth - allocation
              will be done from NUMA node with  smaller  memory  capacity.   This  kind  requires
              locality  and  memory  performance  characteristics information described in SYSTEM
              CONFIGURATION section.

       MEMKIND_HIGHEST_BANDWIDTH_LOCAL_PREFERRED
              Same as MEMKIND_HIGHEST_BANDWIDTH_LOCAL except that if there is not  enough  memory
              in  the  NUMA  node  that  has  the  highest  bandwidth to satisfy the request, the
              allocation will fall back on other memory NUMA nodes.

       MEMKIND_HUGETLB
              Allocate from standard memory using huge pages.   Note:  This  kind  requires  huge
              pages configuration described in SYSTEM CONFIGURATION section.

       MEMKIND_GBTLB (DEPRECATED)
              Allocate  from  standard  memory using 1GB chunks backed by huge pages.  Note: This
              kind requires huge pages configuration described in SYSTEM CONFIGURATION section.

       MEMKIND_INTERLEAVE
              Allocate pages interleaved across  all  NUMA  nodes  with  transparent  huge  pages
              disabled.

       MEMKIND_HBW
              Allocate  from  the  closest  high  bandwidth  memory  NUMA  node(s) at the time of
              allocation. If there is not enough high bandwidth memory  to  satisfy  the  request
              errno  is  set to ENOMEM and the allocated pointer is set to NULL.  Note: This kind
              requires  memory  performance  characteristics  information  described  in   SYSTEM
              CONFIGURATION section.

       MEMKIND_HBW_ALL
              Same  as  MEMKIND_HBW  except  decision regarding closest NUMA node(s) is postponed
              until the time of first write.

       MEMKIND_HBW_HUGETLB
              Same as MEMKIND_HBW except the allocation is backed by huge pages.  Note: This kind
              requires huge pages configuration described in SYSTEM CONFIGURATION section.

       MEMKIND_HBW_ALL_HUGETLB
              Combination of MEMKIND_HBW_ALL and MEMKIND_HBW_HUGETLB properties.  Note: This kind
              requires huge pages configuration described in SYSTEM CONFIGURATION section.

       MEMKIND_HBW_PREFERRED
              Same as MEMKIND_HBW except that if there is not enough  high  bandwidth  memory  to
              satisfy  the  request, the allocation will fall back on standard memory.  Note: For
              this kind, the allocation will not succeed if two or  more  high  bandwidth  memory
              NUMA  nodes  are  in the same shortest distance to the same CPU on which process is
              eligible to run.  Check on that eligibility is done upon starting the application.

       MEMKIND_HBW_PREFERRED_HUGETLB
              Same as MEMKIND_HBW_PREFERRED except the allocation is backed by huge pages.  Note:
              This  kind  requires  huge  pages  configuration  described in SYSTEM CONFIGURATION
              section.

       MEMKIND_HBW_GBTLB (DEPRECATED)
              Same as MEMKIND_HBW except the allocation is backed by 1GB chunks  of  huge  pages.
              Note  that  size  can take on any value, but full gigabyte pages will allocated for
              each request, so remainder of the last page will be  wasted.   This  kind  requires
              huge pages configuration described in SYSTEM CONFIGURATION section.

       MEMKIND_HBW_PREFERRED_GBTLB (DEPRECATED)
              Same  as MEMKIND_HBW_GBTLB except that if there is not enough high bandwidth memory
              to satisfy the request, the allocation will fall back on  standard  memory.   Note:
              This  kind  requires  huge  pages  configuration  described in SYSTEM CONFIGURATION
              section.  For this kind, the allocation will  not  succeed  if  two  or  more  high
              bandwidth  memory  NUMA  nodes are in the same shortest distance to the same CPU on
              which process is eligible to run.  Check on that eligibility is done upon  starting
              the application.

       MEMKIND_HBW_INTERLEAVE
              Same  as  MEMKIND_HBW  except  that  the  pages  that  support  the  allocation are
              interleaved across  all  high  bandwidth  nodes  and  transparent  huge  pages  are
              disabled.

       MEMKIND_DAX_KMEM
              Allocate from the closest persistent memory NUMA node at the time of allocation. If
              there is not enough memory in the closest persistent memory NUMA  node  to  satisfy
              the request errno is set to ENOMEM and the allocated pointer is set to NULL.

       MEMKIND_DAX_KMEM_ALL
              Allocate  from  the  closest  persistent  memory NUMA node available at the time of
              allocation. If there is not enough memory on any of persistent memory NUMA nodes to
              satisfy  the  request  errno  is  set to ENOMEM and the allocated pointer is set to
              NULL.

       MEMKIND_DAX_KMEM_PREFERRED
              Same as MEMKIND_DAX_KMEM except that if there is not enough memory in  the  closest
              persistent  memory  NUMA node to satisfy the request, the allocation will fall back
              on other memory NUMA nodes.  Note: For this kind, the allocation will  not  succeed
              if  two  or  more persistent memory NUMA nodes are in the same shortest distance to
              the same CPU on which process is eligible to run.  Check  on  that  eligibility  is
              done upon starting the application.

       MEMKIND_DAX_KMEM_INTERLEAVE
              Same  as  MEMKIND_DAX_KMEM  except  that  the pages that support the allocation are
              interleaved across all persistent memory NUMA nodes.

       MEMKIND_REGULAR
              Allocate from regular memory using the default page  size.  Regular  means  general
              purpose memory from the NUMA nodes containing CPUs.

MEMORY TYPES

       The available types of memory:

       MEMKIND_MEMTYPE_DEFAULT
              Standard memory, the same as process uses.

       MEMKIND_MEMTYPE_HIGH_BANDWIDTH
              High bandwidth memory (HBM). There must be at least two memory types with different
              bandwidth to determine which is the HBM.

MEMORY BINDING POLICY

       The available types of memory binding policy:

       MEMKIND_POLICY_BIND_LOCAL
              Allocate local memory. If there is not enough memory to satisfy the  request  errno
              is set to ENOMEM and the allocated pointer is set to NULL.

       MEMKIND_POLICY_BIND_ALL
              Memory  locality  is  ignored. If there is not enough memory to satisfy the request
              errno is set to ENOMEM and the allocated pointer is set to NULL.

       MEMKIND_POLICY_PREFERRED_LOCAL
              Allocate preferred memory that is local.  If there is not enough  preferred  memory
              to  satisfy  the  request or preferred memory is not available, the allocation will
              fall back on any other memory.

       MEMKIND_POLICY_INTERLEAVE_LOCAL
              Interleave allocation across local memory.  For n memory types the allocation  will
              be interleaved across all of them.

       MEMKIND_POLICY_INTERLEAVE_ALL
              Interleave allocation. Locality is ignored.  For n memory types the allocation will
              be interleaved across all of them.

       MEMKIND_POLICY_MAX_VALUE
              Max policy value.

MEMORY FLAGS

       The available types of memory flags:

       MEMKIND_MASK_PAGE_SIZE_2MB
              Allocation backed by 2MB page size.

MEMORY USAGE POLICY

       The available types of memory usage policy:

       MEMKIND_MEM_USAGE_POLICY_DEFAULT
              Default memory usage policy.

       MEMKIND_MEM_USAGE_POLICY_CONSERVATIVE
              Conservative memory usage policy - prioritize memory usage at cost of  performance.
              Note:  Memory  usage  policies  have  no  effect  for TBB heap manager described in
              ENVIRONMENT section.

MEMORY STATISTICS TYPE

       The available types of memory statistics:

       MEMKIND_STAT_TYPE_RESIDENT
              Maximum number of bytes in physically resident data pages mapped.

       MEMKIND_STAT_TYPE_ACTIVE
              Total number of bytes in active pages.

       MEMKIND_STAT_TYPE_ALLOCATED
              Total number of allocated bytes.

MEMORY STATISTICS PRINT OPTIONS

       The available options for printing statistics:

       MEMKIND_STAT_PRINT_ALL
              Print all statistics.

       MEMKIND_STAT_PRINT_JSON_FORMAT
              Print statistics in JSON format.

       MEMKIND_STAT_PRINT_OMIT_GENERAL
              Omit general information that never changes during execution.

       MEMKIND_STAT_PRINT_OMIT_MERGED_ARENA
              Omit merged arena statistics.

       MEMKIND_STAT_PRINT_OMIT_DESTROYED_MERGED_ARENA
              Omit destroyed merged arena statistics.

       MEMKIND_STAT_PRINT_OMIT_PER_ARENA
              Omit per arena statistics.

       MEMKIND_STAT_PRINT_OMIT_PER_SIZE_CLASS_BINS
              Omit per size class statistics for bins.

       MEMKIND_STAT_PRINT_OMIT_PER_SIZE_CLASS_LARGE
              Omit per size class statistics for large objects.

       MEMKIND_STAT_PRINT_OMIT_MUTEX
              Omit all mutex statistics.

       MEMKIND_STAT_PRINT_OMIT_EXTENT
              Omit extent statistics.

ERRORS

       memkind_posix_memalign()
              returns the one of the POSIX standard error codes EINVAL or ENOMEM  as  defined  in
              <errno.h>  if  an  error  occurs  (these  have  positive values).  If the alignment
              parameter is not a power of two or is not a multiple of sizeof(void*), then  EINVAL
              is  returned. If there is insufficient memory to satisfy the request then ENOMEM is
              returned.

       All functions other than memkind_posix_memalign() which have an integer return type return
       one of the negative error codes as defined in <memkind.h> and described below.

       MEMKIND_ERROR_UNAVAILABLE
              Requested memory kind is not available

       MEMKIND_ERROR_MBIND
              Call to mbind(2) failed

       MEMKIND_ERROR_MMAP
              Call to mmap(2) failed

       MEMKIND_ERROR_MALLOC
              Call to jemalloc's malloc() failed

       MEMKIND_ERROR_ENVIRON
              Error parsing environment variable MEMKIND_*

       MEMKIND_ERROR_INVALID
              Invalid input arguments to memkind routine

       MEMKIND_ERROR_TOOMANY
              Error trying to initialize more than maximum MEMKIND_MAX_KIND number of kinds

       MEMKIND_ERROR_BADOPS
              Error memkind operation structure is missing or invalid

       MEMKIND_ERROR_HUGETLB
              Unable to allocate huge pages

       MEMKIND_ERROR_MEMTYPE_NOT_AVAILABLE
              Error requested memory type is not available

       MEMKIND_ERROR_OPERATION_FAILED
              Error memkind operation failed

       MEMKIND_ERROR_ARENAS_CREATE
              Call to jemalloc's arenas.create() failed

       MEMKIND_ERROR_RUNTIME
              Unspecified run-time error

FILES

       /usr/bin/memkind-hbw-nodes
              Prints a comma-separated list of high bandwidth nodes.

       /usr/bin/memkind-auto-dax-kmem-nodes
              Prints   a  comma-separated  list  of  persistent  memory  NUMA  nodes,  which  are
              automatically detected.

ENVIRONMENT

       MEMKIND_HBW_NODES
              This environment variable is a comma-separated list of NUMA nodes that are  treated
              as high bandwidth. Uses the libnuma routine numa_parse_nodestring() for parsing, so
              the syntax described in the numa(3) man page for this routine applies:  e.g.  1-3,5
              is a valid setting.

       MEMKIND_HBW_THRESHOLD
              This  environment  variable  is  bandwidth  in  MB/s  that  is  the  threshold  for
              identifying high bandwidth memory. The default  threshold  is  204800  (200  GB/s),
              which  is  used  if  this variable is not set. When set, it must be greater than or
              equal to 0.

       MEMKIND_DAX_KMEM_NODES
              This environment variable is a comma-separated list of NUMA nodes that are  treated
              as  PMEM  memory.  Uses the libnuma routine numa_parse_nodestring() for parsing, so
              the syntax described in the numa(3) man page for this routine applies:  e.g.  1-3,5
              is a valid setting.

       MEMKIND_ARENA_NUM_PER_KIND
              This  environment  variable allows leveraging internal mechanism of the library for
              setting number of arenas per kind. Value should be a positive integer (not  greater
              than  INT_MAX  defined  in <limits.h>).  The user should set the value based on the
              characteristics of application that is using the library. Higher value can  provide
              better  performance  in  extremely multithreaded applications at the cost of memory
              overhead. See section IMPLEMENTATION NOTES of jemalloc(3) for  more  details  about
              arenas.

       MEMKIND_HOG_MEMORY
              Controls  behavior  of  memkind  with regards to returning memory to underlying OS.
              Setting MEMKIND_HOG_MEMORY to 1 causes memkind to  not  release  memory  to  OS  in
              anticipation  of  memory reuse soon. This will improve latency of 'free' operations
              but increase memory usage.  Note: For file-backed kind memory will be  released  to
              OS  only  after  calling  memkind_destroy_kind(),  not  after 'free' operations. In
              context of MEMKIND_MEM_USAGE_POLICY_CONSERVATIVE memory usage policy - it will also
              impact memory coalescing and results that blocks pages will be often reused (better
              memory usage at cost of performance).

       MEMKIND_DEBUG
              Controls logging mechanism in memkind. Setting MEMKIND_DEBUG to 1 enables  printing
              messages like errors and general information about environment to stderr.

       MEMKIND_BACKGROUND_THREAD_LIMIT
              Enable  background  worker threads.  Value should be from range 0 to maximum number
              of cpus.  Setting MEMKIND_BACKGROUND_THREAD_LIMIT  to  specific  value  will  limit
              maximum  number of background worker threads to this value.  0 means maximum number
              of background worker threads will be limited to maximum number of cpus.

       MEMKIND_HEAP_MANAGER
              Controls heap management behavior in memkind library by switching  to  one  of  the
              available heap managers.
              Values:
                  JEMALLOC - sets the jemalloc heap manager
                  TBB  -  sets  the  Intel  Threading  Building  Blocks heap manager. This option
              requires installed
                  Intel Threading Building Blocks library.

       If the MEMKIND_HEAP_MANAGER is not set then the jemalloc heap  manager  will  be  used  by
       default.

SYSTEM CONFIGURATION

       Interfaces  for  obtaining  2MB (HUGETLB) memory need allocated huge pages in the kernel's
       huge page pool.

       HUGETLB (huge pages)
              Current   number   of    "persistent"    huge    pages    can    be    read    from
              /proc/sys/vm/nr_hugepages  file.  Proposed way of setting hugepages is: sudo sysctl
              vm.nr_hugepages=<number_of_hugepages>.   More  information  can  be   found   here:
              ⟨https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt⟩

       Interfaces  for  obtaining  locality  information  are  provided  by  libhwloc dependency.
       Functionality based on locality requires that memkind library is configured and built with
       the support of libhwloc (./configure --enable-hwloc).

       Interfaces  for obtaining memory performance characteristics information are based on HMAT
       (Heterogeneous                  Memory                  Attribute                   Table)
       ⟨https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf⟩    Functionality
       based on memory performance characteristics requires  that  platform  configuration  fully
       supports  HMAT  and  memkind  library is configured and built with the support of libhwloc
       (./configure --enable-hwloc).

       Note: For a given target NUMA Node, the OS exposes only the performance characteristics of
       the best performing NUMA node.

       libhwloc can be reached on: ⟨https://www.open-mpi.org/projects/hwloc⟩

STATIC LINKING

       When  linking  statically  against  memkind, libmemkind.a should be used together with its
       dependencies libnuma and pthread. Pthread can be linked by adding  /usr/lib64/libpthread.a
       as  a  dependency  (exact  path may vary). Typically libnuma will need to be compiled from
       sources  to  use  it  as  a  static  dependency.   libnuma  can  be  reached  on   GitHub:
       ⟨https://github.com/numactl/numactl⟩

KNOWN ISSUES

       HUGETLB (huge pages)
              There  might  be some overhead in huge pages consumption caused by heap management.
              If your allocation fails because of OOM, please try to allocate  extra  huge  pages
              (e.g. 8 huge pages).

COPYRIGHT

       Copyright (C) 2014 - 2021 Intel Corporation. All rights reserved.

SEE ALSO

       malloc(3),   malloc_usable_size(3),  numa(3),  hwloc(3),  numactl(8),  mbind(2),  mmap(2),
       move_pages(2),  jemalloc(3),  memkind_dax_kmem(3),  memkind_default(3),  memkind_arena(3),
       memkind_fixed(3),   memkind_hbw(3),   memkind_hugetlb(3),   memkind_pmem(3),   syscall(2),
       write(2)