oracular (3) memkindallocator.3.gz

Provided by: libmemkind-dev_1.14.0-3build1_amd64 bug

NAME

       libmemkind::static_kind::allocator<T>  -  The  C++  allocator  compatible  with  the C++ standard library
       allocator concepts
       Note: memkind_allocator.h functionality is considered as stable API (STANDARD API).

SYNOPSIS

       #include <memkind_allocator.h>

       Link with -lmemkind

       libmemkind::static_kind::allocator(libmemkind::kinds kind);
       template <typename U> libmemkind::static_kind::allocator<T>::allocator(const libmemkind::static_kind::allocator<U>&) noexcept;
       template <typename U> libmemkind::static_kind::allocator(const allocator<U>&& other) noexcept;
       libmemkind::static_kind::allocator<T>::~allocator();
       T *libmemkind::static_kind::allocator<T>::allocate(std::size_t n) const;
       void libmemkind::static_kind::allocator<T>::deallocate(T *p, std::size_t n) const;
       template <class U, class... Args> void libmemkind::static_kind::allocator<T>::construct(U *p, Args... args) const;
       void libmemkind::static_kind::allocator<T>::destroy(T *p) const;

DESCRIPTION

       The libmemkind::static_kind::allocator<T> is intended to be used with STL  containers  to  allocate  from
       static  kinds  memory.  Memory management is based on memkind library. Refer memkind(3) man page for more
       details.

       The libmemkind::kinds specifies allocator static kinds of  memory,  representing  type  of  memory  which
       offers different characteristics. The available types of allocator kinds of memory:

       libmemkind::kinds::DEFAULT Default allocation using standard memory and default page size.

       libmemkind::kinds::HIGHEST_CAPACITY  Allocate from a NUMA node(s) that has the highest capacity among all
       nodes in the system.

       libmemkind::kinds::HIGHEST_CAPACITY_PREFERRED Same as libmemkind::kinds::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.

       libmemkind::kinds::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.

       libmemkind::kinds::HIGHEST_CAPACITY_LOCAL_PREFERRED   Same  as  libmemkind::kinds::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.

       libmemkind::kinds::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.

       libmemkind::kinds::LOWEST_LATENCY_LOCAL_PREFERRED Same as libmemkind::kinds::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.

       libmemkind::kinds::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.

       libmemkind::kinds::HIGHEST_BANDWIDTH_LOCAL_PREFERRED  Same  as libmemkind::kinds::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.

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

       libmemkind::kinds::INTERLEAVE Allocate pages interleaved across all  NUMA  nodes  with  transparent  huge
       pages disabled.

       libmemkind::kinds::HBW  Allocate  from  the  closest  high  bandwidth  memory  NUMA  node  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.

       libmemkind::kinds::HBW_ALL Same as libmemkind::kinds::HBW except decision regarding closest NUMA node  is
       postponed until the time of first write.

       libmemkind::kinds::HBW_HUGETLB  Same  as  libmemkind::kinds::HBW  except the allocation is backed by huge
       pages. Note: This kind requires huge pages configuration described in SYSTEM CONFIGURATION section.

       libmemkind::kinds::HBW_ALL_HUGETLB       Combination       of       libmemkind::kinds::HBW_ALL        and
       libmemkind::kinds::HBW_HUGETLB properties. Note: This kind requires huge pages configuration described in
       SYSTEM CONFIGURATION section.

       libmemkind::kinds::HBW_PREFERRED Same as libmemkind::kinds::HBW except that if there is not  enough  high
       bandwidth memory to satisfy the request, the allocation will fall back on standard memory.

       libmemkind::kinds::HBW_PREFERRED_HUGETLB  Same  as libmemkind::kinds::HBW_PREFERRED except the allocation
       is backed by huge  pages.  Note:  This  kind  requires  huge  pages  configuration  described  in  SYSTEM
       CONFIGURATION section.

       libmemkind::kinds::HBW_INTERLEAVE  Same  as libmemkind::kinds::HBW except that the pages that support the
       allocation are interleaved across all high bandwidth nodes and transparent huge pages are disabled.

       libmemkind::kinds::REGULAR Allocate from regular memory  using  the  default  page  size.  Regular  means
       general purpose memory from the NUMA nodes containing CPUs.

       libmemkind::kinds::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.

       libmemkind::kinds::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.

       libmemkind::kinds::DAX_KMEM_PREFERRED  Same  as  libmemkind::kinds::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.

       libmemkind::kinds::DAX_KMEM_INTERLEAVE  Same  as  libmemkind::kinds::DAX_KMEM  except that the pages that
       support the allocation are interleaved across all persistent memory NUMA nodes.

       All public member types and functions correspond to standard library allocator concepts and  definitions.
       The current implementation supports C++11 standard.

       Template arguments:
       T is an object type aliased by value_type.
       U is an object type.

       Note:
       T     *libmemkind::static_kind::allocator<T>::allocate(std::size_t     n)    allocates    memory    using
       memkind_malloc().  Throw std::bad_alloc when:
              n = 0
              or there is not enough memory to satisfy the request.

       libmemkind::static_kind::allocator<T>::deallocate(T *p, std::size_t n) deallocates memory associated with
       pointer returned by allocate() using memkind_free().

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⟩

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

SEE ALSO

       memkind(3)