Provided by: libmemkind-dev_1.1.0-0ubuntu1_amd64 bug

NAME

       memkind - Heap manager that enables allocations to memory with different properties.
       This  header  expose  EXPERIMENTAL  API  in except of STANDARD API placed in section LIBRARY VERSION. API
       Standards are described below in this man page.

SYNOPSIS

       #include <memkind.h>

       Link with -lmemkind

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

       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);
       int memkind_posix_memalign(memkind_t kind, void **memptr, size_t alignment, size_t size);
       void memkind_free(memkind_t kind, void *ptr);

       ALLOCATOR CALLBACK FUNCTION:
       void *memkind_partition_mmap(int partition, void *addr, size_t size);

       KIND MANAGMENT:
       int memkind_create(const struct memkind_ops *ops, const char *name, memkind_t *kind);
       int memkind_create_pmem(const char *dir, size_t max_size, memkind_t *kind);
       int memkind_finalize(void);
       int memkind_get_num_kind(int *num_kind);
       int memkind_get_kind_by_partition(int partition, memkind_t *kind);
       int memkind_get_kind_by_name(const char *name, memkind_t *kind);
       int memkind_get_size(memkind_t kind, size_t *total, size_t *free);
       int memkind_check_available(memkind_t kind);

       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);

       LIBRARY VERSION:
       int memkind_get_version();

DESCRIPTION

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

       HEAP MANAGMENT:
       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.

       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 are 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 high bandwidth 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.   The  address  ptr,  if  not NULL, must have been returned by a previous call to memkind_malloc(),
       memkind_calloc(), memkind_realloc(), 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.

       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 NULL.

       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(), 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.   The value of
       MEMKIND_DEFAULT can be given as the kind for all buffers allocated by a kind that leverages the  jemalloc
       allocator.  This includes all interally defined kinds other than those that use gigabyte pages.  In cases
       where  the  kind  is  unknown  in  the  context  of the call to memkind_free() 0 can be given as the kind
       specified to memkind_free() but this will require a look up that can be bypassed by specifying a non-zero
       value.

       ALLOCATOR CALLBACK FUNCTION:
       This section describes the memkind interface which is used internally by the heap manager.  For this  API
       the kind is determined by the partition index.  This enables the underlying heap manager to call routines
       with  standard  type  arguments,  and  allows  the  heap  manager implementation to be independent of the
       specifics of the memkind_t implementation.  Currently there is only one callback function.

       memkind_partition_mmap() which is a wrapper around the mmap(2) system call.  The hint  address  addr  and
       the  length in bytes of the buffer to be allocated size are passed through to mmap(2).  The other mmap(2)
       parameters are determined by the kind operations.

       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() is used to create a new kind of memory.  It takes as input a pointer to a vtable  called
       ops  that  determines  the operations that define the kind of memory.  These operations can be taken from
       one of the memkind  built-in  implementations  defined  in  the  memkind  headers,  or  it  can  be  user
       implemented.   The requirements for each operation is defined in the MEMKIND OPERATIONS section.  See the
       SEE ALSO section for the list of memkind header files that implement the built-in operations: each header
       has a man page.

       memkind_create_pmem() is a convenience 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.  Then, the actual pmem kind is created by calling  memkind_create()
       with a unique name string ("pmemXXXXXXXX"), and the pointer to MEMKIND_PMEM_OPS as ops argument.
       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.  The
       minimum max_size value allowed by the library is defined in  <memkind_pmem.h>  as  MEMKIND_PMEM_MIN_SIZE.
       Calling  memkind_create_pmem()  with  a size smaller than that 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.

       memkind_finalize() releases all resources associated with the memkind library including the resouces used
       by all of the kinds that were created, but it does not free memory allocated  with  the  HEAP  MANAGEMENT
       interface.   This must be the last call to the memkind library before application termination, but it can
       be called more than once.

       memkind_get_num_kind() sets num_kind to the number of available kinds of memory.  This accounts  for  the
       built-in  static  kinds  and  any dynamically created kinds.  Since there is a one-to-one mapping between
       partitions and kinds, this is also the number of partitions.

       memkind_get_kind_by_partition() sets kind to the memory kind associated with the  partition  index  which
       must  be  in  the range [0, num_kind - 1] where num_kind can be retrieved with the memkind_get_num_kind()
       function.

       memkind_get_kind_by_name() sets kind to the memory kind associated with the name string  specified.   All
       of  the  built-in  kinds  have  name  strings  that are the lower-case version of name given in the KINDS
       section (for example: MEMKIND_DEFAULT has name "memkind_default")

       memkind_get_size() sets total to the number of bytes on the  system  which  can  be  allocated  with  the
       specified  kind,  and sets free to the number of unallocated bytes available of memory with the specified
       kind.

       Note: These numbers may be specific to the CPU of the calling thread if the kind  binds  memory  to  NUMA
       nodes associated with the CPU.

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

       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.

       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:
       int memkind_get_version() return 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

       MEMKIND OPERATIONS:
       The  memkind_ops  structure  is  a vtable that defines the operations which determine the kind of memory.
       This design pattern is modeled after the "mix-in" pattern used in the Linux kernel to enable some of  the
       features  of  an  object  oriented  language  in  C.   This  section  defines  the  inputs,  outputs  and
       responsiblities of each function pointer enumerated in the memkind_ops structure.  Each of these  methods
       takes a memkind_t argument as its first parameter which shall be self referencing.  In this documentation
       the  function  pointers  in  the  memkind_ops  structure  will  be  prepended  with "ops."  and should be
       considered the operation associated with the kind.

       int ops.create(memkind_t kind, const struct memkind_ops *ops, const char *name);
       shall instantiate all of the dynamic resources associated with the kind.   It  takes  a  pointer  to  the
       vtable  structure ops which has a function pointer for each of methods defined in this section of the man
       page.  If any methods are unnessary to the implementation of the kind these function  pointers  shall  be
       set  to NULL.  The name string is an input parameter that identifies the kind of memory so that it can be
       fetched with the memkind_get_kind_by_name() function.  Typically this method is either a pointer  to  the
       function   memkind_default_create()   defined   in   <memkind_default.h>,   or   a  function  that  calls
       memkind_default_create() before performing other setup.

       int ops.destroy(memkind_t kind);
       shall free all of the dynamic resources reserved by the ops.create() method.   If  no  dynamic  resources
       were explicitly allocated in the ops.create() method, this pointer can be set to NULL.

       void *ops.malloc(memkind_t kind, size_t size);
       shall implement memkind_malloc(), as described above.

       void *ops.calloc(memkind_t kind, size_t num, size_t size);
       shall implement memkind_calloc(), as described above.

       int ops.posix_memalign(memkind_t kind, void **memptr, size_t alignment, size_t size);
       shall implement memkind_posix_memalign(), as described above.

       void *ops.realloc(memkind_t kind, void *ptr, size_t size);
       shall implement memkind_realloc(), as described above.

       void ops.free(memkind_t kind, void *ptr);
       shall implement memkind_free(), as described above.

       void  *ops.mmap(memkind_t  kind, void *addr, size_t size); shall wrap the mmap(2) mbind(2) and madvise(2)
       system calls while passing addr and size  through  and  determining  all  other  parameters  for  mmap(2)
       mbind(2)  and madvise(2) by calling other functions resolved by the kind.ops vtable.  This function shall
       return a virtual address to the memory mapped, or MAP_FAILED as defined in <sys/mman.h> which is (void *)
       -1.

       int ops.mbind(memkind_t kind, void *ptr, size_t size);
       shall wrap the mbind(2) system call and pass through the start address ptr to be bound, and the number of
       bytes size from that address to be bound.  The other parmeters to mbind(2) shall be determined by calling
       other functions resolved by the kind.ops vtable.

       int ops.madvise(memkind_t kind, void *addr, size_t size);
       shall wrap the madvise(2) system call and pass through the start address addr  to  be  advised,  and  the
       number  of  bytes  size  from  that  address to be advised.  This may call madvise(2) multiple times with
       different advice.

       int ops.get_mmap_flags(memkind_t kind, int *flags);
       shall set flags to a value appropriate for passing to the mmap(2) system call for the kind.

       int ops.get_mbind_mode(memkind_t kind, int *mode);
       shall set mode to a value appropriate for passing to the mmap(2) system call for the kind.

       int ops.get_mbind_nodemask(memkind_t kind, unsigned long *nodemask, unsigned long maxnode);
       shall set the nodemask of length maxnode bits to a value appropriate for passing to the  mbind(2)  system
       call for the kind.

       int ops.get_arena(memkind_t kind, unsigned int *arena," size_t size);
       shall  set  arena  to an index appropriate for the kind, allocation size, and CPU when using the jemalloc
       arena allocation through the jemk_mallocx() API. Size parameter is not used at the moment,  but  will  be
       necesary for integration with jemalloc 4.0.x (planned for one of the future releases).

       int ops.get_size(memkind_t kind, size_t *total, size_t *free);
       shall implement memkind_get_size(), as described above.

       int ops.check_available(memkind_t kind);
       shall return 0 if the kind is available on the system, and an error code if not.

       int ops.check_addr(memkind_t kind, void *addr);
       shall  return  0  if  the  addr can be freed with the specified kind and an error code otherwise.  If the
       memory cannot be freed with jemk_free(), then at least one of the instantiated kinds  must  return  0  to
       enable freeing.

       void ops.init_once(void);
       this  function  pointer  shall  be  set to NULL for any kind that is not built-in.  The method is used to
       allocate dynamic resources for built-in kinds without requiring and initialization routine.

RETURN VALUE

       memkind_calloc(), memkind_malloc(), and memkind_realloc(), return the pointer to the allocated memory, or
       NULL if the request fails.  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.

KINDS

       The available kinds of memory

       MEMKIND_DEFAULT
              Default allocation using standard memory and default page size.

       MEMKIND_HUGETLB
              Allocate from standard memory using huge pages.

       MEMKIND_GBTLB
              Allocate from standard memory using giga byte huge pages.

       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 at time of allocation. If there  is  not
              enough  high  bandwidth  memory  to  satisfy  the request errno is set to ENOMEM and the allocated
              poitner is set to NULL.

       MEMKIND_HBW_HUGETLB
              Same as MEMKIND_HBW except the allocation is backed by huge pages.

       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.

       MEMKIND_HBW_PREFERRED_HUGETLB
              Same as MEMKIND_HBW_PREFERRED except the allocation is backed by huge pages.

       MEMKIND_HBW_GBTLB
              Same  as  MEMKIND_HBW  except the allocation is backed by one gigabyte 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. A good use case scenario is to grow a buffer in the course of an
              application with reallocs.  In this case, if there is enough memory available  within  in  already
              allocated  gigabyte  page,  newer  pages  are  not  fetched.  This is demonstrated in the examples
              directory with gb_realloc_example.c

       MEMKIND_HBW_PREFERRED_GBTLB
              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.

       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_PMEM
              Allocate from file-backed heap.  If the amount of allocated  memory  exceeds  the  total  size  of
              memory-mapped  file  associated  with  given  kind,  or  if the actual file system space cannot be
              allocated errno is set to ENOMEM and the allocated poitner is set to NULL.

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 sizoeof(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_MEMALIGN
              Call to jemk_posix_memalign() failed

       MEMKIND_ERROR_MALLCTL
              Call to jemk_mallctl() failed

       MEMKIND_ERROR_MALLOC
              Call to jemk_malloc() failed

       MEMKIND_ERROR_GETCPU
              Call to sched_getcpu() returned out of range

       MEMKIND_ERROR_TIEDISTANCE
              Two NUMA memory nodes are equidistant from target cpu node

       MEMKIND_ERROR_ALIGNMENT
              Alignment must be a power of two and larger than sizeof(void *)

       MEMKIND_ERROR_ALLOCM
              Call to jemk_allocm() failed

       MEMKIND_ERROR_ENVIRON
              Error parsing environment variable (MEMKIND_*)

       MEMKIND_ERROR_INVALID
              Invalid input arguments to memkind routine

FILES

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

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_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.

COPYRIGHT

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

SEE ALSO

       malloc(3),  numa(3),  numactl(8),  mbind(2),  mmap(2),  move_pages(2),  jemalloc(3),  memkind_default(3),
       memkind_arena(3), memkind_hbw(3), memkind_hugetlb(3), memkind_gbtlb(3), memkind_pmem(3)

Intel Corporation                                  2015-03-31                                         MEMKIND(3)