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

FreeBSD Manual Pages

  
 
  

home | help
HWLOC-BIND(1)			     hwloc			 HWLOC-BIND(1)

NAME
       hwloc-bind  -  Launch  a	 command  that is bound	to specific processors
       and/or memory, or consult the binding of	an existing program

SYNOPSIS
       hwloc-bind [topology options] [options] <location1> [<location2>	 [...]
       ] [--] <command>	...

       Note  that hwloc(7) provides a detailed explanation of the hwloc	system
       and of valid <location> formats;	it should be read before reading  this
       man page.

TOPOLOGY OPTIONS
       All topology options must be given before all other options.

       --no-smt, --no-smt=<N>
		 Only  keep  the  first	PU per core before binding.  If	<N> is
		 specified, keep the <N>-th instead, if	any.  PUs are  ordered
		 by physical index during this filtering.

		 Note  that  this option is applied after searching locations.
		 Hence --no-smt	pu:2-5 will first select the PUs #2 to	#5  in
		 the  machine  before  binding	on  one	 of them per core.  To
		 rather	bind on	PUs #2 to #5 after filtering one per core, you
		 should	combine	with hwloc-calc:

		   hwloc-bind $(hwloc-calc  --restrict	$(hwloc-calc  --no-smt
		 all) pu:2-5) -- echo hello

       --restrict <cpuset>
		 Restrict the topology to the given cpuset.  This removes some
		 PUs and their now-child-less parents.

		 Beware	 that restricting the PUs in a topology	may change the
		 logical indexes of many objects, including NUMA nodes.

       --restrict nodeset=<nodeset>
		 Restrict the topology to  the	given  nodeset	(unless	 --re-
		 strict-flags  specifies  something  different).  This removes
		 some NUMA nodes and their now-child-less parents.

		 Beware	that restricting the NUMA  nodes  in  a	 topology  may
		 change	the logical indexes of many objects, including PUs.

       --restrict-flags	<flags>
		 Enforce  flags	 when  restricting the topology.  Flags	may be
		 given as numeric values or as a comma-separated list of  flag
		 names	that  are  passed to hwloc_topology_restrict().	 Those
		 names may be substrings of actual flag	names  as  long	 as  a
		 single	 one matches, for instance bynodeset,memless.  The de-
		 fault is 0 (or	none).

       --disallowed
		 Include objects disallowed by administrative limitations.

       --best-memattr <name>
		 Select	the best NUMA node(s) among the	given  memory  binding
		 set by	looking	at the memory attribute	given by <name>	(or as
		 an index).

		 If  the  memory attribute values depend on the	initiator, the
		 CPU binding set is used as the	initiator.

		 Standard attribute names are Capacity,	 Locality,  Bandwidth,
		 and Latency.  All existing attributes in the current topology
		 may be	listed with

		     $ lstopo --memattrs

		 <name>	 may  be  suffixed with	flags to tune the selection of
		 best nodes, for instance as bandwidth,strict,default.

		 default means that default nodes  are	reported  if  no  best
		 could be found	(see --default-nodes). If neither best nor de-
		 fault nodes could be found, all local nodes are reported.

		 strict	 means	that  nodes are	selected only if their perfor-
		 mance is the best for all the input CPUs.  On	a  dual-socket
		 machine  with	HBM in each socket, both HBMs are the best for
		 their local socket, but not for  the  remote  socket.	 Hence
		 both  HBM  are	also considered	best for the entire machine by
		 default, but none if strict.

		 --default-nodes Only keep default NUMA	nodes.	 This  usually
		 includes DRAM memory nodes (or	nodes of the same memory tier)
		 rather	 than  nodes  with specific characteristics (HBM, NVM,
		 CXL, etc).  See hwloc_topology_get_default_nodeset() for  de-
		 tails.

       --hbm	 Only take high	bandwidth memory nodes (marked with "HBM" sub-
		 type,	or "MCDRAM" on Intel Xeon Phi) in account when looking
		 for NUMA nodes	in the input locations.

		 This option must be combined with NUMA	node  locations,  such
		 as  --hbm  numa:1 for binding on the second HBM node.	It may
		 also be written as numa[hbm]:1	or numa[mcdram]:1.

       --no-hbm	 Ignore	high bandwidth memory nodes (marked  with  "HBM"  sub-
		 type,	or "MCDRAM" on Intel Xeon Phi MCDRAM) when looking for
		 NUMA nodes in the input locations.

OPTIONS
       All these options must be given after all topology options above.

       --cpubind Use following arguments for CPU binding (default).

       --membind Use following arguments for memory binding.   If  --mempolicy
		 is not	also given, the	default	policy is bind.

       --mempolicy <policy>
		 Change	the memory binding policy.

		 This option is	only meaningful	when an	actual binding is also
		 given	with  --membind.  If --membind is given	without	--mem-
		 policy, the default policy is bind.

		 The available policies	are default, firsttouch, bind,	inter-
		 leave,	 weighted (interleave) and nexttouch.  See hwloc.h for
		 details about these policies.

		 Note that hwloc's memory binding  policies  may  be  slightly
		 different  from operating system policies.  For instance, the
		 hwloc	bind  policy  uses   Linux   MPOL_PREFERRED_MANY   (or
		 MPOL_PREFERRED)   by	default,  but  it  switches  to	 Linux
		 MPOL_BIND if the hwloc	strict option or flag is also given.

       --get	 Report	the current bindings.  The output is an	opaque bitmask
		 that may be translated	into objects with hwloc-calc (see  EX-
		 AMPLES	below).

		 When a	command	is given, the binding is displayed before exe-
		 cuting	the command. When no command is	given, the program ex-
		 its after displaying the current binding.

		 When  combined	 with --membind, report	the memory binding in-
		 stead of CPU binding.

		 No location may be given since	no binding is performed.

       --nodeset Report	binding	as a NUMA memory node set instead of a CPU set
		 if --get was given.  This is useful for manipulating CPU-less
		 NUMA nodes since their	cpuset is empty	while their nodeset is
		 correct.

		 Also parse input bitmasks as nodesets instead of cpusets.

		 When this option is not passed, individual input bitmasks may
		 still be parsed as nodesets if	they are prefixed  with	 node-
		 set=.

       -e --get-last-cpu-location
		 Report	the last processors where the process ran.  The	output
		 is an opaque bitmask that may be translated into objects with
		 hwloc-calc (see EXAMPLES below).

		 Note  that  the  result may already be	outdated when reported
		 since the operating system may	 move  the  process  to	 other
		 processors at any time	according to the binding.

		 When a	command	is given, the last processors is displayed be-
		 fore  executing  the  command.	 When no command is given, the
		 program exits after displaying	the last processors.

		 This option cannot be combined	with --membind.

		 No location may be given since	no binding is performed.

       --single	 Bind on a single CPU to prevent migration.

       --strict	 Require strict	binding.

       --pid <pid>
		 Operate on pid	<pid>

       --tid <tid>
		 Operate on thread <tid> instead of on an entire process.  The
		 feature is only supported on Linux for	thread CPU binding, or
		 for reporting the last	processor where	the thread ran	if  -e
		 was also passed.

       -p --physical
		 Interpret input locations with	OS/physical indexes instead of
		 logical  indexes.   This option does not apply	to the output,
		 see --get above.

       -l --logical
		 Interpret input locations with	 logical  indexes  instead  of
		 physical/OS indexes (default).	 This option does not apply to
		 the output, see --get above.

       --cpuset-output-format <hwloc|list|taskset> --cof <hwloc|list|taskset>
		 Change	 the  format of	CPUset or nodeset strings displayed by
		 --get,	-e, etc.  By default,  the  hwloc-specific  format  is
		 used.	 If  list is given, the	output is a comma-separated of
		 numbers or ranges, e.g. 2,4-5,8 .  If taskset is  given,  the
		 output	 is  compatible	with the taskset program (replaces the
		 former	--taskset option).

		 This option has no impact on the  format  of  input  CPU  set
		 strings, hwloc, list and taskset formats are always accepted.
		 In case of ambiguity, use hwloc-calc --cpuset-input-format.

       -f --force
		 Launch	the executable even if binding failed.

       -q --quiet
		 Hide  non-fatal error messages.  It includes locations	point-
		 ing to	non-existing objects, as  well	as  failure  to	 bind.
		 This is usually useful	in addition to --force.

       -v --verbose
		 Verbose output.

       --version Report	version	and exit.

       -h --help Display help message and exit.

DESCRIPTION
       hwloc-bind  execs  an executable	(with optional command line arguments)
       that is bound to	the specified location (or list	of locations).	 Loca-
       tion  specification  is	described in hwloc(7).	Upon successful	execu-
       tion, hwloc-bind	simply sets bindings and  then	execs  the  executable
       over itself.

       If a bitmask location is	given with prefix nodeset=, then it is consid-
       ered a nodeset instead of a CPU set. See	also --nodeset.

       If  multiple  locations	are given, they	are combined in	the sense that
       the binding will	be wider. The process will be allowed to run on	 every
       location	inside the combination.

       The list	of input locations may be explicitly ended with	"--".

       If  binding  fails, or if the binding set is empty, and --force was not
       given, hwloc-bind returns with an error instead of launching  the  exe-
       cutable.

       NOTE: It	is highly recommended that you read the	hwloc(7) overview page
       before  reading	this  man  page.   Most	 of  the concepts described in
       hwloc(7)	directly apply to the hwloc-bind utility.

EXAMPLES
       hwloc-bind's operation is  best	described  through  several  examples.
       More  details  about how	locations are specified	on the hwloc-bind com-
       mand line are described in hwloc(7).

       To run the echo command on the first logical processor  of  the	second
       package:

	   $ hwloc-bind	package:1.pu:0 -- echo hello

       which  is  exactly equivalent to	the following line as long as there is
       no ambiguity between hwloc-bind option names and	the  executed  command
       name:

	   $ hwloc-bind	package:1.pu:0 echo hello

       To  bind	the "echo" command to the first	core of	the second package and
       the second core of the first package:

	   $ hwloc-bind	package:1.core:0 package:0.core:1 -- echo hello

       To bind on the first PU of all cores of the first package:

	   $ hwloc-bind	package:0.core:all.pu:0	-- echo	hello
	   $ hwloc-bind	--no-smt package:0 -- echo hello

       The --get option	can report current bindings.  This example shows nest-
       ing hwloc-bind invocations to set a binding and then report it.

	   $ hwloc-bind	node:1.package:2 -- hwloc-bind --get
	   0x00004444,0x44000000

Examples with memory binding
       To bind on a specific node and let the operating	system place the  exe-
       cution accordingly:

	   $ hwloc-bind	--membind node:2 -- echo hello

       To  bind	 memory	on second memory node and run on first node (when sup-
       ported by the OS):

	   $ hwloc-bind	--cpubind node:1 --membind node:0 -- echo hello

       To bind on the memory node(s) local to a	PU with	largest	capacity:

	   $ hwloc-bind	 --best-memattr	 capacity  --cpubind  pu:23  --membind
       pu:23 --	echo hello

       To bind on the default memory node near a package:

	   $ hwloc-bind	--default-nodeset --membind package:1 -- echo hello

       To bind memory on the first NUMA	node marked with "HBM" subtype:

	   $ hwloc-bind	--membind numa[hbm]:0 -- echo hello
	   $ hwloc-bind	--hbm --membind	numa:0 -- echo hello

       To  bind	memory on the first high-bandwidth memory node (MCDRAM)	on In-
       tel Xeon	Phi:

	   $ hwloc-bind	--membind numa[mcdram]:0 -- echo hello
	   $ hwloc-bind	--hbm --membind	numa:0 -- echo hello

       Note that binding the "echo" command to multiple	processors is probably
       meaningless (because "echo" is likely implemented as a  single-threaded
       application); these examples just serve to show what hwloc-bind can do.

       The current memory binding may also be reported:

	   $  hwloc-bind --membind node:1 --mempolicy interleave -- hwloc-bind
       --get --membind
	   0x000000f0 (interleave)

Examples with advanced resource	specification
       To run on the first three packages on the second	and third nodes:

	   $ hwloc-bind	node:1-2.package:0:3 --	echo hello

       which is	also equivalent	to:

	   $ hwloc-bind	node:1-2.package:0-2 --	echo hello

       Note that if you	attempt	to bind	to objects that	do not	exist,	hwloc-
       bind will not warn unless -v was	specified.

       To run on core with physical index 2 in package with physical index 1:

	   $ hwloc-bind	--physical package:1.core:2 -- echo hello

       To run on odd cores within even packages:

	   $ hwloc-bind	package:even.core:odd -- echo hello

       To run on the first package, except on its second and fifth cores:

	   $  hwloc-bind package:0 ~package:0.core:1 ~package:0.core:4 -- echo
       hello

       To run anywhere except on the first package:

	   $ hwloc-bind	all ~package:0 -- echo hello

Examples with I/O devices
       To run on a core	near the network interface named eth0:

	   $ hwloc-bind	os=eth0	-- echo	hello

       To run on a core	near the PCI device whose bus ID is 0000:01:02.0:

	   $ hwloc-bind	pci=0000:01:02.0 -- echo hello

Examples with hwloc-calc help
       hwloc-bind does not have	an option to select a kind of CPU core but  it
       may  be combined	with hwloc-calc	to do so. For instance,	to bind	on the
       first two cores whose kind matches CoreType=IntelAtom:

	   $ hwloc-bind	$(hwloc-calc --restrict	$(hwloc-calc  --cpukind	 Core-
       Type=IntelAtom all) core:0-1) --	echo hello

       hwloc-calc  may also be used to convert cpu mask	strings	to human-read-
       able package/core/PU strings; see  the  description  of	-H  in	hwloc-
       calc(1)	for  more details.  The	following example binds	to all the PUs
       in a specific core, uses	the --get option to retrieve where the process
       was actually bound, and then uses hwloc-calc to display	the  resulting
       cpu mask	in space-delimited list	of human-readable locations:

	   $  hwloc-bind  package:1.core:2 -- hwloc-bind --get | hwloc-calc -q
       -H package.core.pu
	   Package:1.Core:2.PU:0 Package:1.Core:2.PU:1

       hwloc-calc may convert this output into	actual	objects,  either  with
       logical or physical indexes:

	   $ hwloc-calc	--physical -I pu `hwloc-bind --get`
	   26,30,34,38,42,46
	   $ hwloc-calc	--logical -I pu	`hwloc-bind --get` --sep " "
	   24 25 26 27 28 29

       Locations  may also be specified	as a hex bit mask (typically generated
       by hwloc-calc).	For example:

	   $ hwloc-bind	0x00004444,0x44000000 -- echo hello
	   $ hwloc-bind	`hwloc-calc node:1.package:2` -- echo hello

HINT
       If the graphics-enabled lstopo is available, use	for instance

	   $ hwloc-bind	core:2 -- lstopo --pid 0

       to check	what the result	of your	binding	command	actually  is.	lstopo
       will graphically	show where it is bound to by hwloc-bind.

RETURN VALUE
       Upon  successful	 execution,  hwloc-bind	execs the command over itself.
       The return value	is therefore whatever the return value of the  command
       is.

       hwloc-bind  will	 return	 nonzero  if any kind of error occurs, such as
       (but not	limited	to): failure to	parse the command line,	failure	to re-
       trieve process bindings,	or lack	of a command to	execute.

SEE ALSO
       hwloc(7), lstopo(1), hwloc-calc(1), hwloc-distrib(1)

2.12.1				 May 12, 2025			 HWLOC-BIND(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=hwloc-bind&sektion=1&manpath=FreeBSD+Ports+15.0>

home | help