Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
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)
       static 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().

   static 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],	 [static]
       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.11.2	      hwlocality_membinding(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=hwloc_get_area_memlocation&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help