Home ⌂Doc Index ◂Up ▴
Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::internal::platform_topology Class Reference
Collaboration diagram for tbb::internal::platform_topology:

Public Types

typedef hwloc_cpuset_t affinity_mask
 
typedef hwloc_const_cpuset_t const_affinity_mask
 

Public Member Functions

bool is_topology_parsed ()
 
void initialize (size_t groups_num)
 
 ~platform_topology ()
 
void fill (int &nodes_count, int *&indexes_list, int *&concurrency_list)
 
affinity_mask allocate_process_affinity_mask ()
 
void free_affinity_mask (affinity_mask mask_to_free)
 
void store_current_affinity_mask (affinity_mask current_mask)
 
void set_new_affinity_mask (const_affinity_mask new_mask)
 
const_affinity_mask get_node_affinity_mask (int node_index)
 

Static Public Member Functions

static platform_topologyinstance ()
 

Private Types

enum  init_stages {
  uninitialized, started, topology_allocated, topology_loaded,
  topology_parsed
}
 

Private Member Functions

bool intergroup_binding_allowed (size_t groups_num)
 
 platform_topology ()
 

Private Attributes

hwloc_topology_t topology
 
hwloc_cpuset_t process_cpu_affinity_mask
 
hwloc_nodeset_t process_node_affinity_mask
 
std::vector< hwloc_cpuset_t > affinity_masks_list
 
std::vector< intdefault_concurrency_list
 
std::vector< intnuma_indexes_list
 
int numa_nodes_count
 
enum tbb::internal::platform_topology::init_stages initialization_state
 

Friends

class numa_affinity_handler
 

Detailed Description

Definition at line 42 of file tbb_bind.cpp.

Member Typedef Documentation

◆ affinity_mask

Definition at line 74 of file tbb_bind.cpp.

◆ const_affinity_mask

Definition at line 75 of file tbb_bind.cpp.

Member Enumeration Documentation

◆ init_stages

Constructor & Destructor Documentation

◆ platform_topology()

tbb::internal::platform_topology::platform_topology ( )
inlineprivate

Definition at line 67 of file tbb_bind.cpp.

◆ ~platform_topology()

tbb::internal::platform_topology::~platform_topology ( )
inline

Definition at line 174 of file tbb_bind.cpp.

174  {
175  if ( is_topology_parsed() ) {
176  for (int i = 0; i < numa_nodes_count; i++) {
177  hwloc_bitmap_free(affinity_masks_list[numa_indexes_list[i]]);
178  }
179  hwloc_bitmap_free(process_node_affinity_mask);
180  hwloc_bitmap_free(process_cpu_affinity_mask);
181  }
182 
184  hwloc_topology_destroy(topology);
185  }
186 
188  }
hwloc_cpuset_t process_cpu_affinity_mask
Definition: tbb_bind.cpp:47
std::vector< hwloc_cpuset_t > affinity_masks_list
Definition: tbb_bind.cpp:49
hwloc_nodeset_t process_node_affinity_mask
Definition: tbb_bind.cpp:48
enum tbb::internal::platform_topology::init_stages initialization_state
std::vector< int > numa_indexes_list
Definition: tbb_bind.cpp:52

References affinity_masks_list, initialization_state, is_topology_parsed(), numa_indexes_list, numa_nodes_count, process_cpu_affinity_mask, process_node_affinity_mask, topology, topology_allocated, and uninitialized.

Here is the call graph for this function:

Member Function Documentation

◆ allocate_process_affinity_mask()

affinity_mask tbb::internal::platform_topology::allocate_process_affinity_mask ( )
inline

Definition at line 197 of file tbb_bind.cpp.

197  {
198  __TBB_ASSERT(is_topology_parsed(), "Trying to get access to uninitialized platform_topology");
199  return hwloc_bitmap_dup(process_cpu_affinity_mask);
200  }
hwloc_cpuset_t process_cpu_affinity_mask
Definition: tbb_bind.cpp:47
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, is_topology_parsed(), and process_cpu_affinity_mask.

Referenced by tbb::internal::binding_handler::binding_handler().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ fill()

void tbb::internal::platform_topology::fill ( int nodes_count,
int *&  indexes_list,
int *&  concurrency_list 
)
inline

Definition at line 190 of file tbb_bind.cpp.

190  {
191  __TBB_ASSERT(is_topology_parsed(), "Trying to get access to uninitialized platform_topology");
192  nodes_count = numa_nodes_count;
193  indexes_list = &numa_indexes_list.front();
194  concurrency_list = &default_concurrency_list.front();
195  }
std::vector< int > default_concurrency_list
Definition: tbb_bind.cpp:51
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
std::vector< int > numa_indexes_list
Definition: tbb_bind.cpp:52

References __TBB_ASSERT, default_concurrency_list, is_topology_parsed(), numa_indexes_list, and numa_nodes_count.

Referenced by tbb::internal::initialize_numa_topology().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ free_affinity_mask()

void tbb::internal::platform_topology::free_affinity_mask ( affinity_mask  mask_to_free)
inline

Definition at line 202 of file tbb_bind.cpp.

202  {
203  hwloc_bitmap_free(mask_to_free); // If bitmap is NULL, no operation is performed.
204  }

Referenced by tbb::internal::binding_handler::~binding_handler().

Here is the caller graph for this function:

◆ get_node_affinity_mask()

const_affinity_mask tbb::internal::platform_topology::get_node_affinity_mask ( int  node_index)
inline

Definition at line 218 of file tbb_bind.cpp.

218  {
219  __TBB_ASSERT((int)affinity_masks_list.size() > node_index,
220  "Trying to get affinity mask for uninitialized NUMA node");
221  return affinity_masks_list[node_index];
222  }
std::vector< hwloc_cpuset_t > affinity_masks_list
Definition: tbb_bind.cpp:49
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, and affinity_masks_list.

◆ initialize()

void tbb::internal::platform_topology::initialize ( size_t  groups_num)
inline

Definition at line 84 of file tbb_bind.cpp.

84  {
86  return;
88 
89  // Parse topology
90  if ( hwloc_topology_init( &topology ) == 0 ) {
92  if ( hwloc_topology_load( topology ) == 0 ) {
94  }
95  }
96 
97  // Fill parameters with stubs if topology parsing is broken.
100  hwloc_topology_destroy(topology);
101  }
102  numa_nodes_count = 1;
103  numa_indexes_list.push_back(-1);
104  default_concurrency_list.push_back(-1);
105  return;
106  }
107 
108  // Getting process affinity mask
109  if ( intergroup_binding_allowed(groups_num) ) {
110  process_cpu_affinity_mask = hwloc_bitmap_dup(hwloc_topology_get_complete_cpuset (topology));
111  process_node_affinity_mask = hwloc_bitmap_dup(hwloc_topology_get_complete_nodeset(topology));
112  } else {
113  process_cpu_affinity_mask = hwloc_bitmap_alloc();
114  process_node_affinity_mask = hwloc_bitmap_alloc();
115 
118  }
119 
120  // If system contains no NUMA nodes, HWLOC 1.11 returns an infinitely filled bitmap.
121  // hwloc_bitmap_weight() returns negative value for such bitmaps, so we use this check
122  // to change way of topology initialization.
123  if (hwloc_bitmap_weight(process_node_affinity_mask) < 0) {
124  numa_nodes_count = 1;
125  numa_indexes_list.push_back(0);
126  default_concurrency_list.push_back(hwloc_bitmap_weight(process_cpu_affinity_mask));
127 
128  affinity_masks_list.push_back(hwloc_bitmap_dup(process_cpu_affinity_mask));
130  return;
131  }
132 
133  // Get number of available NUMA nodes
134  numa_nodes_count = hwloc_bitmap_weight(process_node_affinity_mask);
135  __TBB_ASSERT(numa_nodes_count > 0, "Any system must contain one or more NUMA nodes");
136 
137  // Get NUMA logical indexes list
138  unsigned counter = 0;
139  int i = 0;
140  int max_numa_index = -1;
142  hwloc_obj_t node_buffer;
143  hwloc_bitmap_foreach_begin(i, process_node_affinity_mask) {
144  node_buffer = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, i);
145  numa_indexes_list[counter] = static_cast<int>(node_buffer->logical_index);
146 
147  if ( numa_indexes_list[counter] > max_numa_index ) {
148  max_numa_index = numa_indexes_list[counter];
149  }
150 
151  counter++;
152  } hwloc_bitmap_foreach_end();
153  __TBB_ASSERT(max_numa_index >= 0, "Maximal NUMA index must not be negative");
154 
155  // Fill concurrency and affinity masks lists
156  default_concurrency_list.resize(max_numa_index + 1);
157  affinity_masks_list.resize(max_numa_index + 1);
158 
159  int index = 0;
160  hwloc_bitmap_foreach_begin(i, process_node_affinity_mask) {
161  node_buffer = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, i);
162  index = static_cast<int>(node_buffer->logical_index);
163 
164  hwloc_cpuset_t& current_mask = affinity_masks_list[index];
165  current_mask = hwloc_bitmap_dup(node_buffer->cpuset);
166 
167  hwloc_bitmap_and(current_mask, current_mask, process_cpu_affinity_mask);
168  __TBB_ASSERT(!hwloc_bitmap_iszero(current_mask), "hwloc detected unavailable NUMA node");
169  default_concurrency_list[index] = hwloc_bitmap_weight(current_mask);
170  } hwloc_bitmap_foreach_end();
172  }
hwloc_cpuset_t process_cpu_affinity_mask
Definition: tbb_bind.cpp:47
std::vector< int > default_concurrency_list
Definition: tbb_bind.cpp:51
bool intergroup_binding_allowed(size_t groups_num)
Definition: tbb_bind.cpp:65
std::vector< hwloc_cpuset_t > affinity_masks_list
Definition: tbb_bind.cpp:49
#define assertion_hwloc_wrapper(command,...)
Definition: tbb_bind.cpp:33
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
hwloc_nodeset_t process_node_affinity_mask
Definition: tbb_bind.cpp:48
enum tbb::internal::platform_topology::init_stages initialization_state
std::vector< int > numa_indexes_list
Definition: tbb_bind.cpp:52

References __TBB_ASSERT, affinity_masks_list, assertion_hwloc_wrapper, default_concurrency_list, initialization_state, intergroup_binding_allowed(), numa_indexes_list, numa_nodes_count, process_cpu_affinity_mask, process_node_affinity_mask, started, topology, topology_allocated, topology_loaded, topology_parsed, and uninitialized.

Referenced by tbb::internal::initialize_numa_topology().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ instance()

static platform_topology& tbb::internal::platform_topology::instance ( )
inlinestatic

◆ intergroup_binding_allowed()

bool tbb::internal::platform_topology::intergroup_binding_allowed ( size_t  groups_num)
inlineprivate

Definition at line 65 of file tbb_bind.cpp.

65 { return groups_num > 1; }

Referenced by initialize().

Here is the caller graph for this function:

◆ is_topology_parsed()

bool tbb::internal::platform_topology::is_topology_parsed ( )
inline

Definition at line 82 of file tbb_bind.cpp.

enum tbb::internal::platform_topology::init_stages initialization_state

References initialization_state, and topology_parsed.

Referenced by allocate_process_affinity_mask(), fill(), and ~platform_topology().

Here is the caller graph for this function:

◆ set_new_affinity_mask()

void tbb::internal::platform_topology::set_new_affinity_mask ( const_affinity_mask  new_mask)
inline

Definition at line 214 of file tbb_bind.cpp.

214  {
215  assertion_hwloc_wrapper(hwloc_set_cpubind, topology, new_mask, HWLOC_CPUBIND_THREAD);
216  }
#define assertion_hwloc_wrapper(command,...)
Definition: tbb_bind.cpp:33

References assertion_hwloc_wrapper, and topology.

Referenced by tbb::internal::binding_handler::bind_thread_to_node(), and tbb::internal::binding_handler::restore_previous_affinity_mask().

Here is the caller graph for this function:

◆ store_current_affinity_mask()

void tbb::internal::platform_topology::store_current_affinity_mask ( affinity_mask  current_mask)
inline

Definition at line 206 of file tbb_bind.cpp.

206  {
207  assertion_hwloc_wrapper(hwloc_get_cpubind, topology, current_mask, HWLOC_CPUBIND_THREAD);
208 
209  hwloc_bitmap_and(current_mask, current_mask, process_cpu_affinity_mask);
210  __TBB_ASSERT(!hwloc_bitmap_iszero(current_mask),
211  "Current affinity mask must intersects with process affinity mask");
212  }
hwloc_cpuset_t process_cpu_affinity_mask
Definition: tbb_bind.cpp:47
#define assertion_hwloc_wrapper(command,...)
Definition: tbb_bind.cpp:33
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, assertion_hwloc_wrapper, process_cpu_affinity_mask, and topology.

Referenced by tbb::internal::binding_handler::bind_thread_to_node().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ numa_affinity_handler

friend class numa_affinity_handler
friend

Definition at line 43 of file tbb_bind.cpp.

Member Data Documentation

◆ affinity_masks_list

std::vector<hwloc_cpuset_t> tbb::internal::platform_topology::affinity_masks_list
private

Definition at line 49 of file tbb_bind.cpp.

Referenced by get_node_affinity_mask(), initialize(), and ~platform_topology().

◆ default_concurrency_list

std::vector<int> tbb::internal::platform_topology::default_concurrency_list
private

Definition at line 51 of file tbb_bind.cpp.

Referenced by fill(), and initialize().

◆ initialization_state

enum tbb::internal::platform_topology::init_stages tbb::internal::platform_topology::initialization_state
private

◆ numa_indexes_list

std::vector<int> tbb::internal::platform_topology::numa_indexes_list
private

Definition at line 52 of file tbb_bind.cpp.

Referenced by fill(), initialize(), and ~platform_topology().

◆ numa_nodes_count

int tbb::internal::platform_topology::numa_nodes_count
private

Definition at line 53 of file tbb_bind.cpp.

Referenced by fill(), initialize(), and ~platform_topology().

◆ process_cpu_affinity_mask

hwloc_cpuset_t tbb::internal::platform_topology::process_cpu_affinity_mask
private

◆ process_node_affinity_mask

hwloc_nodeset_t tbb::internal::platform_topology::process_node_affinity_mask
private

Definition at line 48 of file tbb_bind.cpp.

Referenced by initialize(), and ~platform_topology().

◆ topology

hwloc_topology_t tbb::internal::platform_topology::topology
private

The documentation for this class was generated from the following file:

Copyright © 2005-2020 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.