dwww Home | Manual pages | Find package

hwlocality_membinding(3)    Library Functions Manual   hwlocality_membinding(3)

NAME
       hwlocality_membinding - Memory binding

SYNOPSIS
   Enumerations
       enum hwloc_membind_policy_t { HWLOC_MEMBIND_DEFAULT,
           HWLOC_MEMBIND_FIRSTTOUCH, HWLOC_MEMBIND_BIND,
           HWLOC_MEMBIND_INTERLEAVE, HWLOC_MEMBIND_WEIGHTED_INTERLEAVE,
           HWLOC_MEMBIND_NEXTTOUCH, HWLOC_MEMBIND_MIXED }
       enum hwloc_membind_flags_t { HWLOC_MEMBIND_PROCESS,
           HWLOC_MEMBIND_THREAD, HWLOC_MEMBIND_STRICT, HWLOC_MEMBIND_MIGRATE,
           HWLOC_MEMBIND_NOCPUBIND, HWLOC_MEMBIND_BYNODESET }

   Functions
       int hwloc_set_membind (hwloc_topology_t topology, hwloc_const_bitmap_t
           set, hwloc_membind_policy_t policy, int flags)
       int hwloc_get_membind (hwloc_topology_t topology, hwloc_bitmap_t set,
           hwloc_membind_policy_t *policy, int flags)
       int hwloc_set_proc_membind (hwloc_topology_t topology, hwloc_pid_t pid,
           hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags)
       int hwloc_get_proc_membind (hwloc_topology_t topology, hwloc_pid_t pid,
           hwloc_bitmap_t set, hwloc_membind_policy_t *policy, int flags)
       int hwloc_set_area_membind (hwloc_topology_t topology, const void *addr,
           size_t len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy,
           int flags)
       int hwloc_get_area_membind (hwloc_topology_t topology, const void *addr,
           size_t len, hwloc_bitmap_t set, hwloc_membind_policy_t *policy, int
           flags)
       int hwloc_get_area_memlocation (hwloc_topology_t topology, const void
           *addr, size_t len, hwloc_bitmap_t set, int flags)
       void * hwloc_alloc (hwloc_topology_t topology, size_t len)
       void * hwloc_alloc_membind (hwloc_topology_t topology, size_t len,
           hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags)
       void * hwloc_alloc_membind_policy (hwloc_topology_t topology, size_t
           len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int
           flags)
       int hwloc_free (hwloc_topology_t topology, void *addr, size_t len)

Detailed Description
       Memory binding can be done three ways:

       • explicit   memory   allocation  thanks  to  hwloc_alloc_membind()  and
         friends: the binding will have effect on the memory allocated by these
         functions.

       • implicit memory binding through  binding  policy:  hwloc_set_membind()
         and  friends only define the current policy of the process, which will
         be applied to the subsequent calls to malloc() and friends.

       • migration     of     existing     memory     ranges,     thanks     to
         hwloc_set_area_membind()  and  friends,  which  move already-allocated
         data.

       Not    all    operating    systems    support    all     three     ways.
       hwloc_topology_get_support()  may  be  used  to  query  about the actual
       memory binding support in the currently used operating system.

       When  the  requested  binding  operation  is  not  available   and   the
       HWLOC_MEMBIND_STRICT  flag  was  passed,  the function returns -1. errno
       will be set to ENOSYS when the system does support the specified  action
       or  policy (e.g., some systems only allow binding memory on a per-thread
       basis, whereas other systems only allow binding memory for  all  threads
       in a process). errno will be set to EXDEV when the requested set can not
       be  enforced  (e.g.,  some systems only allow binding memory to a single
       NUMA node).

       If HWLOC_MEMBIND_STRICT was not passed, the function may fail  as  well,
       or  the  operating  system  may use a slightly different operation (with
       side-effects, smaller binding set, etc.) when the requested operation is
       not exactly supported.

       The most portable form that should be preferred over the others whenever
       possible is as follows. It allocates some memory hopefully bound to  the
       specified  set. To do so, hwloc will possibly have to change the current
       memory binding policy in order to actually get the memory bound, if  the
       OS  does  not  provide  any  other  way  to simply allocate bound memory
       without changing the policy for all allocations. That is the  difference
       with  hwloc_alloc_membind(),  which will never change the current memory
       binding policy.

       hwloc_alloc_membind_policy(topology, size, set,
                                  HWLOC_MEMBIND_BIND, 0);

       Each hwloc memory binding function takes a bitmap argument that is a CPU
       set  by  default,  or   a   NUMA   memory   node   set   if   the   flag
       HWLOC_MEMBIND_BYNODESET  is  specified.  See Object Sets (hwloc_cpuset_t
       and hwloc_nodeset_t) and The bitmap API for a discussion of CPU sets and
       NUMA memory node sets. It is also possible to convert  between  CPU  set
       and      node      set      using      hwloc_cpuset_to_nodeset()      or
       hwloc_cpuset_from_nodeset().

       Memory binding by CPU set cannot work for CPU-less  NUMA  memory  nodes.
       Binding by nodeset should therefore be preferred whenever possible.

       See also
           Some  example  codes are available under doc/examples/ in the source
           tree.

       Note
           On some operating systems, memory binding affects the  CPU  binding;
           see HWLOC_MEMBIND_NOCPUBIND

Enumeration Type Documentation
   enum hwloc_membind_flags_t
       Memory  binding  flags.  These  flags  can be used to refine the binding
       policy. All flags can be logically OR'ed together with the exception  of
       HWLOC_MEMBIND_PROCESS  and  HWLOC_MEMBIND_THREAD;  these  two  flags are
       mutually exclusive.

       Not    all     systems     support     all     kinds     of     binding.
       hwloc_topology_get_support()  may  be  used  to  query  about the actual
       memory binding support in the currently used operating system.  See  the
       'Detailed  Description'  section  of Memory binding for a description of
       errors that can occur.

       Enumerator

       HWLOC_MEMBIND_PROCESS
              Set  policy  for  all  threads   of   the   specified   (possibly
              multithreaded)  process.  This  flag  is  mutually exclusive with
              HWLOC_MEMBIND_THREAD.

       HWLOC_MEMBIND_THREAD
              Set policy for a specific thread of  the  current  process.  This
              flag is mutually exclusive with HWLOC_MEMBIND_PROCESS.

       HWLOC_MEMBIND_STRICT
              Request strict binding from the OS. The function will fail if the
              binding can not be guaranteed / completely enforced.

       This flag has slightly different meanings depending on which function it
       is used with.

       HWLOC_MEMBIND_MIGRATE
              Migrate  existing  allocated  memory.  If  the  memory  cannot be
              migrated and the HWLOC_MEMBIND_STRICT flag is  passed,  an  error
              will be returned.

       HWLOC_MEMBIND_NOCPUBIND
              Avoid  any effect on CPU binding. On some operating systems, some
              underlying memory binding functions also bind the application  to
              the  corresponding  CPU(s).  Using  this flag will cause hwloc to
              avoid using  OS  functions  that  could  potentially  affect  CPU
              bindings.  Note, however, that using NOCPUBIND may reduce hwloc's
              overall memory binding support.  Specifically:  some  of  hwloc's
              memory  binding  functions may fail with errno set to ENOSYS when
              used with NOCPUBIND.

       HWLOC_MEMBIND_BYNODESET
              Consider the bitmap argument as a nodeset. The bitmap argument is
              considered a nodeset if this flag is given, or a cpuset otherwise
              by default.

       Memory binding by CPU set cannot work for CPU-less  NUMA  memory  nodes.
       Binding by nodeset should therefore be preferred whenever possible.

   enum hwloc_membind_policy_t
       Memory binding policy. These constants can be used to choose the binding
       policy.  Only  one policy can be used at a time (i.e., the values cannot
       be OR'ed together).

       Not    all     systems     support     all     kinds     of     binding.
       hwloc_topology_get_support()  may  be  used  to  query  about the actual
       memory binding policy support in the currently  used  operating  system.
       See   the  'Detailed  Description'  section  of  Memory  binding  for  a
       description of errors that can occur.

       Enumerator

       HWLOC_MEMBIND_DEFAULT
              Reset  the  memory  allocation  policy  to  the  system  default.
              Depending  on  the  operating  system,  this  may  correspond  to
              HWLOC_MEMBIND_FIRSTTOUCH (Linux, FreeBSD), or  HWLOC_MEMBIND_BIND
              (AIX,  HP-UX, Solaris, Windows). This policy is never returned by
              get membind functions. The nodeset argument is ignored.

       HWLOC_MEMBIND_FIRSTTOUCH
              Allocate each memory page individually on the local NUMA node  of
              the  thread  that touches it. The given nodeset should usually be
              hwloc_topology_get_topology_nodeset() so that the touching thread
              may run and allocate on any node in the system.

       On AIX, if the nodeset is smaller, pages are allocated locally  (if  the
       local  node  is  in  the  nodeset)  or  from  a  random  non-local  node
       (otherwise).

       HWLOC_MEMBIND_BIND
              Allocate memory on the specified nodes. The actual  behavior  may
              slightly  vary  between  operating systems, especially when (some
              of) the requested nodes are  full.  On  Linux,  by  default,  the
              MPOL_PREFERRED_MANY  (or MPOL_PREFERRED) policy is used. However,
              if the hwloc strict flag  is  also  given,  the  Linux  MPOL_BIND
              policy is rather used.

       HWLOC_MEMBIND_INTERLEAVE
              Allocate  memory  on  the  given nodes in an interleaved / round-
              robin manner. The precise layout of the  memory  across  multiple
              NUMA nodes is OS/system specific. Interleaving can be useful when
              threads  distributed  across the specified NUMA nodes will all be
              accessing  the  whole  memory  range  concurrently,   since   the
              interleave will then balance the memory references.

       HWLOC_MEMBIND_WEIGHTED_INTERLEAVE
              Allocate  memory  on the given nodes in an interleaved / weighted
              manner. The precise layout of the  memory  across  multiple  NUMA
              nodes  is OS/system specific. Weighted interleaving can be useful
              when threads distributed across the  specified  NUMA  nodes  with
              different  bandwidth capabilities will all be accessing the whole
              memory range concurrently, since the interleave will then balance
              the memory references.

       HWLOC_MEMBIND_NEXTTOUCH
              For each page bound with this policy, by next time it is  touched
              (and  next  time  only), it is moved from its current location to
              the local NUMA node of the  thread  where  the  memory  reference
              occurred (if it needs to be moved at all).

       HWLOC_MEMBIND_MIXED
              Returned  by  get_membind()  functions  when  multiple threads or
              parts of a memory area have differing  memory  binding  policies.
              Also  returned  when binding is unknown because binding hooks are
              empty  when   the   topology   is   loaded   from   XML   without
              HWLOC_THISSYSTEM=1, etc.

Function Documentation
   void * hwloc_alloc (hwloc_topology_t topology, size_t len)
       Allocate  some  memory.  This  is equivalent to malloc(), except that it
       tries to allocate page-aligned memory from the OS.

       Returns
           a pointer to the allocated area, or NULL on error.

       Note
           The allocated memory should be freed with hwloc_free().

   void  *  hwloc_alloc_membind   (hwloc_topology_t   topology,   size_t   len,
       hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags)
       Allocate some memory on NUMA memory nodes specified by set.

       Returns
           a pointer to the allocated area.

           NULL  with  errno  set  to ENOSYS if the action is not supported and
           HWLOC_MEMBIND_STRICT is given.

           NULL with errno set to EXDEV if the binding cannot be  enforced  and
           HWLOC_MEMBIND_STRICT is given.

           NULL  with  errno set to ENOMEM if the memory allocation failed even
           before trying to bind.

       If HWLOC_MEMBIND_BYNODESET is specified, set is  considered  a  nodeset.
       Otherwise it's a cpuset.

       Note
           The allocated memory should be freed with hwloc_free().

   void  *  hwloc_alloc_membind_policy  (hwloc_topology_t topology, size_t len,
       hwloc_const_bitmap_t  set,  hwloc_membind_policy_t  policy,  int  flags)
       [inline]
       Allocate  some  memory on NUMA memory nodes specified by set. First, try
       to allocate properly with hwloc_alloc_membind(). On failure, the current
       process   or   thread   memory   binding   policy   is   changed    with
       hwloc_set_membind()  before  allocating memory. Thus this function works
       in more cases, at the expense of changing the  current  state  (possibly
       affecting future allocations that would not specify any policy).

       If  HWLOC_MEMBIND_BYNODESET  is  specified, set is considered a nodeset.
       Otherwise it's a cpuset.

       Returns
           a pointer to the allocated area, or NULL on error.

   int hwloc_free (hwloc_topology_t topology, void * addr, size_t len)
       Free  memory  that  was  previously  allocated   by   hwloc_alloc()   or
       hwloc_alloc_membind().

       Returns
           0 on success, -1 on error.

   int  hwloc_get_area_membind  (hwloc_topology_t  topology, const void * addr,
       size_t len, hwloc_bitmap_t set,  hwloc_membind_policy_t  *  policy,  int
       flags)
       Query  the CPUs near the physical NUMA node(s) and binding policy of the
       memory identified by (addr, len ). The bitmap set (previously  allocated
       by the caller) is filled with the memory area binding.

       This  function  has  two  output  parameters: set and policy. The values
       returned in these parameters depend on both the flags passed in and  the
       memory binding policies and nodesets of the pages in the address range.

       If HWLOC_MEMBIND_STRICT is specified, the target pages are first checked
       to  see  if they all have the same memory binding policy and nodeset. If
       they do not, -1 is returned and errno is  set  to  EXDEV.  If  they  are
       identical  across  all pages, the set and policy are returned in set and
       policy, respectively.

       If HWLOC_MEMBIND_STRICT is not specified, the union of all NUMA  node(s)
       containing pages in the address range is calculated. If all pages in the
       target have the same policy, it is returned in policy. Otherwise, policy
       is set to HWLOC_MEMBIND_MIXED.

       If  HWLOC_MEMBIND_BYNODESET  is  specified, set is considered a nodeset.
       Otherwise it's a cpuset.

       If any other flags are specified, -1 is returned and  errno  is  set  to
       EINVAL.

       Returns
           0 on success.

           -1 with errno set to EINVAL if len is 0.

   int  hwloc_get_area_memlocation  (hwloc_topology_t  topology,  const  void *
       addr, size_t len, hwloc_bitmap_t set, int flags)
       Get the NUMA nodes where memory identified by (addr, len ) is physically
       allocated. The bitmap set (previously allocated by the caller) is filled
       according to the NUMA nodes where the memory area pages  are  physically
       allocated. If no page is actually allocated yet, set may be empty.

       If  pages  spread  to  multiple  nodes, it is not specified whether they
       spread equitably, or whether most of them are on a single node, etc.

       The operating system may move memory pages from one processor to another
       at any time according to their binding,  so  this  function  may  return
       something that is already outdated.

       If  HWLOC_MEMBIND_BYNODESET  is  specified in flags, set is considered a
       nodeset. Otherwise it's a cpuset.

       If len is 0, set is emptied.

       Returns
           0 on success, -1 on error.

   int  hwloc_get_membind  (hwloc_topology_t  topology,   hwloc_bitmap_t   set,
       hwloc_membind_policy_t * policy, int flags)
       Query  the  default  memory  binding policy and physical locality of the
       current process or thread. The bitmap set (previously allocated  by  the
       caller) is filled with the process or thread memory binding.

       This  function  has  two  output  parameters: set and policy. The values
       returned in these parameters depend on both the flags passed in and  the
       current memory binding policies and nodesets in the queried target.

       Passing  the  HWLOC_MEMBIND_PROCESS flag specifies that the query target
       is the current policies and nodesets for all the threads in the  current
       process. Passing HWLOC_MEMBIND_THREAD specifies that the query target is
       the  current  policy  and  nodeset  for  only  the  thread invoking this
       function.

       If neither of these  flags  are  passed  (which  is  the  most  portable
       method), the process is assumed to be single threaded. This allows hwloc
       to  use  either process-based OS functions or thread-based OS functions,
       depending on which are available.

       HWLOC_MEMBIND_STRICT is only meaningful  when  HWLOC_MEMBIND_PROCESS  is
       also  specified.  In  this  case,  hwloc  will  check the default memory
       policies and nodesets for all threads in the process. If  they  are  not
       identical,  -1  is  returned  and  errno  is  set  to EXDEV. If they are
       identical, the values are returned in set and policy.

       Otherwise,    if     HWLOC_MEMBIND_PROCESS     is     specified     (and
       HWLOC_MEMBIND_STRICT is not specified), the default set from each thread
       is  logically  OR'ed  together. If all threads' default policies are the
       same, policy is set to that policy. If they are different, policy is set
       to HWLOC_MEMBIND_MIXED.

       In the HWLOC_MEMBIND_THREAD case (or when neither  HWLOC_MEMBIND_PROCESS
       or HWLOC_MEMBIND_THREAD is specified), there is only one set and policy;
       they are returned in set and policy, respectively.

       If  HWLOC_MEMBIND_BYNODESET  is  specified, set is considered a nodeset.
       Otherwise it's a cpuset.

       If any other flags are specified, -1 is returned and  errno  is  set  to
       EINVAL.

       Returns
           0 on success, -1 on error.

   int  hwloc_get_proc_membind  (hwloc_topology_t  topology,  hwloc_pid_t  pid,
       hwloc_bitmap_t set, hwloc_membind_policy_t * policy, int flags)
       Query the default memory binding policy and  physical  locality  of  the
       specified  process.  The bitmap set (previously allocated by the caller)
       is filled with the process memory binding.

       This function has two output parameters:  set  and  policy.  The  values
       returned  in these parameters depend on both the flags passed in and the
       current memory binding policies and nodesets in the queried target.

       Passing the HWLOC_MEMBIND_PROCESS flag specifies that the  query  target
       is  the  current  policies  and  nodesets  for  all  the  threads in the
       specified process. If HWLOC_MEMBIND_PROCESS is not specified  (which  is
       the most portable method), the process is assumed to be single threaded.
       This  allows  hwloc  to use either process-based OS functions or thread-
       based OS functions, depending on which are available.

       Note that it does not make sense to pass  HWLOC_MEMBIND_THREAD  to  this
       function.

       If  HWLOC_MEMBIND_STRICT  is  specified,  hwloc  will  check the default
       memory policies and nodesets for all threads in the  specified  process.
       If  they are not identical, -1 is returned and errno is set to EXDEV. If
       they are identical, the values are returned in set and policy.

       Otherwise, set is set to the logical OR of all threads' default set.  If
       all  threads'  default  policies  are  the  same,  policy is set to that
       policy. If they are different, policy is set to HWLOC_MEMBIND_MIXED.

       If HWLOC_MEMBIND_BYNODESET is specified, set is  considered  a  nodeset.
       Otherwise it's a cpuset.

       If  any  other  flags  are specified, -1 is returned and errno is set to
       EINVAL.

       Returns
           0 on success, -1 on error.

       Note
           hwloc_pid_t is pid_t on Unix platforms, and HANDLE on native Windows
           platforms.

   int hwloc_set_area_membind (hwloc_topology_t topology, const  void  *  addr,
       size_t len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int
       flags)
       Bind  the already-allocated memory identified by (addr, len) to the NUMA
       node(s) specified by set. If HWLOC_MEMBIND_BYNODESET is  specified,  set
       is considered a nodeset. Otherwise it's a cpuset.

       Returns
           0 on success or if len is 0.

           -1 with errno set to ENOSYS if the action is not supported.

           -1 with errno set to EXDEV if the binding cannot be enforced.

   int  hwloc_set_membind (hwloc_topology_t topology, hwloc_const_bitmap_t set,
       hwloc_membind_policy_t policy, int flags)
       Set the default memory binding policy of the current process  or  thread
       to   prefer   the   NUMA   node(s)   specified   by   set.   If  neither
       HWLOC_MEMBIND_PROCESS nor HWLOC_MEMBIND_THREAD is specified, the current
       process is assumed to be single-threaded. This is the most portable form
       as it permits hwloc to use either process-based OS functions or  thread-
       based OS functions, depending on which are available.

       If  HWLOC_MEMBIND_BYNODESET  is  specified, set is considered a nodeset.
       Otherwise it's a cpuset.

       Returns
           0 on success.

           -1 with errno set to ENOSYS if the action is not supported.

           -1 with errno set to EXDEV if the binding cannot be enforced.

   int  hwloc_set_proc_membind  (hwloc_topology_t  topology,  hwloc_pid_t  pid,
       hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags)
       Set the default memory binding policy of the specified process to prefer
       the  NUMA  node(s)  specified  by  set.  If  HWLOC_MEMBIND_BYNODESET  is
       specified, set is considered a nodeset. Otherwise it's a cpuset.

       Returns
           0 on success.

           -1 with errno set to ENOSYS if the action is not supported.

           -1 with errno set to EXDEV if the binding cannot be enforced.

       Note
           hwloc_pid_t is pid_t on Unix platforms, and HANDLE on native Windows
           platforms.

Author
       Generated automatically by Doxygen for Hardware  Locality  (hwloc)  from
       the source code.

Hardware Locality (hwloc)        Version 2.12.0        hwlocality_membinding(3)

Generated by dwww version 1.16 on Sat Oct 3 06:02:23 CEST 2026.