Hardware Locality (hwloc)  2.10.0
helper.h
1 /*
2  * Copyright © 2009 CNRS
3  * Copyright © 2009-2023 Inria. All rights reserved.
4  * Copyright © 2009-2012 Université Bordeaux
5  * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
6  * See COPYING in top-level directory.
7  */
8 
13 #ifndef HWLOC_HELPER_H
14 #define HWLOC_HELPER_H
15 
16 #ifndef HWLOC_H
17 #error Please include the main hwloc.h instead
18 #endif
19 
20 #include <stdlib.h>
21 #include <errno.h>
22 
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 
53 HWLOC_DECLSPEC int
55 
64 HWLOC_DECLSPEC int
66 
75 HWLOC_DECLSPEC int
77 
84 HWLOC_DECLSPEC int
86 
93 HWLOC_DECLSPEC int
95 
102 HWLOC_DECLSPEC int
104 
122 static __hwloc_inline hwloc_obj_t
124 {
125  hwloc_obj_t obj = hwloc_get_root_obj(topology);
126  if (!hwloc_bitmap_intersects(obj->cpuset, set))
127  return NULL;
128  while (!hwloc_bitmap_isincluded(obj->cpuset, set)) {
129  /* while the object intersects without being included, look at its children */
130  hwloc_obj_t child = obj->first_child;
131  while (child) {
132  if (hwloc_bitmap_intersects(child->cpuset, set))
133  break;
134  child = child->next_sibling;
135  }
136  if (!child)
137  /* no child intersects, return their father */
138  return obj;
139  /* found one intersecting child, look at its children */
140  obj = child;
141  }
142  /* obj is included, return it */
143  return obj;
144 }
145 
152  hwloc_obj_t * __hwloc_restrict objs, int max);
153 
169 static __hwloc_inline hwloc_obj_t
171  int depth, hwloc_obj_t prev)
172 {
173  hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
174  if (!next)
175  return NULL;
176  while (next && (hwloc_bitmap_iszero(next->cpuset) || !hwloc_bitmap_isincluded(next->cpuset, set)))
177  next = next->next_cousin;
178  return next;
179 }
180 
199 static __hwloc_inline hwloc_obj_t
201  hwloc_obj_type_t type, hwloc_obj_t prev)
202 {
203  int depth = hwloc_get_type_depth(topology, type);
204  if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
205  return NULL;
206  return hwloc_get_next_obj_inside_cpuset_by_depth(topology, set, depth, prev);
207 }
208 
219 static __hwloc_inline hwloc_obj_t
221  int depth, unsigned idx) __hwloc_attribute_pure;
222 static __hwloc_inline hwloc_obj_t
224  int depth, unsigned idx)
225 {
226  hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
227  unsigned count = 0;
228  if (!obj)
229  return NULL;
230  while (obj) {
231  if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set)) {
232  if (count == idx)
233  return obj;
234  count++;
235  }
236  obj = obj->next_cousin;
237  }
238  return NULL;
239 }
240 
255 static __hwloc_inline hwloc_obj_t
257  hwloc_obj_type_t type, unsigned idx) __hwloc_attribute_pure;
258 static __hwloc_inline hwloc_obj_t
260  hwloc_obj_type_t type, unsigned idx)
261 {
262  int depth = hwloc_get_type_depth(topology, type);
263  if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
264  return NULL;
265  return hwloc_get_obj_inside_cpuset_by_depth(topology, set, depth, idx);
266 }
267 
279 static __hwloc_inline unsigned
281  int depth) __hwloc_attribute_pure;
282 static __hwloc_inline unsigned
284  int depth)
285 {
286  hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
287  unsigned count = 0;
288  if (!obj)
289  return 0;
290  while (obj) {
291  if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set))
292  count++;
293  obj = obj->next_cousin;
294  }
295  return count;
296 }
297 
311 static __hwloc_inline int
313  hwloc_obj_type_t type) __hwloc_attribute_pure;
314 static __hwloc_inline int
316  hwloc_obj_type_t type)
317 {
318  int depth = hwloc_get_type_depth(topology, type);
319  if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
320  return 0;
321  if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
322  return -1; /* FIXME: agregate nbobjs from different levels? */
323  return (int) hwloc_get_nbobjs_inside_cpuset_by_depth(topology, set, depth);
324 }
325 
342 static __hwloc_inline int
343 hwloc_get_obj_index_inside_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
344  hwloc_obj_t obj) __hwloc_attribute_pure;
345 static __hwloc_inline int
347  hwloc_obj_t obj)
348 {
349  int idx = 0;
350  if (!hwloc_bitmap_isincluded(obj->cpuset, set))
351  return -1;
352  /* count how many objects are inside the cpuset on the way from us to the beginning of the level */
353  while ((obj = obj->prev_cousin) != NULL)
354  if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set))
355  idx++;
356  return idx;
357 }
358 
374 static __hwloc_inline hwloc_obj_t
375 hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
376  hwloc_obj_t parent) __hwloc_attribute_pure;
377 static __hwloc_inline hwloc_obj_t
379  hwloc_obj_t parent)
380 {
381  hwloc_obj_t child;
382  if (hwloc_bitmap_iszero(set))
383  return NULL;
384  child = parent->first_child;
385  while (child) {
386  if (child->cpuset && hwloc_bitmap_isincluded(set, child->cpuset))
387  return child;
388  child = child->next_sibling;
389  }
390  return NULL;
391 }
392 
398 static __hwloc_inline hwloc_obj_t
399 hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
400 static __hwloc_inline hwloc_obj_t
402 {
403  struct hwloc_obj *current = hwloc_get_root_obj(topology);
404  if (hwloc_bitmap_iszero(set) || !hwloc_bitmap_isincluded(set, current->cpuset))
405  return NULL;
406  while (1) {
407  hwloc_obj_t child = hwloc_get_child_covering_cpuset(topology, set, current);
408  if (!child)
409  return current;
410  current = child;
411  }
412 }
413 
427 static __hwloc_inline hwloc_obj_t
429  int depth, hwloc_obj_t prev)
430 {
431  hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
432  if (!next)
433  return NULL;
434  while (next && !hwloc_bitmap_intersects(set, next->cpuset))
435  next = next->next_cousin;
436  return next;
437 }
438 
455 static __hwloc_inline hwloc_obj_t
457  hwloc_obj_type_t type, hwloc_obj_t prev)
458 {
459  int depth = hwloc_get_type_depth(topology, type);
460  if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
461  return NULL;
462  return hwloc_get_next_obj_covering_cpuset_by_depth(topology, set, depth, prev);
463 }
464 
488 static __hwloc_inline hwloc_obj_t
489 hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj) __hwloc_attribute_pure;
490 static __hwloc_inline hwloc_obj_t
491 hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj)
492 {
493  hwloc_obj_t ancestor = obj;
494  if (obj->depth < depth)
495  return NULL;
496  while (ancestor && ancestor->depth > depth)
497  ancestor = ancestor->parent;
498  return ancestor;
499 }
500 
514 static __hwloc_inline hwloc_obj_t
515 hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj) __hwloc_attribute_pure;
516 static __hwloc_inline hwloc_obj_t
517 hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj)
518 {
519  hwloc_obj_t ancestor = obj->parent;
520  while (ancestor && ancestor->type != type)
521  ancestor = ancestor->parent;
522  return ancestor;
523 }
524 
531 static __hwloc_inline hwloc_obj_t
532 hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2) __hwloc_attribute_pure;
533 static __hwloc_inline hwloc_obj_t
534 hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2)
535 {
536  /* the loop isn't so easy since intermediate ancestors may have
537  * different depth, causing us to alternate between using obj1->parent
538  * and obj2->parent. Also, even if at some point we find ancestors of
539  * of the same depth, their ancestors may have different depth again.
540  */
541  while (obj1 != obj2) {
542  while (obj1->depth > obj2->depth)
543  obj1 = obj1->parent;
544  while (obj2->depth > obj1->depth)
545  obj2 = obj2->parent;
546  if (obj1 != obj2 && obj1->depth == obj2->depth) {
547  obj1 = obj1->parent;
548  obj2 = obj2->parent;
549  }
550  }
551  return obj1;
552 }
553 
561 static __hwloc_inline int
562 hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root) __hwloc_attribute_pure;
563 static __hwloc_inline int
564 hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root)
565 {
566  return obj->cpuset && subtree_root->cpuset && hwloc_bitmap_isincluded(obj->cpuset, subtree_root->cpuset);
567 }
568 
579 static __hwloc_inline hwloc_obj_t
580 hwloc_get_next_child (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t parent, hwloc_obj_t prev)
581 {
582  hwloc_obj_t obj;
583  int state = 0;
584  if (prev) {
585  if (prev->type == HWLOC_OBJ_MISC)
586  state = 3;
587  else if (hwloc_obj_type_is_io(prev->type))
588  state = 2;
589  else if (hwloc_obj_type_is_memory(prev->type))
590  state = 1;
591  obj = prev->next_sibling;
592  } else {
593  obj = parent->first_child;
594  }
595  if (!obj && state == 0) {
596  obj = parent->memory_first_child;
597  state = 1;
598  }
599  if (!obj && state == 1) {
600  obj = parent->io_first_child;
601  state = 2;
602  }
603  if (!obj && state == 2) {
604  obj = parent->misc_first_child;
605  state = 3;
606  }
607  return obj;
608 }
609 
641 static __hwloc_inline int
643  unsigned cachelevel, hwloc_obj_cache_type_t cachetype)
644 {
645  int depth;
646  int found = HWLOC_TYPE_DEPTH_UNKNOWN;
647  for (depth=0; ; depth++) {
648  hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, 0);
649  if (!obj)
650  break;
651  if (!hwloc_obj_type_is_dcache(obj->type) || obj->attr->cache.depth != cachelevel)
652  /* doesn't match, try next depth */
653  continue;
654  if (cachetype == (hwloc_obj_cache_type_t) -1) {
655  if (found != HWLOC_TYPE_DEPTH_UNKNOWN) {
656  /* second match, return MULTIPLE */
658  }
659  /* first match, mark it as found */
660  found = depth;
661  continue;
662  }
663  if (obj->attr->cache.type == cachetype || obj->attr->cache.type == HWLOC_OBJ_CACHE_UNIFIED)
664  /* exact match (either unified is alone, or we match instruction or data), return immediately */
665  return depth;
666  }
667  /* went to the bottom, return what we found */
668  return found;
669 }
670 
675 static __hwloc_inline hwloc_obj_t
676 hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
677 static __hwloc_inline hwloc_obj_t
679 {
680  hwloc_obj_t current = hwloc_get_obj_covering_cpuset(topology, set);
681  while (current) {
682  if (hwloc_obj_type_is_dcache(current->type))
683  return current;
684  current = current->parent;
685  }
686  return NULL;
687 }
688 
694 static __hwloc_inline hwloc_obj_t
695 hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj) __hwloc_attribute_pure;
696 static __hwloc_inline hwloc_obj_t
697 hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj)
698 {
699  hwloc_obj_t current = obj->parent;
700  if (!obj->cpuset)
701  return NULL;
702  while (current) {
703  if (!hwloc_bitmap_isequal(current->cpuset, obj->cpuset)
704  && hwloc_obj_type_is_dcache(current->type))
705  return current;
706  current = current->parent;
707  }
708  return NULL;
709 }
710 
742 HWLOC_DECLSPEC int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which);
743 
755 static __hwloc_inline hwloc_obj_t
756 hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
757 static __hwloc_inline hwloc_obj_t
758 hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index)
759 {
760  hwloc_obj_t obj = NULL;
761  while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PU, obj)) != NULL)
762  if (obj->os_index == os_index)
763  return obj;
764  return NULL;
765 }
766 
778 static __hwloc_inline hwloc_obj_t
779 hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
780 static __hwloc_inline hwloc_obj_t
782 {
783  hwloc_obj_t obj = NULL;
784  while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NUMANODE, obj)) != NULL)
785  if (obj->os_index == os_index)
786  return obj;
787  return NULL;
788 }
789 
801 /* TODO: rather provide an iterator? Provide a way to know how much should be allocated? By returning the total number of objects instead? */
802 HWLOC_DECLSPEC unsigned hwloc_get_closest_objs (hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t * __hwloc_restrict objs, unsigned max);
803 
818 static __hwloc_inline hwloc_obj_t
820  hwloc_obj_type_t type1, unsigned idx1,
821  hwloc_obj_type_t type2, unsigned idx2) __hwloc_attribute_pure;
822 static __hwloc_inline hwloc_obj_t
824  hwloc_obj_type_t type1, unsigned idx1,
825  hwloc_obj_type_t type2, unsigned idx2)
826 {
827  hwloc_obj_t obj;
828  obj = hwloc_get_obj_by_type (topology, type1, idx1);
829  if (!obj)
830  return NULL;
831  return hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, type2, idx2);
832 }
833 
854 static __hwloc_inline hwloc_obj_t
855 hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv) __hwloc_attribute_pure;
856 static __hwloc_inline hwloc_obj_t
857 hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv)
858 {
859  hwloc_obj_t obj = hwloc_get_root_obj(topology);
860  int i;
861  for(i=0; i<nr; i++) {
862  if (!obj)
863  return NULL;
864  obj = hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, typev[i], idxv[i]);
865  }
866  return obj;
867 }
868 
907 HWLOC_DECLSPEC hwloc_obj_t
909  hwloc_obj_type_t type, const char *subtype, const char *nameprefix,
910  unsigned long flags);
911 
927 };
928 
951 static __hwloc_inline int
953  hwloc_obj_t *roots, unsigned n_roots,
954  hwloc_cpuset_t *set,
955  unsigned n,
956  int until, unsigned long flags)
957 {
958  unsigned i;
959  unsigned tot_weight;
960  unsigned given, givenweight;
961  hwloc_cpuset_t *cpusetp = set;
962 
963  if (flags & ~HWLOC_DISTRIB_FLAG_REVERSE) {
964  errno = EINVAL;
965  return -1;
966  }
967 
968  tot_weight = 0;
969  for (i = 0; i < n_roots; i++)
970  tot_weight += (unsigned) hwloc_bitmap_weight(roots[i]->cpuset);
971 
972  for (i = 0, given = 0, givenweight = 0; i < n_roots; i++) {
973  unsigned chunk, weight;
974  hwloc_obj_t root = roots[flags & HWLOC_DISTRIB_FLAG_REVERSE ? n_roots-1-i : i];
975  hwloc_cpuset_t cpuset = root->cpuset;
976  while (!hwloc_obj_type_is_normal(root->type))
977  /* If memory/io/misc, walk up to normal parent */
978  root = root->parent;
979  weight = (unsigned) hwloc_bitmap_weight(cpuset);
980  if (!weight)
981  continue;
982  /* Give to root a chunk proportional to its weight.
983  * If previous chunks got rounded-up, we may get a bit less. */
984  chunk = (( (givenweight+weight) * n + tot_weight-1) / tot_weight)
985  - (( givenweight * n + tot_weight-1) / tot_weight);
986  if (!root->arity || chunk <= 1 || root->depth >= until) {
987  /* We can't split any more, put everything there. */
988  if (chunk) {
989  /* Fill cpusets with ours */
990  unsigned j;
991  for (j=0; j < chunk; j++)
992  cpusetp[j] = hwloc_bitmap_dup(cpuset);
993  } else {
994  /* We got no chunk, just merge our cpuset to a previous one
995  * (the first chunk cannot be empty)
996  * so that this root doesn't get ignored.
997  */
998  assert(given);
999  hwloc_bitmap_or(cpusetp[-1], cpusetp[-1], cpuset);
1000  }
1001  } else {
1002  /* Still more to distribute, recurse into children */
1003  hwloc_distrib(topology, root->children, root->arity, cpusetp, chunk, until, flags);
1004  }
1005  cpusetp += chunk;
1006  given += chunk;
1007  givenweight += weight;
1008  }
1009 
1010  return 0;
1011 }
1012 
1032 HWLOC_DECLSPEC hwloc_const_cpuset_t
1033 hwloc_topology_get_complete_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
1034 
1048 HWLOC_DECLSPEC hwloc_const_cpuset_t
1049 hwloc_topology_get_topology_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
1050 
1069 HWLOC_DECLSPEC hwloc_const_cpuset_t
1070 hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
1071 
1083 HWLOC_DECLSPEC hwloc_const_nodeset_t
1084 hwloc_topology_get_complete_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
1085 
1099 HWLOC_DECLSPEC hwloc_const_nodeset_t
1100 hwloc_topology_get_topology_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
1101 
1120 HWLOC_DECLSPEC hwloc_const_nodeset_t
1121 hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
1122 
1146 static __hwloc_inline int
1148 {
1149  int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
1150  hwloc_obj_t obj = NULL;
1151  assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN);
1152  hwloc_bitmap_zero(nodeset);
1153  while ((obj = hwloc_get_next_obj_covering_cpuset_by_depth(topology, _cpuset, depth, obj)) != NULL)
1154  if (hwloc_bitmap_set(nodeset, obj->os_index) < 0)
1155  return -1;
1156  return 0;
1157 }
1158 
1173 static __hwloc_inline int
1175 {
1176  int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
1177  hwloc_obj_t obj = NULL;
1178  assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN);
1179  hwloc_bitmap_zero(_cpuset);
1180  while ((obj = hwloc_get_next_obj_by_depth(topology, depth, obj)) != NULL) {
1181  if (hwloc_bitmap_isset(nodeset, obj->os_index))
1182  /* no need to check obj->cpuset because objects in levels always have a cpuset */
1183  if (hwloc_bitmap_or(_cpuset, _cpuset, obj->cpuset) < 0)
1184  return -1;
1185  }
1186  return 0;
1187 }
1188 
1212 static __hwloc_inline hwloc_obj_t
1213 hwloc_get_non_io_ancestor_obj(hwloc_topology_t topology __hwloc_attribute_unused,
1214  hwloc_obj_t ioobj)
1215 {
1216  hwloc_obj_t obj = ioobj;
1217  while (obj && !obj->cpuset) {
1218  obj = obj->parent;
1219  }
1220  return obj;
1221 }
1222 
1229 static __hwloc_inline hwloc_obj_t
1231 {
1232  return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PCI_DEVICE, prev);
1233 }
1234 
1240 static __hwloc_inline hwloc_obj_t
1242  unsigned domain, unsigned bus, unsigned dev, unsigned func)
1243 {
1244  hwloc_obj_t obj = NULL;
1245  while ((obj = hwloc_get_next_pcidev(topology, obj)) != NULL) {
1246  if (obj->attr->pcidev.domain == domain
1247  && obj->attr->pcidev.bus == bus
1248  && obj->attr->pcidev.dev == dev
1249  && obj->attr->pcidev.func == func)
1250  return obj;
1251  }
1252  return NULL;
1253 }
1254 
1260 static __hwloc_inline hwloc_obj_t
1262 {
1263  unsigned domain = 0; /* default */
1264  unsigned bus, dev, func;
1265 
1266  if (sscanf(busid, "%x:%x.%x", &bus, &dev, &func) != 3
1267  && sscanf(busid, "%x:%x:%x.%x", &domain, &bus, &dev, &func) != 4) {
1268  errno = EINVAL;
1269  return NULL;
1270  }
1271 
1272  return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, func);
1273 }
1274 
1281 static __hwloc_inline hwloc_obj_t
1283 {
1284  return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_OS_DEVICE, prev);
1285 }
1286 
1293 static __hwloc_inline hwloc_obj_t
1295 {
1296  return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_BRIDGE, prev);
1297 }
1298 
1299 /* \brief Checks whether a given bridge covers a given PCI bus.
1300  *
1301  * \return 1 if it covers, 0 if not.
1302  */
1303 static __hwloc_inline int
1305  unsigned domain, unsigned bus)
1306 {
1307  return bridge->type == HWLOC_OBJ_BRIDGE
1309  && bridge->attr->bridge.downstream.pci.domain == domain
1310  && bridge->attr->bridge.downstream.pci.secondary_bus <= bus
1311  && bridge->attr->bridge.downstream.pci.subordinate_bus >= bus;
1312 }
1313 
1318 #ifdef __cplusplus
1319 } /* extern "C" */
1320 #endif
1321 
1322 
1323 #endif /* HWLOC_HELPER_H */
static hwloc_obj_t hwloc_get_next_obj_inside_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set, int depth, hwloc_obj_t prev)
Return the next object at depth depth included in CPU set set.
Definition: helper.h:170
int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id)
Test whether index id is part of bitmap bitmap.
unsigned char func
Function number (t in the PCI BDF notation xxxx:yy:zz.t).
Definition: hwloc.h:678
static hwloc_obj_t hwloc_get_obj_inside_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set, int depth, unsigned idx)
Return the (logically) idx -th object at depth depth included in CPU set set.
Definition: helper.h:223
static hwloc_obj_t hwloc_get_cache_covering_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set)
Get the first data (or unified) cache covering a cpuset set.
Definition: helper.h:678
hwloc_nodeset_t nodeset
NUMA nodes covered by this object or containing this object.
Definition: hwloc.h:575
static hwloc_obj_t hwloc_get_next_child(hwloc_topology_t topology, hwloc_obj_t parent, hwloc_obj_t prev)
Return the next child.
Definition: helper.h:580
int depth
Vertical index in the hierarchy.
Definition: hwloc.h:454
No object of given type exists in the topology.
Definition: hwloc.h:879
Structure of a topology object.
Definition: hwloc.h:431
hwloc_cpuset_t cpuset
CPUs covered by this object.
Definition: hwloc.h:547
hwloc_bitmap_t hwloc_bitmap_dup(hwloc_const_bitmap_t bitmap)
Duplicate bitmap bitmap by allocating a new bitmap and copying bitmap contents.
int hwloc_obj_type_is_cache(hwloc_obj_type_t type)
Check whether an object type is a CPU Cache (Data, Unified or Instruction).
void hwloc_bitmap_zero(hwloc_bitmap_t bitmap)
Empty the bitmap bitmap.
static hwloc_obj_t hwloc_get_next_obj_inside_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_type_t type, hwloc_obj_t prev)
Return the next object of type type included in CPU set set.
Definition: helper.h:200
int hwloc_obj_type_is_icache(hwloc_obj_type_t type)
Check whether an object type is a CPU Instruction Cache,.
static hwloc_obj_t hwloc_get_ancestor_obj_by_type(hwloc_topology_t topology, hwloc_obj_type_t type, hwloc_obj_t obj)
Returns the ancestor object of obj with type type.
Definition: helper.h:517
union hwloc_obj_attr_u::hwloc_bridge_attr_s::@1 downstream
static int hwloc_cpuset_from_nodeset(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset)
Convert a NUMA node set into a CPU set.
Definition: helper.h:1174
hwloc_obj_bridge_type_t downstream_type
Downstream Bridge type.
Definition: hwloc.h:711
Objects of given type exist at different depth in the topology (only for Groups). ...
Definition: hwloc.h:880
static hwloc_obj_t hwloc_get_next_osdev(hwloc_topology_t topology, hwloc_obj_t prev)
Get the next OS device in the system.
Definition: helper.h:1282
Miscellaneous objects (filtered out by default). Objects without particular meaning, that can e.g. be added by the application for its own use, or by hwloc for miscellaneous objects such as MemoryModule (DIMMs).
Definition: hwloc.h:316
static hwloc_obj_t hwloc_get_next_obj_covering_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set, int depth, hwloc_obj_t prev)
Iterate through same-depth objects covering at least CPU set set.
Definition: helper.h:428
static hwloc_obj_t hwloc_get_shared_cache_covering_obj(hwloc_topology_t topology, hwloc_obj_t obj)
Get the first data (or unified) cache shared between an object and somebody else. ...
Definition: helper.h:697
static hwloc_obj_t hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index)
Returns the object of type HWLOC_OBJ_NUMANODE with os_index.
Definition: helper.h:781
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
struct hwloc_obj * misc_first_child
First Misc child. Misc objects are listed here (misc_arity and misc_first_child) instead of in the no...
Definition: hwloc.h:540
hwloc_const_nodeset_t hwloc_topology_get_complete_nodeset(hwloc_topology_t topology)
Get complete node set.
hwloc_obj_cache_type_t type
Cache type.
Definition: hwloc.h:657
int hwloc_bitmap_weight(hwloc_const_bitmap_t bitmap)
Compute the "weight" of bitmap bitmap (i.e., number of indexes that are in the bitmap).
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
static hwloc_obj_t hwloc_get_first_largest_obj_inside_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set)
Get the first largest object included in the given cpuset set.
Definition: helper.h:123
struct hwloc_obj_attr_u::hwloc_bridge_attr_s bridge
struct hwloc_obj * first_child
First normal child.
Definition: hwloc.h:492
static hwloc_obj_t hwloc_get_next_obj_by_depth(hwloc_topology_t topology, int depth, hwloc_obj_t prev)
Returns the next object at depth depth.
PCI-side of a bridge.
Definition: hwloc.h:367
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
unsigned short domain
Domain number (xxxx in the PCI BDF notation xxxx:yy:zz.t). Only 16bits PCI domains are supported by d...
Definition: hwloc.h:670
hwloc_bitmap_t hwloc_cpuset_t
A CPU set is a bitmap whose bits are set according to CPU physical OS indexes.
Definition: hwloc.h:161
static hwloc_obj_t hwloc_get_obj_inside_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_type_t type, unsigned idx)
Return the idx -th object of type type included in CPU set set.
Definition: helper.h:259
unsigned hwloc_get_closest_objs(hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t *restrict objs, unsigned max)
Do a depth-first traversal of the topology to find and sort.
Distrib in reverse order, starting from the last objects.
Definition: helper.h:926
hwloc_const_nodeset_t hwloc_topology_get_topology_nodeset(hwloc_topology_t topology)
Get topology node set.
Processing Unit, or (Logical) Processor. An execution unit (may share a core with some other logical ...
Definition: hwloc.h:222
static int hwloc_get_obj_index_inside_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_t obj)
Return the logical index among the objects included in CPU set set.
Definition: helper.h:346
int hwloc_bitmap_or(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Or bitmaps bitmap1 and bitmap2 and store the result in bitmap res.
static hwloc_obj_t hwloc_get_obj_by_type(hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx)
Returns the topology object at logical index idx with type type.
static int hwloc_bridge_covers_pcibus(hwloc_obj_t bridge, unsigned domain, unsigned bus)
Definition: helper.h:1304
static hwloc_obj_t hwloc_get_pcidev_by_busidstring(hwloc_topology_t topology, const char *busid)
Find the PCI device object matching the PCI bus id given as a string xxxx:yy:zz.t or yy:zz...
Definition: helper.h:1261
NUMA node. An object that contains memory that is directly and byte-accessible to the host processors...
Definition: hwloc.h:257
hwloc_const_bitmap_t hwloc_const_cpuset_t
A non-modifiable hwloc_cpuset_t.
Definition: hwloc.h:163
hwloc_const_bitmap_t hwloc_const_nodeset_t
A non-modifiable hwloc_nodeset_t.
Definition: hwloc.h:181
PCI device (filtered out by default).
Definition: hwloc.h:295
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition: hwloc.h:450
Bridge (filtered out by default). Any bridge (or PCI switch) that connects the host or an I/O bus...
Definition: hwloc.h:283
Operating system device (filtered out by default).
Definition: hwloc.h:305
int hwloc_obj_type_is_normal(hwloc_obj_type_t type)
Check whether an object type is Normal.
int hwloc_get_type_depth(hwloc_topology_t topology, hwloc_obj_type_t type)
Returns the depth of objects of type type.
hwloc_obj_type_t
Type of topology object.
Definition: hwloc.h:197
hwloc_const_nodeset_t hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology)
Get allowed node set.
struct hwloc_obj ** children
Normal children, children[0 .. arity -1].
Definition: hwloc.h:491
unsigned os_index
OS-provided physical index number. It is not guaranteed unique across the entire machine, except for PUs and NUMA nodes. Set to HWLOC_UNKNOWN_INDEX if unknown or irrelevant for this object.
Definition: hwloc.h:436
static hwloc_obj_t hwloc_get_next_pcidev(hwloc_topology_t topology, hwloc_obj_t prev)
Get the next PCI device in the system.
Definition: helper.h:1230
char * subtype
Subtype string to better describe the type field.
Definition: hwloc.h:434
enum hwloc_obj_cache_type_e hwloc_obj_cache_type_t
Cache type.
int hwloc_obj_type_is_memory(hwloc_obj_type_t type)
Check whether an object type is Memory.
static hwloc_obj_t hwloc_get_obj_below_array_by_type(hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv)
Find an object below a chain of objects specified by types and indexes.
Definition: helper.h:857
hwloc_const_cpuset_t hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology)
Get allowed CPU set.
static unsigned hwloc_get_nbobjs_inside_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set, int depth)
Return the number of objects at depth depth included in CPU set set.
Definition: helper.h:283
hwloc_obj_type_t type
Type of object.
Definition: hwloc.h:433
unsigned char dev
Device number (zz in the PCI BDF notation xxxx:yy:zz.t).
Definition: hwloc.h:677
hwloc_const_cpuset_t hwloc_topology_get_topology_cpuset(hwloc_topology_t topology)
Get topology CPU set.
struct hwloc_obj * parent
Parent, NULL if root (Machine object)
Definition: hwloc.h:481
Unified cache.
Definition: hwloc.h:359
static hwloc_obj_t hwloc_get_common_ancestor_obj(hwloc_topology_t topology, hwloc_obj_t obj1, hwloc_obj_t obj2)
Returns the common parent object to objects obj1 and obj2.
Definition: helper.h:534
hwloc_obj_t hwloc_get_obj_with_same_locality(hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_type_t type, const char *subtype, const char *nameprefix, unsigned long flags)
Return an object of a different type with same locality.
static hwloc_obj_t hwloc_get_pcidev_by_busid(hwloc_topology_t topology, unsigned domain, unsigned bus, unsigned dev, unsigned func)
Find the PCI device object matching the PCI bus id given domain, bus device and function PCI bus id...
Definition: helper.h:1241
static hwloc_obj_t hwloc_get_next_obj_by_type(hwloc_topology_t topology, hwloc_obj_type_t type, hwloc_obj_t prev)
Returns the next object of type type.
static int hwloc_distrib(hwloc_topology_t topology, hwloc_obj_t *roots, unsigned n_roots, hwloc_cpuset_t *set, unsigned n, int until, unsigned long flags)
Distribute n items over the topology under roots.
Definition: helper.h:952
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition: hwloc.h:742
int hwloc_bitmap_isequal(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmap bitmap1 is equal to bitmap bitmap2.
static hwloc_obj_t hwloc_get_non_io_ancestor_obj(hwloc_topology_t topology, hwloc_obj_t ioobj)
Get the first non-I/O ancestor object.
Definition: helper.h:1213
static hwloc_obj_t hwloc_get_child_covering_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_t parent)
Get the child covering at least CPU set set.
Definition: helper.h:378
hwloc_obj_t hwloc_get_obj_by_depth(hwloc_topology_t topology, int depth, unsigned idx)
Returns the topology object at logical index idx from depth depth.
unsigned depth
Depth of cache (e.g., L1, L2, ...etc.)
Definition: hwloc.h:653
unsigned char bus
Bus number (yy in the PCI BDF notation xxxx:yy:zz.t).
Definition: hwloc.h:676
static int hwloc_get_nbobjs_inside_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_type_t type)
Return the number of objects of type type included in CPU set set.
Definition: helper.h:315
unsigned arity
Number of normal children. Memory, Misc and I/O children are not listed here but rather in their dedi...
Definition: hwloc.h:487
hwloc_bitmap_t hwloc_nodeset_t
A node set is a bitmap whose bits are set according to NUMA memory node physical OS indexes...
Definition: hwloc.h:178
static hwloc_obj_t hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index)
Returns the object of type HWLOC_OBJ_PU with os_index.
Definition: helper.h:758
static int hwloc_get_cache_type_depth(hwloc_topology_t topology, unsigned cachelevel, hwloc_obj_cache_type_t cachetype)
Find the depth of cache objects matching cache level and type.
Definition: helper.h:642
struct hwloc_bitmap_s * hwloc_bitmap_t
Set of bits represented as an opaque pointer to an internal bitmap.
Definition: bitmap.h:69
static hwloc_obj_t hwloc_get_obj_covering_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set)
Get the lowest object covering at least CPU set set.
Definition: helper.h:401
static hwloc_obj_t hwloc_get_next_obj_covering_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_type_t type, hwloc_obj_t prev)
Iterate through same-type objects covering at least CPU set set.
Definition: helper.h:456
struct hwloc_obj * next_sibling
Next object below the same parent (inside the same list of children).
Definition: hwloc.h:483
hwloc_distrib_flags_e
Flags to be given to hwloc_distrib().
Definition: helper.h:922
static hwloc_obj_t hwloc_get_obj_below_by_type(hwloc_topology_t topology, hwloc_obj_type_t type1, unsigned idx1, hwloc_obj_type_t type2, unsigned idx2)
Find an object below another object, both specified by types and indexes.
Definition: helper.h:823
static hwloc_obj_t hwloc_get_ancestor_obj_by_depth(hwloc_topology_t topology, int depth, hwloc_obj_t obj)
Returns the ancestor object of obj at depth depth.
Definition: helper.h:491
int hwloc_bitmap_isincluded(hwloc_const_bitmap_t sub_bitmap, hwloc_const_bitmap_t super_bitmap)
Test whether bitmap sub_bitmap is part of bitmap super_bitmap.
static int hwloc_obj_is_in_subtree(hwloc_topology_t topology, hwloc_obj_t obj, hwloc_obj_t subtree_root)
Returns true if obj is inside the subtree beginning with ancestor object subtree_root.
Definition: helper.h:564
static hwloc_obj_t hwloc_get_next_bridge(hwloc_topology_t topology, hwloc_obj_t prev)
Get the next bridge in the system.
Definition: helper.h:1294
int hwloc_obj_type_is_io(hwloc_obj_type_t type)
Check whether an object type is I/O.
struct hwloc_obj * memory_first_child
First Memory child. NUMA nodes and Memory-side caches are listed here (memory_arity and memory_first_...
Definition: hwloc.h:510
static hwloc_obj_t hwloc_get_root_obj(hwloc_topology_t topology)
Returns the top-object of the topology-tree.
int hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id)
Add index id in bitmap bitmap.
int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which)
Remove simultaneous multithreading PUs from a CPU set.
static int hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset)
Convert a CPU set into a NUMA node set.
Definition: helper.h:1147
struct hwloc_obj * io_first_child
First I/O child. Bridges, PCI and OS devices are listed here (io_arity and io_first_child) instead of...
Definition: hwloc.h:528
struct hwloc_obj_attr_u::hwloc_cache_attr_s cache
struct hwloc_pcidev_attr_s pci
PCI attribute of the upstream part as a PCI device.
Definition: hwloc.h:695
struct hwloc_obj * prev_cousin
Previous object of same type and depth.
Definition: hwloc.h:478
int hwloc_get_largest_objs_inside_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_obj_t *restrict objs, int max)
Get the set of largest objects covering exactly a given cpuset set.
struct hwloc_obj * next_cousin
Next object of same type and depth.
Definition: hwloc.h:477
int hwloc_obj_type_is_dcache(hwloc_obj_type_t type)
Check whether an object type is a CPU Data or Unified Cache.
int hwloc_bitmap_intersects(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmaps bitmap1 and bitmap2 intersects.