NUMA++ 0.12.0
Loading...
Searching...
No Matches
cpuaffinity.cpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup numapp
4 * @brief Definition of CPU affinity classes.
5 * @copyright
6 * SPDX-FileCopyrightText: 2020-2024 European Southern Observatory (ESO)
7 *
8 * SPDX-License-Identifier: LGPL-3.0-only
9 */
11
12#include <ostream>
13
14#include <numapp/lowlevel.hpp>
15#include <numapp/thread.hpp>
16
17namespace numapp {
18namespace thisThread {
19[[nodiscard]] std::error_code Apply(CpuAffinity const& affinity) noexcept {
20 return Apply(GetThreadId(), affinity);
21}
22} // namespace thisThread
23
24[[nodiscard]] std::error_code Apply(pid_t thread, CpuAffinity const& affinity) noexcept {
25 if (auto err = ll::SetCpuAffinity(thread, affinity.GetMask()); err) {
26 return err;
27 }
28 return {};
29}
30
31CpuAffinity::CpuAffinity(Cpumask&& mask) noexcept : m_mask(std::move(mask)) {
32}
33
34CpuAffinity::CpuAffinity(Cpumask const& mask) noexcept : m_mask(mask) {
35}
36
38 auto mask = Cpumask();
39 if (auto err = ll::GetCpuAffinity(thisThread::GetThreadId(), mask); err) {
40 throw std::system_error(err);
41 }
42 return CpuAffinity(std::move(mask));
43}
44
45[[nodiscard]] CpuAffinity CpuAffinity::MakeFromCpuString(char const* cpustring) {
46 return CpuAffinity(Cpumask::MakeFromCpuString(cpustring));
47}
48
49[[nodiscard]] CpuAffinity CpuAffinity::MakeFromCpuStringAll(char const* cpustring) {
51}
52
53[[nodiscard]] CpuAffinity CpuAffinity::MakeBindNode(int node) {
54 auto mask = Cpumask();
55 if (auto err = ll::NumaNodeToCpumask(node, mask); err) {
56 throw std::system_error(err);
57 }
58 return CpuAffinity(std::move(mask));
59}
60
61[[nodiscard]] CpuAffinity CpuAffinity::MakeBindCpu(int cpu) {
62 auto mask = Cpumask();
63 mask.Set(cpu);
64 return CpuAffinity(std::move(mask));
65}
66
67Cpumask const& CpuAffinity::GetMask() const noexcept {
68 return m_mask;
69}
70
71std::ostream& operator<<(std::ostream& os, CpuAffinity const& affinity) {
72 os << "CpuAffinity {mask=" << affinity.GetMask() << "}";
73 return os;
74}
75
76} // namespace numapp
Cpumask const & GetMask() const noexcept
static CpuAffinity MakeFromCpuStringAll(char const *cpustring)
Create CpuAffinity from `cpustring` without considering current cpuset.
static CpuAffinity MakeBindCpu(int cpu)
Create CpuAffinity bound to the specified CPU.
static CpuAffinity MakeBindNode(int node)
Create CpuAffinity bound to the specified NUMA node.
CpuAffinity(Cpumask &&mask) noexcept
Create affinity from Cpumask.
std::ostream & operator<<(std::ostream &os, CpuAffinity const &affinity)
Formats affinity and inserts it to os.
static CpuAffinity MakeFromActive()
Create current affinity settings.
static CpuAffinity MakeFromCpuString(char const *cpustring)
Create CpuAffinity from `cpustring` while considering allowed CPUs from current cpuset.
Type-safe CPU mask.
Definition cpumask.hpp:27
static Cpumask MakeFromCpuString(char const *cpustring)
Construct Cpumask from cpustring that considers current cpuset.
Definition cpumask.hpp:65
static Cpumask MakeFromCpuStringAll(char const *cpustring)
Construct Cpumask from cpustring that does not consider current cpuset.
Definition cpumask.hpp:46
Contains declarations for CpuAffinity.
std::error_code Apply(CpuAffinity const &affinity) noexcept
Apply policy to calling thread.
std::error_code Apply(pid_t thread, CpuAffinity const &affinity) noexcept
Apply policy to specified thread.
pid_t GetThreadId() noexcept
Query the thread id "TID" of the current thread.
Definition thread.cpp:29
Contains low-level functions.
std::error_code GetCpuAffinity(pid_t ttid, Cpumask &mask) noexcept
Get CPU affinity.
std::error_code NumaNodeToCpumask(int node, Cpumask &mask) noexcept
Convert NUMA node number to corresponding CPU mask.
std::error_code SetCpuAffinity(pid_t ttid, Cpumask const &mask) noexcept
Set CPU affinity.
Contains declarations for numapp thread utilities.