Hardware Locality (hwloc) 2.9.0
helper.h
1/*
2 * Copyright © 2009 CNRS
3 * Copyright © 2009-2022 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
25extern "C" {
26#endif
27
28
41static __hwloc_inline hwloc_obj_t
43{
44 hwloc_obj_t obj = hwloc_get_root_obj(topology);
45 if (!hwloc_bitmap_intersects(obj->cpuset, set))
46 return NULL;
47 while (!hwloc_bitmap_isincluded(obj->cpuset, set)) {
48 /* while the object intersects without being included, look at its children */
49 hwloc_obj_t child = obj->first_child;
50 while (child) {
51 if (hwloc_bitmap_intersects(child->cpuset, set))
52 break;
53 child = child->next_sibling;
54 }
55 if (!child)
56 /* no child intersects, return their father */
57 return obj;
58 /* found one intersecting child, look at its children */
59 obj = child;
60 }
61 /* obj is included, return it */
62 return obj;
63}
64
70 hwloc_obj_t * __hwloc_restrict objs, int max);
71
84static __hwloc_inline hwloc_obj_t
86 int depth, hwloc_obj_t prev)
87{
88 hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
89 if (!next)
90 return NULL;
91 while (next && (hwloc_bitmap_iszero(next->cpuset) || !hwloc_bitmap_isincluded(next->cpuset, set)))
92 next = next->next_cousin;
93 return next;
94}
95
108static __hwloc_inline hwloc_obj_t
110 hwloc_obj_type_t type, hwloc_obj_t prev)
111{
112 int depth = hwloc_get_type_depth(topology, type);
114 return NULL;
115 return hwloc_get_next_obj_inside_cpuset_by_depth(topology, set, depth, prev);
116}
117
126static __hwloc_inline hwloc_obj_t
128 int depth, unsigned idx) __hwloc_attribute_pure;
129static __hwloc_inline hwloc_obj_t
131 int depth, unsigned idx)
132{
133 hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
134 unsigned count = 0;
135 if (!obj)
136 return NULL;
137 while (obj) {
138 if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set)) {
139 if (count == idx)
140 return obj;
141 count++;
142 }
143 obj = obj->next_cousin;
144 }
145 return NULL;
146}
147
160static __hwloc_inline hwloc_obj_t
162 hwloc_obj_type_t type, unsigned idx) __hwloc_attribute_pure;
163static __hwloc_inline hwloc_obj_t
165 hwloc_obj_type_t type, unsigned idx)
166{
167 int depth = hwloc_get_type_depth(topology, type);
169 return NULL;
170 return hwloc_get_obj_inside_cpuset_by_depth(topology, set, depth, idx);
171}
172
181static __hwloc_inline unsigned
183 int depth) __hwloc_attribute_pure;
184static __hwloc_inline unsigned
186 int depth)
187{
188 hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
189 unsigned count = 0;
190 if (!obj)
191 return 0;
192 while (obj) {
194 count++;
195 obj = obj->next_cousin;
196 }
197 return count;
198}
199
212static __hwloc_inline int
214 hwloc_obj_type_t type) __hwloc_attribute_pure;
215static __hwloc_inline int
217 hwloc_obj_type_t type)
218{
219 int depth = hwloc_get_type_depth(topology, type);
220 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
221 return 0;
222 if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
223 return -1; /* FIXME: agregate nbobjs from different levels? */
224 return (int) hwloc_get_nbobjs_inside_cpuset_by_depth(topology, set, depth);
225}
226
240static __hwloc_inline int
241hwloc_get_obj_index_inside_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
242 hwloc_obj_t obj) __hwloc_attribute_pure;
243static __hwloc_inline int
245 hwloc_obj_t obj)
246{
247 int idx = 0;
248 if (!hwloc_bitmap_isincluded(obj->cpuset, set))
249 return -1;
250 /* count how many objects are inside the cpuset on the way from us to the beginning of the level */
251 while ((obj = obj->prev_cousin) != NULL)
253 idx++;
254 return idx;
255}
256
271static __hwloc_inline hwloc_obj_t
272hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
273 hwloc_obj_t parent) __hwloc_attribute_pure;
274static __hwloc_inline hwloc_obj_t
276 hwloc_obj_t parent)
277{
278 hwloc_obj_t child;
279 if (hwloc_bitmap_iszero(set))
280 return NULL;
281 child = parent->first_child;
282 while (child) {
283 if (child->cpuset && hwloc_bitmap_isincluded(set, child->cpuset))
284 return child;
285 child = child->next_sibling;
286 }
287 return NULL;
288}
289
294static __hwloc_inline hwloc_obj_t
295hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
296static __hwloc_inline hwloc_obj_t
298{
299 struct hwloc_obj *current = hwloc_get_root_obj(topology);
300 if (hwloc_bitmap_iszero(set) || !hwloc_bitmap_isincluded(set, current->cpuset))
301 return NULL;
302 while (1) {
303 hwloc_obj_t child = hwloc_get_child_covering_cpuset(topology, set, current);
304 if (!child)
305 return current;
306 current = child;
307 }
308}
309
320static __hwloc_inline hwloc_obj_t
322 int depth, hwloc_obj_t prev)
323{
324 hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
325 if (!next)
326 return NULL;
327 while (next && !hwloc_bitmap_intersects(set, next->cpuset))
328 next = next->next_cousin;
329 return next;
330}
331
347static __hwloc_inline hwloc_obj_t
356
377static __hwloc_inline hwloc_obj_t
378hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj) __hwloc_attribute_pure;
379static __hwloc_inline hwloc_obj_t
380hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj)
381{
382 hwloc_obj_t ancestor = obj;
383 if (obj->depth < depth)
384 return NULL;
385 while (ancestor && ancestor->depth > depth)
386 ancestor = ancestor->parent;
387 return ancestor;
388}
389
397static __hwloc_inline hwloc_obj_t
398hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj) __hwloc_attribute_pure;
399static __hwloc_inline hwloc_obj_t
401{
402 hwloc_obj_t ancestor = obj->parent;
403 while (ancestor && ancestor->type != type)
404 ancestor = ancestor->parent;
405 return ancestor;
406}
407
409static __hwloc_inline hwloc_obj_t
410hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2) __hwloc_attribute_pure;
411static __hwloc_inline hwloc_obj_t
412hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2)
413{
414 /* the loop isn't so easy since intermediate ancestors may have
415 * different depth, causing us to alternate between using obj1->parent
416 * and obj2->parent. Also, even if at some point we find ancestors of
417 * of the same depth, their ancestors may have different depth again.
418 */
419 while (obj1 != obj2) {
420 while (obj1->depth > obj2->depth)
421 obj1 = obj1->parent;
422 while (obj2->depth > obj1->depth)
423 obj2 = obj2->parent;
424 if (obj1 != obj2 && obj1->depth == obj2->depth) {
425 obj1 = obj1->parent;
426 obj2 = obj2->parent;
427 }
428 }
429 return obj1;
430}
431
437static __hwloc_inline int
438hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root) __hwloc_attribute_pure;
439static __hwloc_inline int
440hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root)
441{
442 return obj->cpuset && subtree_root->cpuset && hwloc_bitmap_isincluded(obj->cpuset, subtree_root->cpuset);
443}
444
455static __hwloc_inline hwloc_obj_t
456hwloc_get_next_child (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t parent, hwloc_obj_t prev)
457{
458 hwloc_obj_t obj;
459 int state = 0;
460 if (prev) {
461 if (prev->type == HWLOC_OBJ_MISC)
462 state = 3;
463 else if (prev->type == HWLOC_OBJ_BRIDGE || prev->type == HWLOC_OBJ_PCI_DEVICE || prev->type == HWLOC_OBJ_OS_DEVICE)
464 state = 2;
465 else if (prev->type == HWLOC_OBJ_NUMANODE)
466 state = 1;
467 obj = prev->next_sibling;
468 } else {
469 obj = parent->first_child;
470 }
471 if (!obj && state == 0) {
473 state = 1;
474 }
475 if (!obj && state == 1) {
476 obj = parent->io_first_child;
477 state = 2;
478 }
479 if (!obj && state == 2) {
481 state = 3;
482 }
483 return obj;
484}
485
512HWLOC_DECLSPEC int
514
523HWLOC_DECLSPEC int
525
534HWLOC_DECLSPEC int
536
543HWLOC_DECLSPEC int
545
552HWLOC_DECLSPEC int
554
561HWLOC_DECLSPEC int
563
593static __hwloc_inline int
595 unsigned cachelevel, hwloc_obj_cache_type_t cachetype)
596{
597 int depth;
598 int found = HWLOC_TYPE_DEPTH_UNKNOWN;
599 for (depth=0; ; depth++) {
600 hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, 0);
601 if (!obj)
602 break;
603 if (!hwloc_obj_type_is_dcache(obj->type) || obj->attr->cache.depth != cachelevel)
604 /* doesn't match, try next depth */
605 continue;
606 if (cachetype == (hwloc_obj_cache_type_t) -1) {
607 if (found != HWLOC_TYPE_DEPTH_UNKNOWN) {
608 /* second match, return MULTIPLE */
610 }
611 /* first match, mark it as found */
612 found = depth;
613 continue;
614 }
615 if (obj->attr->cache.type == cachetype || obj->attr->cache.type == HWLOC_OBJ_CACHE_UNIFIED)
616 /* exact match (either unified is alone, or we match instruction or data), return immediately */
617 return depth;
618 }
619 /* went to the bottom, return what we found */
620 return found;
621}
622
627static __hwloc_inline hwloc_obj_t
628hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
629static __hwloc_inline hwloc_obj_t
631{
632 hwloc_obj_t current = hwloc_get_obj_covering_cpuset(topology, set);
633 while (current) {
634 if (hwloc_obj_type_is_dcache(current->type))
635 return current;
636 current = current->parent;
637 }
638 return NULL;
639}
640
645static __hwloc_inline hwloc_obj_t
646hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj) __hwloc_attribute_pure;
647static __hwloc_inline hwloc_obj_t
649{
650 hwloc_obj_t current = obj->parent;
651 if (!obj->cpuset)
652 return NULL;
653 while (current) {
654 if (!hwloc_bitmap_isequal(current->cpuset, obj->cpuset)
655 && hwloc_obj_type_is_dcache(current->type))
656 return current;
657 current = current->parent;
658 }
659 return NULL;
660}
661
691HWLOC_DECLSPEC int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which);
692
702static __hwloc_inline hwloc_obj_t
703hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
704static __hwloc_inline hwloc_obj_t
706{
707 hwloc_obj_t obj = NULL;
708 while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PU, obj)) != NULL)
709 if (obj->os_index == os_index)
710 return obj;
711 return NULL;
712}
713
723static __hwloc_inline hwloc_obj_t
724hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
725static __hwloc_inline hwloc_obj_t
727{
728 hwloc_obj_t obj = NULL;
729 while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NUMANODE, obj)) != NULL)
730 if (obj->os_index == os_index)
731 return obj;
732 return NULL;
733}
734
746/* TODO: rather provide an iterator? Provide a way to know how much should be allocated? By returning the total number of objects instead? */
747HWLOC_DECLSPEC unsigned hwloc_get_closest_objs (hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t * __hwloc_restrict objs, unsigned max);
748
761static __hwloc_inline hwloc_obj_t
763 hwloc_obj_type_t type1, unsigned idx1,
764 hwloc_obj_type_t type2, unsigned idx2) __hwloc_attribute_pure;
765static __hwloc_inline hwloc_obj_t
767 hwloc_obj_type_t type1, unsigned idx1,
768 hwloc_obj_type_t type2, unsigned idx2)
769{
770 hwloc_obj_t obj;
771 obj = hwloc_get_obj_by_type (topology, type1, idx1);
772 if (!obj)
773 return NULL;
774 return hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, type2, idx2);
775}
776
795static __hwloc_inline hwloc_obj_t
796hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv) __hwloc_attribute_pure;
797static __hwloc_inline hwloc_obj_t
799{
800 hwloc_obj_t obj = hwloc_get_root_obj(topology);
801 int i;
802 for(i=0; i<nr; i++) {
803 if (!obj)
804 return NULL;
805 obj = hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, typev[i], idxv[i]);
806 }
807 return obj;
808}
809
848HWLOC_DECLSPEC hwloc_obj_t
850 hwloc_obj_type_t type, const char *subtype, const char *nameprefix,
851 unsigned long flags);
852
869
890static __hwloc_inline int
892 hwloc_obj_t *roots, unsigned n_roots,
893 hwloc_cpuset_t *set,
894 unsigned n,
895 int until, unsigned long flags)
896{
897 unsigned i;
898 unsigned tot_weight;
899 unsigned given, givenweight;
900 hwloc_cpuset_t *cpusetp = set;
901
902 if (flags & ~HWLOC_DISTRIB_FLAG_REVERSE) {
903 errno = EINVAL;
904 return -1;
905 }
906
907 tot_weight = 0;
908 for (i = 0; i < n_roots; i++)
909 tot_weight += (unsigned) hwloc_bitmap_weight(roots[i]->cpuset);
910
911 for (i = 0, given = 0, givenweight = 0; i < n_roots; i++) {
912 unsigned chunk, weight;
913 hwloc_obj_t root = roots[flags & HWLOC_DISTRIB_FLAG_REVERSE ? n_roots-1-i : i];
915 while (!hwloc_obj_type_is_normal(root->type))
916 /* If memory/io/misc, walk up to normal parent */
917 root = root->parent;
918 weight = (unsigned) hwloc_bitmap_weight(cpuset);
919 if (!weight)
920 continue;
921 /* Give to root a chunk proportional to its weight.
922 * If previous chunks got rounded-up, we may get a bit less. */
923 chunk = (( (givenweight+weight) * n + tot_weight-1) / tot_weight)
924 - (( givenweight * n + tot_weight-1) / tot_weight);
925 if (!root->arity || chunk <= 1 || root->depth >= until) {
926 /* We can't split any more, put everything there. */
927 if (chunk) {
928 /* Fill cpusets with ours */
929 unsigned j;
930 for (j=0; j < chunk; j++)
931 cpusetp[j] = hwloc_bitmap_dup(cpuset);
932 } else {
933 /* We got no chunk, just merge our cpuset to a previous one
934 * (the first chunk cannot be empty)
935 * so that this root doesn't get ignored.
936 */
937 assert(given);
938 hwloc_bitmap_or(cpusetp[-1], cpusetp[-1], cpuset);
939 }
940 } else {
941 /* Still more to distribute, recurse into children */
942 hwloc_distrib(topology, root->children, root->arity, cpusetp, chunk, until, flags);
943 }
944 cpusetp += chunk;
945 given += chunk;
946 givenweight += weight;
947 }
948
949 return 0;
950}
951
969HWLOC_DECLSPEC hwloc_const_cpuset_t
971
983HWLOC_DECLSPEC hwloc_const_cpuset_t
985
1002HWLOC_DECLSPEC hwloc_const_cpuset_t
1004
1014HWLOC_DECLSPEC hwloc_const_nodeset_t
1016
1028HWLOC_DECLSPEC hwloc_const_nodeset_t
1030
1047HWLOC_DECLSPEC hwloc_const_nodeset_t
1049
1070static __hwloc_inline int
1072{
1074 hwloc_obj_t obj = NULL;
1077 while ((obj = hwloc_get_next_obj_covering_cpuset_by_depth(topology, _cpuset, depth, obj)) != NULL)
1078 if (hwloc_bitmap_set(nodeset, obj->os_index) < 0)
1079 return -1;
1080 return 0;
1081}
1082
1094static __hwloc_inline int
1096{
1098 hwloc_obj_t obj = NULL;
1100 hwloc_bitmap_zero(_cpuset);
1101 while ((obj = hwloc_get_next_obj_by_depth(topology, depth, obj)) != NULL) {
1103 /* no need to check obj->cpuset because objects in levels always have a cpuset */
1104 if (hwloc_bitmap_or(_cpuset, _cpuset, obj->cpuset) < 0)
1105 return -1;
1106 }
1107 return 0;
1108}
1109
1129static __hwloc_inline hwloc_obj_t
1130hwloc_get_non_io_ancestor_obj(hwloc_topology_t topology __hwloc_attribute_unused,
1131 hwloc_obj_t ioobj)
1132{
1133 hwloc_obj_t obj = ioobj;
1134 while (obj && !obj->cpuset) {
1135 obj = obj->parent;
1136 }
1137 return obj;
1138}
1139
1144static __hwloc_inline hwloc_obj_t
1149
1153static __hwloc_inline hwloc_obj_t
1155 unsigned domain, unsigned bus, unsigned dev, unsigned func)
1156{
1157 hwloc_obj_t obj = NULL;
1158 while ((obj = hwloc_get_next_pcidev(topology, obj)) != NULL) {
1159 if (obj->attr->pcidev.domain == domain
1160 && obj->attr->pcidev.bus == bus
1161 && obj->attr->pcidev.dev == dev
1162 && obj->attr->pcidev.func == func)
1163 return obj;
1164 }
1165 return NULL;
1166}
1167
1171static __hwloc_inline hwloc_obj_t
1173{
1174 unsigned domain = 0; /* default */
1175 unsigned bus, dev, func;
1176
1177 if (sscanf(busid, "%x:%x.%x", &bus, &dev, &func) != 3
1178 && sscanf(busid, "%x:%x:%x.%x", &domain, &bus, &dev, &func) != 4) {
1179 errno = EINVAL;
1180 return NULL;
1181 }
1182
1183 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, func);
1184}
1185
1190static __hwloc_inline hwloc_obj_t
1195
1200static __hwloc_inline hwloc_obj_t
1205
1206/* \brief Checks whether a given bridge covers a given PCI bus.
1207 */
1208static __hwloc_inline int
1210 unsigned domain, unsigned bus)
1211{
1212 return bridge->type == HWLOC_OBJ_BRIDGE
1214 && bridge->attr->bridge.downstream.pci.domain == domain
1215 && bridge->attr->bridge.downstream.pci.secondary_bus <= bus
1216 && bridge->attr->bridge.downstream.pci.subordinate_bus >= bus;
1217}
1218
1223#ifdef __cplusplus
1224} /* extern "C" */
1225#endif
1226
1227
1228#endif /* HWLOC_HELPER_H */
hwloc_const_bitmap_t hwloc_const_cpuset_t
A non-modifiable hwloc_cpuset_t.
Definition hwloc.h:142
hwloc_const_bitmap_t hwloc_const_nodeset_t
A non-modifiable hwloc_nodeset_t.
Definition hwloc.h:160
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:157
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:140
enum hwloc_obj_cache_type_e hwloc_obj_cache_type_t
Cache type.
hwloc_obj_type_t
Type of topology object.
Definition hwloc.h:176
@ HWLOC_OBJ_BRIDGE_PCI
PCI-side of a bridge.
Definition hwloc.h:335
@ HWLOC_OBJ_CACHE_UNIFIED
Unified cache.
Definition hwloc.h:327
@ HWLOC_OBJ_MISC
Miscellaneous objects (filtered out by default). Objects without particular meaning,...
Definition hwloc.h:290
@ HWLOC_OBJ_OS_DEVICE
Operating system device (filtered out by default).
Definition hwloc.h:279
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition hwloc.h:269
@ HWLOC_OBJ_BRIDGE
Bridge (filtered out by default). Any bridge (or PCI switch) that connects the host or an I/O bus,...
Definition hwloc.h:257
@ HWLOC_OBJ_NUMANODE
NUMA node. An object that contains memory that is directly and byte-accessible to the host processors...
Definition hwloc.h:236
@ HWLOC_OBJ_PU
Processing Unit, or (Logical) Processor. An execution unit (may share a core with some other logical ...
Definition hwloc.h:201
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition hwloc.h:692
static hwloc_obj_t hwloc_get_root_obj(hwloc_topology_t topology)
Returns the top-object of the topology-tree.
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.
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 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.
int hwloc_get_type_depth(hwloc_topology_t topology, hwloc_obj_type_t type)
Returns the depth of objects of type type.
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.
@ HWLOC_TYPE_DEPTH_UNKNOWN
No object of given type exists in the topology.
Definition hwloc.h:822
@ HWLOC_TYPE_DEPTH_MULTIPLE
Objects of given type exist at different depth in the topology (only for Groups).
Definition hwloc.h:823
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:216
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:164
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.
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:244
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:42
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:85
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:185
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:130
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:109
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:275
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:297
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:348
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:321
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:456
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:440
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:400
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:380
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:412
int hwloc_obj_type_is_memory(hwloc_obj_type_t type)
Check whether an object type is Memory.
int hwloc_obj_type_is_cache(hwloc_obj_type_t type)
Check whether an object type is a CPU Cache (Data, Unified or Instruction).
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_obj_type_is_normal(hwloc_obj_type_t type)
Check whether an object type is Normal.
int hwloc_obj_type_is_icache(hwloc_obj_type_t type)
Check whether an object type is a CPU Instruction Cache,.
int hwloc_obj_type_is_io(hwloc_obj_type_t type)
Check whether an object type is I/O.
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:648
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:630
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:594
int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which)
Remove simultaneous multithreading PUs from a CPU set.
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.
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:705
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:766
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_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:726
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:798
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:891
hwloc_distrib_flags_e
Flags to be given to hwloc_distrib().
Definition helper.h:863
@ HWLOC_DISTRIB_FLAG_REVERSE
Distrib in reverse order, starting from the last objects.
Definition helper.h:867
hwloc_const_nodeset_t hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology)
Get allowed node set.
hwloc_const_nodeset_t hwloc_topology_get_topology_nodeset(hwloc_topology_t topology)
Get topology node set.
hwloc_const_cpuset_t hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology)
Get allowed CPU set.
hwloc_const_nodeset_t hwloc_topology_get_complete_nodeset(hwloc_topology_t topology)
Get complete node set.
hwloc_const_cpuset_t hwloc_topology_get_topology_cpuset(hwloc_topology_t topology)
Get topology CPU set.
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete 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:1071
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:1095
static int hwloc_bridge_covers_pcibus(hwloc_obj_t bridge, unsigned domain, unsigned bus)
Definition helper.h:1209
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:1172
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:1145
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:1191
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:1201
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:1154
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:1130
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).
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.
int hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id)
Add index id in bitmap bitmap.
int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id)
Test whether index id is part of bitmap bitmap.
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.
int hwloc_bitmap_isequal(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmap bitmap1 is equal to bitmap bitmap2.
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
struct hwloc_bitmap_s * hwloc_bitmap_t
Set of bits represented as an opaque pointer to an internal bitmap.
Definition bitmap.h:68
void hwloc_bitmap_zero(hwloc_bitmap_t bitmap)
Empty the bitmap bitmap.
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_bitmap_intersects(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmaps bitmap1 and bitmap2 intersects.
Structure of a topology object.
Definition hwloc.h:396
struct hwloc_obj ** children
Normal children, children[0 .. arity -1].
Definition hwloc.h:456
hwloc_nodeset_t nodeset
NUMA nodes covered by this object or containing this object.
Definition hwloc.h:540
int depth
Vertical index in the hierarchy.
Definition hwloc.h:419
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:505
char * subtype
Subtype string to better describe the type field.
Definition hwloc.h:399
unsigned os_index
OS-provided physical index number. It is not guaranteed unique across the entire machine,...
Definition hwloc.h:401
hwloc_cpuset_t cpuset
CPUs covered by this object.
Definition hwloc.h:512
struct hwloc_obj * next_sibling
Next object below the same parent (inside the same list of children).
Definition hwloc.h:448
struct hwloc_obj * next_cousin
Next object of same type and depth.
Definition hwloc.h:442
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:493
unsigned arity
Number of normal children. Memory, Misc and I/O children are not listed here but rather in their dedi...
Definition hwloc.h:452
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:475
struct hwloc_obj * prev_cousin
Previous object of same type and depth.
Definition hwloc.h:443
hwloc_obj_type_t type
Type of object.
Definition hwloc.h:398
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition hwloc.h:415
struct hwloc_obj * parent
Parent, NULL if root (Machine object)
Definition hwloc.h:446
struct hwloc_obj * first_child
First normal child.
Definition hwloc.h:457
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
struct hwloc_obj_attr_u::hwloc_bridge_attr_s bridge
struct hwloc_obj_attr_u::hwloc_cache_attr_s cache
unsigned depth
Depth of cache (e.g., L1, L2, ...etc.)
Definition hwloc.h:618
hwloc_obj_cache_type_t type
Cache type.
Definition hwloc.h:622
unsigned char dev
Definition hwloc.h:639
unsigned char func
Definition hwloc.h:639
unsigned short domain
Definition hwloc.h:635
unsigned char bus
Definition hwloc.h:639
union hwloc_obj_attr_u::hwloc_bridge_attr_s::@1 downstream
struct hwloc_pcidev_attr_s pci
Definition hwloc.h:648
hwloc_obj_bridge_type_t downstream_type
Definition hwloc.h:661