Open MPI logo

Portable Hardware Locality (hwloc) Documentation: v0.9.3

  |   Home   |   Support   |   FAQ   |  

Binding

Enumerations

enum  hwloc_cpubind_policy_t { HWLOC_CPUBIND_PROCESS = (1<<0), HWLOC_CPUBIND_THREAD = (1<<1), HWLOC_CPUBIND_STRICT = (1<<2) }
 

Process/Thread binding policy.

More...

Functions

int hwloc_set_cpubind (hwloc_topology_t topology, const hwloc_cpuset_t set, int policy)
 Bind current process or thread on cpus given in cpuset set.
int hwloc_set_proc_cpubind (hwloc_topology_t topology, hwloc_pid_t pid, const hwloc_cpuset_t set, int policy)
 Bind a process pid on cpus given in cpuset set.

Detailed Description

It is often useful to call hwloc_cpuset_singlify() first so that a single CPU remains in the set. This way, the process will not even migrate between different CPUs. Some OSes also only support that kind of binding.

Note:
Some OSes do not provide all ways to bind processes, threads, etc and the corresponding binding functions may fail. ENOSYS is returned when it is not possible to bind the requested kind of object processes/threads). EXDEV is returned when the requested cpuset can not be enforced (e.g. some systems only allow one CPU, and some other systems only allow one NUMA node)

The most portable version that should be preferred over the others, whenever possible, is

 hwloc_set_cpubind(topology, set, 0),

as it just binds the current program, assuming it is monothread, or

which binds the current thread of the current program (which may be multithreaded).

Note:
To unbind, just call the binding function with either a full cpuset or a cpuset equal to the system cpuset.

Enumeration Type Documentation

Process/Thread binding policy.

These flags can be used to refine the binding policy.

The default (0) is to bind the current process, assumed to be mono-thread, in a non-strict way. This is the most portable way to bind as all OSes usually provide it.

Enumerator:
HWLOC_CPUBIND_PROCESS 

Bind all threads of the current multithreaded process. This may not be supported by some OSes (e.g. Linux).

HWLOC_CPUBIND_THREAD 

Bind current thread of current process.

HWLOC_CPUBIND_STRICT 

Request for strict binding from the OS.

By default, when the designated CPUs are all busy while other CPUs are idle, OSes may execute the thread/process on those other CPUs instead of the designated CPUs, to let them progress anyway. Strict binding means that the thread/process will _never_ execute on other cpus than the designated CPUs, even when those are busy with other tasks and other CPUs are idle.

Note:
Depending on OSes and implementations, strict binding may not be possible (implementation reason) or not allowed (administrative reasons), and the function will fail in that case.

Function Documentation

int hwloc_set_cpubind ( hwloc_topology_t  topology,
const hwloc_cpuset_t  set,
int  policy 
)

Bind current process or thread on cpus given in cpuset set.

int hwloc_set_proc_cpubind ( hwloc_topology_t  topology,
hwloc_pid_t  pid,
const hwloc_cpuset_t  set,
int  policy 
)

Bind a process pid on cpus given in cpuset set.

Note:
hwloc_pid_t is pid_t on unix platforms, and HANDLE on native Windows platforms
HWLOC_CPUBIND_THREAD can not be used in policy.