Hardware Locality (hwloc)
2.4.1
|
Enumerations | |
enum | hwloc_cpubind_flags_t { HWLOC_CPUBIND_PROCESS , HWLOC_CPUBIND_THREAD , HWLOC_CPUBIND_STRICT , HWLOC_CPUBIND_NOMEMBIND } |
Functions | |
int | hwloc_set_cpubind (hwloc_topology_t topology, hwloc_const_cpuset_t set, int flags) |
int | hwloc_get_cpubind (hwloc_topology_t topology, hwloc_cpuset_t set, int flags) |
int | hwloc_set_proc_cpubind (hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int flags) |
int | hwloc_get_proc_cpubind (hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags) |
int | hwloc_set_thread_cpubind (hwloc_topology_t topology, hwloc_thread_t thread, hwloc_const_cpuset_t set, int flags) |
int | hwloc_get_thread_cpubind (hwloc_topology_t topology, hwloc_thread_t thread, hwloc_cpuset_t set, int flags) |
int | hwloc_get_last_cpu_location (hwloc_topology_t topology, hwloc_cpuset_t set, int flags) |
int | hwloc_get_proc_last_cpu_location (hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags) |
Some operating systems only support binding threads or processes to a single PU. Others allow binding to larger sets such as entire Cores or Packages or even random sets of invididual PUs. In such operating system, the scheduler is free to run the task on one of these PU, then migrate it to another PU, etc. It is often useful to call hwloc_bitmap_singlify() on the target CPU set before passing it to the binding function to avoid these expensive migrations. See the documentation of hwloc_bitmap_singlify() for details.
Some operating systems do not provide all hwloc-supported mechanisms to bind processes, threads, etc. hwloc_topology_get_support() may be used to query about the actual CPU binding support in the currently used operating system.
When the requested binding operation is not available and the HWLOC_CPUBIND_STRICT flag was passed, the function returns -1. errno
is set to ENOSYS
when it is not possible to bind the requested kind of object processes/threads. errno is set to EXDEV
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).
If HWLOC_CPUBIND_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 version that should be preferred over the others, whenever possible, is the following one which just binds the current program, assuming it is single-threaded:
If the program may be multithreaded, the following one should be preferred to only bind the current thread:
Process/Thread binding flags.
These bit flags can be used to refine the binding policy.
The default (0) is to bind the current process, assumed to be single-threaded, in a non-strict way. This is the most portable way to bind as all operating systems usually provide it.
int hwloc_get_cpubind | ( | hwloc_topology_t | topology, |
hwloc_cpuset_t | set, | ||
int | flags | ||
) |
Get current process or thread binding.
Writes into set
the physical cpuset which the process or thread (according to flags) was last bound to.
int hwloc_get_last_cpu_location | ( | hwloc_topology_t | topology, |
hwloc_cpuset_t | set, | ||
int | flags | ||
) |
Get the last physical CPU where the current process or thread ran.
The operating system may move some tasks from one processor to another at any time according to their binding, so this function may return something that is already outdated.
flags
can include either HWLOC_CPUBIND_PROCESS or HWLOC_CPUBIND_THREAD to specify whether the query should be for the whole process (union of all CPUs on which all threads are running), or only the current thread. If the process is single-threaded, flags can be set to zero to let hwloc use whichever method is available on the underlying OS.
int hwloc_get_proc_cpubind | ( | hwloc_topology_t | topology, |
hwloc_pid_t | pid, | ||
hwloc_cpuset_t | set, | ||
int | flags | ||
) |
Get the current physical binding of process pid
.
hwloc_pid_t
is pid_t
on Unix platforms, and HANDLE
on native Windows platforms.flags
. int hwloc_get_proc_last_cpu_location | ( | hwloc_topology_t | topology, |
hwloc_pid_t | pid, | ||
hwloc_cpuset_t | set, | ||
int | flags | ||
) |
Get the last physical CPU where a process ran.
The operating system may move some tasks from one processor to another at any time according to their binding, so this function may return something that is already outdated.
hwloc_pid_t
is pid_t
on Unix platforms, and HANDLE
on native Windows platforms.flags
. int hwloc_get_thread_cpubind | ( | hwloc_topology_t | topology, |
hwloc_thread_t | thread, | ||
hwloc_cpuset_t | set, | ||
int | flags | ||
) |
Get the current physical binding of thread tid
.
hwloc_thread_t
is pthread_t
on Unix platforms, and HANDLE
on native Windows platforms.flags
. int hwloc_set_cpubind | ( | hwloc_topology_t | topology, |
hwloc_const_cpuset_t | set, | ||
int | flags | ||
) |
Bind current process or thread on cpus given in physical bitmap set
.
int hwloc_set_proc_cpubind | ( | hwloc_topology_t | topology, |
hwloc_pid_t | pid, | ||
hwloc_const_cpuset_t | set, | ||
int | flags | ||
) |
Bind a process pid
on cpus given in physical bitmap set
.
hwloc_pid_t
is pid_t
on Unix platforms, and HANDLE
on native Windows platforms.flags
. int hwloc_set_thread_cpubind | ( | hwloc_topology_t | topology, |
hwloc_thread_t | thread, | ||
hwloc_const_cpuset_t | set, | ||
int | flags | ||
) |
Bind a thread thread
on cpus given in physical bitmap set
.
hwloc_thread_t
is pthread_t
on Unix platforms, and HANDLE
on native Windows platforms.flags
.