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

 ~platform_topology ()
 

Static Public Member Functions

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

Private Types

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

Static Private Member Functions

static bool intergroup_binding_allowed (size_t groups_num)
 

Static Private Attributes

static hwloc_topology_t topology = NULL
 
static hwloc_cpuset_t process_cpu_affinity_mask = NULL
 
static hwloc_nodeset_t process_node_affinity_mask = NULL
 
static std::vector< hwloc_cpuset_t > affinity_masks_list
 
static std::vector< intdefault_concurrency_list
 
static std::vector< intnuma_indexes_list
 
static int numa_nodes_count = 0
 
static init_stages initialization_state = uninitialized
 

Friends

class numa_affinity_handler
 

Detailed Description

Definition at line 45 of file tbbbind.cpp.

Member Typedef Documentation

◆ affinity_mask

Definition at line 67 of file tbbbind.cpp.

◆ const_affinity_mask

Definition at line 68 of file tbbbind.cpp.

Member Enumeration Documentation

◆ init_stages

Enumerator
uninitialized 
started 
topology_allocated 
topology_loaded 
topology_parsed 

Definition at line 57 of file tbbbind.cpp.

Constructor & Destructor Documentation

◆ ~platform_topology()

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

Definition at line 162 of file tbbbind.cpp.

162  {
163  if ( is_topology_parsed() ) {
164  for (int i = 0; i < numa_nodes_count; i++) {
165  hwloc_bitmap_free(affinity_masks_list[numa_indexes_list[i]]);
166  }
167  hwloc_bitmap_free(process_node_affinity_mask);
168  hwloc_bitmap_free(process_cpu_affinity_mask);
169  }
170 
172  hwloc_topology_destroy(topology);
173  }
174 
176  }

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()

static affinity_mask tbb::internal::platform_topology::allocate_process_affinity_mask ( )
inlinestatic

Definition at line 185 of file tbbbind.cpp.

185  {
186  __TBB_ASSERT(is_topology_parsed(), "Trying to get access to uninitialized platform_topology");
187  return hwloc_bitmap_dup(process_cpu_affinity_mask);
188  }

References __TBB_ASSERT, is_topology_parsed(), and process_cpu_affinity_mask.

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

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

◆ fill()

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

Definition at line 178 of file tbbbind.cpp.

178  {
179  __TBB_ASSERT(is_topology_parsed(), "Trying to get access to uninitialized platform_topology");
180  nodes_count = numa_nodes_count;
181  indexes_list = &numa_indexes_list.front();
182  concurrency_list = &default_concurrency_list.front();
183  }

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()

static void tbb::internal::platform_topology::free_affinity_mask ( affinity_mask  mask_to_free)
inlinestatic

Definition at line 190 of file tbbbind.cpp.

190  {
191  hwloc_bitmap_free(mask_to_free); // If bitmap is NULL, no operation is performed.
192  }

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

Here is the caller graph for this function:

◆ get_node_affinity_mask()

static const_affinity_mask tbb::internal::platform_topology::get_node_affinity_mask ( int  node_index)
inlinestatic

Definition at line 206 of file tbbbind.cpp.

206  {
207  __TBB_ASSERT((int)affinity_masks_list.size() > node_index,
208  "Trying to get affinity mask for uninitialized NUMA node");
209  return affinity_masks_list[node_index];
210  }

References __TBB_ASSERT, and affinity_masks_list.

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

Here is the caller graph for this function:

◆ initialize()

static void tbb::internal::platform_topology::initialize ( size_t  groups_num)
inlinestatic

Definition at line 72 of file tbbbind.cpp.

72  {
74  return;
76 
77  // Parse topology
78  if ( hwloc_topology_init( &topology ) == 0 ) {
80  if ( hwloc_topology_load( topology ) == 0 ) {
82  }
83  }
84 
85  // Fill parameters by stubs if topology parsing brokes.
88  hwloc_topology_destroy(topology);
89  }
90  numa_nodes_count = 1;
91  numa_indexes_list.push_back(-1);
92  default_concurrency_list.push_back(-1);
93  return;
94  }
95 
96  // Getting process affinity mask
97  if ( intergroup_binding_allowed(groups_num) ) {
98  process_cpu_affinity_mask = hwloc_bitmap_dup(hwloc_topology_get_complete_cpuset (topology));
99  process_node_affinity_mask = hwloc_bitmap_dup(hwloc_topology_get_complete_nodeset(topology));
100  } else {
101  process_cpu_affinity_mask = hwloc_bitmap_alloc();
102  process_node_affinity_mask = hwloc_bitmap_alloc();
103 
106  }
107 
108  // If system contains no NUMA nodes, HWLOC 1.11 returns an infinitely filled bitmap.
109  // hwloc_bitmap_weight() returns negative value for such bitmaps, so we use this check
110  // to change way of topology initialization.
111  if (hwloc_bitmap_weight(process_node_affinity_mask) < 0) {
112  numa_nodes_count = 1;
113  numa_indexes_list.push_back(0);
114  default_concurrency_list.push_back(hwloc_bitmap_weight(process_cpu_affinity_mask));
115 
116  affinity_masks_list.push_back(hwloc_bitmap_dup(process_cpu_affinity_mask));
118  return;
119  }
120 
121  // Get number of available NUMA nodes
122  numa_nodes_count = hwloc_bitmap_weight(process_node_affinity_mask);
123  __TBB_ASSERT(numa_nodes_count > 0, "Any system must contain one or more NUMA nodes");
124 
125  // Get NUMA logical indexes list
126  unsigned counter = 0;
127  int i = 0;
128  int max_numa_index = -1;
130  hwloc_obj_t node_buffer;
131  hwloc_bitmap_foreach_begin(i, process_node_affinity_mask) {
132  node_buffer = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, i);
133  numa_indexes_list[counter] = static_cast<int>(node_buffer->logical_index);
134 
135  if ( numa_indexes_list[counter] > max_numa_index ) {
136  max_numa_index = numa_indexes_list[counter];
137  }
138 
139  counter++;
140  } hwloc_bitmap_foreach_end();
141  __TBB_ASSERT(max_numa_index >= 0, "Maximal NUMA index must not be negative");
142 
143  // Fill concurrency and affinity masks lists
144  default_concurrency_list.resize(max_numa_index + 1);
145  affinity_masks_list.resize(max_numa_index + 1);
146 
147  int index = 0;
148  hwloc_bitmap_foreach_begin(i, process_node_affinity_mask) {
149  node_buffer = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, i);
150  index = static_cast<int>(node_buffer->logical_index);
151 
152  hwloc_cpuset_t& current_mask = affinity_masks_list[index];
153  current_mask = hwloc_bitmap_dup(node_buffer->cpuset);
154 
155  hwloc_bitmap_and(current_mask, current_mask, process_cpu_affinity_mask);
156  __TBB_ASSERT(!hwloc_bitmap_iszero(current_mask), "hwloc detected unavailable NUMA node");
157  default_concurrency_list[index] = hwloc_bitmap_weight(current_mask);
158  } hwloc_bitmap_foreach_end();
160  }

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:

◆ intergroup_binding_allowed()

static bool tbb::internal::platform_topology::intergroup_binding_allowed ( size_t  groups_num)
inlinestaticprivate

Definition at line 64 of file tbbbind.cpp.

64 { return groups_num > 1; }

Referenced by initialize().

Here is the caller graph for this function:

◆ is_topology_parsed()

static bool tbb::internal::platform_topology::is_topology_parsed ( )
inlinestatic

Definition at line 70 of file tbbbind.cpp.

References initialization_state, and topology_parsed.

Referenced by allocate_process_affinity_mask(), tbb::internal::numa_affinity_handler::bind_thread_to_node(), fill(), tbb::internal::numa_affinity_handler::restore_previous_affinity_mask(), and ~platform_topology().

Here is the caller graph for this function:

◆ set_new_affinity_mask()

static void tbb::internal::platform_topology::set_new_affinity_mask ( const_affinity_mask  new_mask)
inlinestatic

Definition at line 202 of file tbbbind.cpp.

202  {
203  assertion_hwloc_wrapper(hwloc_set_cpubind, topology, new_mask, HWLOC_CPUBIND_THREAD);
204  }

References assertion_hwloc_wrapper, and topology.

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

Here is the caller graph for this function:

◆ store_current_affinity_mask()

static void tbb::internal::platform_topology::store_current_affinity_mask ( affinity_mask  current_mask)
inlinestatic

Definition at line 194 of file tbbbind.cpp.

194  {
195  assertion_hwloc_wrapper(hwloc_get_cpubind, topology, current_mask, HWLOC_CPUBIND_THREAD);
196 
197  hwloc_bitmap_and(current_mask,current_mask, process_cpu_affinity_mask);
198  __TBB_ASSERT(!hwloc_bitmap_iszero(current_mask),
199  "Current affinity mask must intersects with process affinity mask");
200  }

References __TBB_ASSERT, assertion_hwloc_wrapper, process_cpu_affinity_mask, and topology.

Referenced by tbb::internal::numa_affinity_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 46 of file tbbbind.cpp.

Member Data Documentation

◆ affinity_masks_list

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

Definition at line 51 of file tbbbind.cpp.

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

◆ default_concurrency_list

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

Definition at line 53 of file tbbbind.cpp.

Referenced by fill(), and initialize().

◆ initialization_state

platform_topology::init_stages tbb::internal::platform_topology::initialization_state = uninitialized
staticprivate

Definition at line 58 of file tbbbind.cpp.

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

◆ numa_indexes_list

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

Definition at line 54 of file tbbbind.cpp.

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

◆ numa_nodes_count

int tbb::internal::platform_topology::numa_nodes_count = 0
staticprivate

Definition at line 55 of file tbbbind.cpp.

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

◆ process_cpu_affinity_mask

hwloc_cpuset_t tbb::internal::platform_topology::process_cpu_affinity_mask = NULL
staticprivate

◆ process_node_affinity_mask

hwloc_nodeset_t tbb::internal::platform_topology::process_node_affinity_mask = NULL
staticprivate

Definition at line 50 of file tbbbind.cpp.

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

◆ topology

hwloc_topology_t tbb::internal::platform_topology::topology = NULL
staticprivate

The documentation for this class was generated from the following file:
tbb::internal::platform_topology::topology_allocated
Definition: tbbbind.cpp:57
tbb::internal::platform_topology::topology_loaded
Definition: tbbbind.cpp:57
tbb::internal::platform_topology::default_concurrency_list
static std::vector< int > default_concurrency_list
Definition: tbbbind.cpp:53
__TBB_ASSERT
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
tbb::internal::platform_topology::numa_indexes_list
static std::vector< int > numa_indexes_list
Definition: tbbbind.cpp:54
tbb::internal::platform_topology::is_topology_parsed
static bool is_topology_parsed()
Definition: tbbbind.cpp:70
tbb::internal::platform_topology::uninitialized
Definition: tbbbind.cpp:57
tbb::internal::platform_topology::topology_parsed
Definition: tbbbind.cpp:57
tbb::internal::platform_topology::started
Definition: tbbbind.cpp:57
tbb::internal::platform_topology::intergroup_binding_allowed
static bool intergroup_binding_allowed(size_t groups_num)
Definition: tbbbind.cpp:64
tbb::internal::platform_topology::topology
static hwloc_topology_t topology
Definition: tbbbind.cpp:48
tbb::internal::platform_topology::process_node_affinity_mask
static hwloc_nodeset_t process_node_affinity_mask
Definition: tbbbind.cpp:50
tbb::internal::platform_topology::affinity_masks_list
static std::vector< hwloc_cpuset_t > affinity_masks_list
Definition: tbbbind.cpp:51
tbb::internal::platform_topology::numa_nodes_count
static int numa_nodes_count
Definition: tbbbind.cpp:55
tbb::internal::platform_topology::process_cpu_affinity_mask
static hwloc_cpuset_t process_cpu_affinity_mask
Definition: tbbbind.cpp:49
tbb::internal::platform_topology::initialization_state
static init_stages initialization_state
Definition: tbbbind.cpp:58
assertion_hwloc_wrapper
#define assertion_hwloc_wrapper(command,...)
Definition: tbbbind.cpp:36

Copyright © 2005-2019 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.