Hardware Locality (hwloc) 2.4.1rc3

helper.h
1 /*
2 * Copyright © 2009 CNRS
3 * Copyright © 2009-2020 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
41 static __hwloc_inline hwloc_obj_t
42 hwloc_get_first_largest_obj_inside_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set)
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
69 HWLOC_DECLSPEC int hwloc_get_largest_objs_inside_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set,
70 hwloc_obj_t * __hwloc_restrict objs, int max);
71
84 static __hwloc_inline hwloc_obj_t
85 hwloc_get_next_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
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
108 static __hwloc_inline hwloc_obj_t
109 hwloc_get_next_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set,
110 hwloc_obj_type_t type, hwloc_obj_t prev)
111 {
112 int depth = hwloc_get_type_depth(topology, type);
113 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
114 return NULL;
115 return hwloc_get_next_obj_inside_cpuset_by_depth(topology, set, depth, prev);
116 }
117
126 static __hwloc_inline hwloc_obj_t
127 hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
128 int depth, unsigned idx) __hwloc_attribute_pure;
129 static __hwloc_inline hwloc_obj_t
130 hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
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
160 static __hwloc_inline hwloc_obj_t
161 hwloc_get_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set,
162 hwloc_obj_type_t type, unsigned idx) __hwloc_attribute_pure;
163 static __hwloc_inline hwloc_obj_t
164 hwloc_get_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set,
165 hwloc_obj_type_t type, unsigned idx)
166 {
167 int depth = hwloc_get_type_depth(topology, type);
168 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
169 return NULL;
170 return hwloc_get_obj_inside_cpuset_by_depth(topology, set, depth, idx);
171 }
172
181 static __hwloc_inline unsigned
182 hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
183 int depth) __hwloc_attribute_pure;
184 static __hwloc_inline unsigned
185 hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
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) {
193 if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set))
194 count++;
195 obj = obj->next_cousin;
196 }
197 return count;
198 }
199
212 static __hwloc_inline int
213 hwloc_get_nbobjs_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set,
214 hwloc_obj_type_t type) __hwloc_attribute_pure;
215 static __hwloc_inline int
216 hwloc_get_nbobjs_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set,
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
240 static __hwloc_inline int
241 hwloc_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;
243 static __hwloc_inline int
244 hwloc_get_obj_index_inside_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
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)
252 if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set))
253 idx++;
254 return idx;
255 }
256
271 static __hwloc_inline hwloc_obj_t
272 hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
273 hwloc_obj_t parent) __hwloc_attribute_pure;
274 static __hwloc_inline hwloc_obj_t
275 hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set,
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
294 static __hwloc_inline hwloc_obj_t
295 hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
296 static __hwloc_inline hwloc_obj_t
297 hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set)
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
320 static __hwloc_inline hwloc_obj_t
321 hwloc_get_next_obj_covering_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set,
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
347 static __hwloc_inline hwloc_obj_t
348 hwloc_get_next_obj_covering_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set,
349 hwloc_obj_type_t type, hwloc_obj_t prev)
350 {
351 int depth = hwloc_get_type_depth(topology, type);
352 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
353 return NULL;
354 return hwloc_get_next_obj_covering_cpuset_by_depth(topology, set, depth, prev);
355 }
356
377 static __hwloc_inline hwloc_obj_t
378 hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj) __hwloc_attribute_pure;
379 static __hwloc_inline hwloc_obj_t
380 hwloc_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
397 static __hwloc_inline hwloc_obj_t
398 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;
399 static __hwloc_inline hwloc_obj_t
400 hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj)
401 {
402 hwloc_obj_t ancestor = obj->parent;
403 while (ancestor && ancestor->type != type)
404 ancestor = ancestor->parent;
405 return ancestor;
406 }
407
409 static __hwloc_inline hwloc_obj_t
410 hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2) __hwloc_attribute_pure;
411 static __hwloc_inline hwloc_obj_t
412 hwloc_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
437 static __hwloc_inline int
438 hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root) __hwloc_attribute_pure;
439 static __hwloc_inline int
440 hwloc_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
455 static __hwloc_inline hwloc_obj_t
456 hwloc_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) {
472 obj = parent->memory_first_child;
473 state = 1;
474 }
475 if (!obj && state == 1) {
476 obj = parent->io_first_child;
477 state = 2;
478 }
479 if (!obj && state == 2) {
480 obj = parent->misc_first_child;
481 state = 3;
482 }
483 return obj;
484 }
485
512 HWLOC_DECLSPEC int
513 hwloc_obj_type_is_normal(hwloc_obj_type_t type);
514
523 HWLOC_DECLSPEC int
524 hwloc_obj_type_is_io(hwloc_obj_type_t type);
525
534 HWLOC_DECLSPEC int
535 hwloc_obj_type_is_memory(hwloc_obj_type_t type);
536
543 HWLOC_DECLSPEC int
544 hwloc_obj_type_is_cache(hwloc_obj_type_t type);
545
552 HWLOC_DECLSPEC int
553 hwloc_obj_type_is_dcache(hwloc_obj_type_t type);
554
561 HWLOC_DECLSPEC int
562 hwloc_obj_type_is_icache(hwloc_obj_type_t type);
563
593 static __hwloc_inline int
594 hwloc_get_cache_type_depth (hwloc_topology_t topology,
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 */
609 return HWLOC_TYPE_DEPTH_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
627 static __hwloc_inline hwloc_obj_t
628 hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure;
629 static __hwloc_inline hwloc_obj_t
630 hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set)
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
645 static __hwloc_inline hwloc_obj_t
646 hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj) __hwloc_attribute_pure;
647 static __hwloc_inline hwloc_obj_t
648 hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj)
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
691 HWLOC_DECLSPEC int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which);
692
702 static __hwloc_inline hwloc_obj_t
703 hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
704 static __hwloc_inline hwloc_obj_t
705 hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index)
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
723 static __hwloc_inline hwloc_obj_t
724 hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure;
725 static __hwloc_inline hwloc_obj_t
726 hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index)
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? */
747 HWLOC_DECLSPEC unsigned hwloc_get_closest_objs (hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t * __hwloc_restrict objs, unsigned max);
748
761 static __hwloc_inline hwloc_obj_t
762 hwloc_get_obj_below_by_type (hwloc_topology_t topology,
763 hwloc_obj_type_t type1, unsigned idx1,
764 hwloc_obj_type_t type2, unsigned idx2) __hwloc_attribute_pure;
765 static __hwloc_inline hwloc_obj_t
766 hwloc_get_obj_below_by_type (hwloc_topology_t topology,
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
795 static __hwloc_inline hwloc_obj_t
796 hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv) __hwloc_attribute_pure;
797 static __hwloc_inline hwloc_obj_t
798 hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv)
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
820 enum hwloc_distrib_flags_e {
824 HWLOC_DISTRIB_FLAG_REVERSE = (1UL<<0)
825 };
826
850 static __hwloc_inline int
851 hwloc_distrib(hwloc_topology_t topology,
852 hwloc_obj_t *roots, unsigned n_roots,
853 hwloc_cpuset_t *set,
854 unsigned n,
855 int until, unsigned long flags)
856 {
857 unsigned i;
858 unsigned tot_weight;
859 unsigned given, givenweight;
860 hwloc_cpuset_t *cpusetp = set;
861
862 if (flags & ~HWLOC_DISTRIB_FLAG_REVERSE) {
863 errno = EINVAL;
864 return -1;
865 }
866
867 tot_weight = 0;
868 for (i = 0; i < n_roots; i++)
869 tot_weight += (unsigned) hwloc_bitmap_weight(roots[i]->cpuset);
870
871 for (i = 0, given = 0, givenweight = 0; i < n_roots; i++) {
872 unsigned chunk, weight;
873 hwloc_obj_t root = roots[flags & HWLOC_DISTRIB_FLAG_REVERSE ? n_roots-1-i : i];
874 hwloc_cpuset_t cpuset = root->cpuset;
875 while (!hwloc_obj_type_is_normal(root->type))
876 /* If memory/io/misc, walk up to normal parent */
877 root = root->parent;
878 weight = (unsigned) hwloc_bitmap_weight(cpuset);
879 if (!weight)
880 continue;
881 /* Give to root a chunk proportional to its weight.
882 * If previous chunks got rounded-up, we may get a bit less. */
883 chunk = (( (givenweight+weight) * n + tot_weight-1) / tot_weight)
884 - (( givenweight * n + tot_weight-1) / tot_weight);
885 if (!root->arity || chunk <= 1 || root->depth >= until) {
886 /* We can't split any more, put everything there. */
887 if (chunk) {
888 /* Fill cpusets with ours */
889 unsigned j;
890 for (j=0; j < chunk; j++)
891 cpusetp[j] = hwloc_bitmap_dup(cpuset);
892 } else {
893 /* We got no chunk, just merge our cpuset to a previous one
894 * (the first chunk cannot be empty)
895 * so that this root doesn't get ignored.
896 */
897 assert(given);
898 hwloc_bitmap_or(cpusetp[-1], cpusetp[-1], cpuset);
899 }
900 } else {
901 /* Still more to distribute, recurse into children */
902 hwloc_distrib(topology, root->children, root->arity, cpusetp, chunk, until, flags);
903 }
904 cpusetp += chunk;
905 given += chunk;
906 givenweight += weight;
907 }
908
909 return 0;
910 }
911
929 HWLOC_DECLSPEC hwloc_const_cpuset_t
930 hwloc_topology_get_complete_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
931
943 HWLOC_DECLSPEC hwloc_const_cpuset_t
944 hwloc_topology_get_topology_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
945
962 HWLOC_DECLSPEC hwloc_const_cpuset_t
963 hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure;
964
974 HWLOC_DECLSPEC hwloc_const_nodeset_t
975 hwloc_topology_get_complete_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
976
988 HWLOC_DECLSPEC hwloc_const_nodeset_t
989 hwloc_topology_get_topology_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
990
1007 HWLOC_DECLSPEC hwloc_const_nodeset_t
1008 hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure;
1009
1030 static __hwloc_inline int
1031 hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset)
1032 {
1033 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
1034 hwloc_obj_t obj = NULL;
1035 assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN);
1036 hwloc_bitmap_zero(nodeset);
1037 while ((obj = hwloc_get_next_obj_covering_cpuset_by_depth(topology, _cpuset, depth, obj)) != NULL)
1038 if (hwloc_bitmap_set(nodeset, obj->os_index) < 0)
1039 return -1;
1040 return 0;
1041 }
1042
1054 static __hwloc_inline int
1055 hwloc_cpuset_from_nodeset(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset)
1056 {
1057 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
1058 hwloc_obj_t obj = NULL;
1059 assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN);
1060 hwloc_bitmap_zero(_cpuset);
1061 while ((obj = hwloc_get_next_obj_by_depth(topology, depth, obj)) != NULL) {
1062 if (hwloc_bitmap_isset(nodeset, obj->os_index))
1063 /* no need to check obj->cpuset because objects in levels always have a cpuset */
1064 if (hwloc_bitmap_or(_cpuset, _cpuset, obj->cpuset) < 0)
1065 return -1;
1066 }
1067 return 0;
1068 }
1069
1089 static __hwloc_inline hwloc_obj_t
1090 hwloc_get_non_io_ancestor_obj(hwloc_topology_t topology __hwloc_attribute_unused,
1091 hwloc_obj_t ioobj)
1092 {
1093 hwloc_obj_t obj = ioobj;
1094 while (obj && !obj->cpuset) {
1095 obj = obj->parent;
1096 }
1097 return obj;
1098 }
1099
1104 static __hwloc_inline hwloc_obj_t
1105 hwloc_get_next_pcidev(hwloc_topology_t topology, hwloc_obj_t prev)
1106 {
1107 return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PCI_DEVICE, prev);
1108 }
1109
1113 static __hwloc_inline hwloc_obj_t
1114 hwloc_get_pcidev_by_busid(hwloc_topology_t topology,
1115 unsigned domain, unsigned bus, unsigned dev, unsigned func)
1116 {
1117 hwloc_obj_t obj = NULL;
1118 while ((obj = hwloc_get_next_pcidev(topology, obj)) != NULL) {
1119 if (obj->attr->pcidev.domain == domain
1120 && obj->attr->pcidev.bus == bus
1121 && obj->attr->pcidev.dev == dev
1122 && obj->attr->pcidev.func == func)
1123 return obj;
1124 }
1125 return NULL;
1126 }
1127
1131 static __hwloc_inline hwloc_obj_t
1132 hwloc_get_pcidev_by_busidstring(hwloc_topology_t topology, const char *busid)
1133 {
1134 unsigned domain = 0; /* default */
1135 unsigned bus, dev, func;
1136
1137 if (sscanf(busid, "%x:%x.%x", &bus, &dev, &func) != 3
1138 && sscanf(busid, "%x:%x:%x.%x", &domain, &bus, &dev, &func) != 4) {
1139 errno = EINVAL;
1140 return NULL;
1141 }
1142
1143 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, func);
1144 }
1145
1150 static __hwloc_inline hwloc_obj_t
1151 hwloc_get_next_osdev(hwloc_topology_t topology, hwloc_obj_t prev)
1152 {
1153 return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_OS_DEVICE, prev);
1154 }
1155
1160 static __hwloc_inline hwloc_obj_t
1161 hwloc_get_next_bridge(hwloc_topology_t topology, hwloc_obj_t prev)
1162 {
1163 return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_BRIDGE, prev);
1164 }
1165
1166 /* \brief Checks whether a given bridge covers a given PCI bus.
1167 */
1168 static __hwloc_inline int
1169 hwloc_bridge_covers_pcibus(hwloc_obj_t bridge,
1170 unsigned domain, unsigned bus)
1171 {
1172 return bridge->type == HWLOC_OBJ_BRIDGE
1173 && bridge->attr->bridge.downstream_type == HWLOC_OBJ_BRIDGE_PCI
1174 && bridge->attr->bridge.downstream.pci.domain == domain
1175 && bridge->attr->bridge.downstream.pci.secondary_bus <= bus
1176 && bridge->attr->bridge.downstream.pci.subordinate_bus >= bus;
1177 }
1178
1183 #ifdef __cplusplus
1184 } /* extern "C" */
1185 #endif
1186
1187
1188 #endif /* HWLOC_HELPER_H */
hwloc_const_cpuset_t
hwloc_const_bitmap_t hwloc_const_cpuset_t
A non-modifiable hwloc_cpuset_t.
Definition: hwloc.h:142
hwloc_const_nodeset_t
hwloc_const_bitmap_t hwloc_const_nodeset_t
A non-modifiable hwloc_nodeset_t.
Definition: hwloc.h:160
hwloc_nodeset_t
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_cpuset_t
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
hwloc_obj_cache_type_t
enum hwloc_obj_cache_type_e hwloc_obj_cache_type_t
Cache type.
hwloc_obj_type_t
hwloc_obj_type_t
Type of topology object.
Definition: hwloc.h:176
HWLOC_OBJ_BRIDGE_PCI
@ HWLOC_OBJ_BRIDGE_PCI
PCI-side of a bridge.
Definition: hwloc.h:335
HWLOC_OBJ_CACHE_UNIFIED
@ HWLOC_OBJ_CACHE_UNIFIED
Unified cache.
Definition: hwloc.h:327
HWLOC_OBJ_MISC
@ HWLOC_OBJ_MISC
Miscellaneous objects (filtered out by default). Objects without particular meaning,...
Definition: hwloc.h:290
HWLOC_OBJ_OS_DEVICE
@ HWLOC_OBJ_OS_DEVICE
Operating system device (filtered out by default).
Definition: hwloc.h:279
HWLOC_OBJ_PCI_DEVICE
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition: hwloc.h:269
HWLOC_OBJ_BRIDGE
@ 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
@ 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
@ HWLOC_OBJ_PU
Processing Unit, or (Logical) Processor. An execution unit (may share a core with some other logical ...
Definition: hwloc.h:201
hwloc_topology_t
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition: hwloc.h:691
hwloc_get_root_obj
static hwloc_obj_t hwloc_get_root_obj(hwloc_topology_t topology)
Returns the top-object of the topology-tree.
hwloc_get_obj_by_depth
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.
hwloc_get_obj_by_type
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.
hwloc_get_next_obj_by_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.
hwloc_get_type_depth
int hwloc_get_type_depth(hwloc_topology_t topology, hwloc_obj_type_t type)
Returns the depth of objects of type type.
hwloc_get_next_obj_by_depth
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
@ HWLOC_TYPE_DEPTH_UNKNOWN
No object of given type exists in the topology.
Definition: hwloc.h:821
HWLOC_TYPE_DEPTH_MULTIPLE
@ HWLOC_TYPE_DEPTH_MULTIPLE
Objects of given type exist at different depth in the topology (only for Groups).
Definition: hwloc.h:822
hwloc_get_nbobjs_inside_cpuset_by_type
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
hwloc_get_obj_inside_cpuset_by_type
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
hwloc_get_largest_objs_inside_cpuset
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.
hwloc_get_obj_index_inside_cpuset
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
hwloc_get_first_largest_obj_inside_cpuset
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
hwloc_get_next_obj_inside_cpuset_by_depth
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
hwloc_get_nbobjs_inside_cpuset_by_depth
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
hwloc_get_obj_inside_cpuset_by_depth
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
hwloc_get_next_obj_inside_cpuset_by_type
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
hwloc_get_child_covering_cpuset
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
hwloc_get_obj_covering_cpuset
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
hwloc_get_next_obj_covering_cpuset_by_type
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
hwloc_get_next_obj_covering_cpuset_by_depth
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
hwloc_get_next_child
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
hwloc_obj_is_in_subtree
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
hwloc_get_ancestor_obj_by_type
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
hwloc_get_ancestor_obj_by_depth
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
hwloc_get_common_ancestor_obj
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
hwloc_obj_type_is_memory
int hwloc_obj_type_is_memory(hwloc_obj_type_t type)
Check whether an object type is Memory.
hwloc_obj_type_is_cache
int hwloc_obj_type_is_cache(hwloc_obj_type_t type)
Check whether an object type is a CPU Cache (Data, Unified or Instruction).
hwloc_obj_type_is_dcache
int hwloc_obj_type_is_dcache(hwloc_obj_type_t type)
Check whether an object type is a CPU Data or Unified Cache.
hwloc_obj_type_is_normal
int hwloc_obj_type_is_normal(hwloc_obj_type_t type)
Check whether an object type is Normal.
hwloc_obj_type_is_icache
int hwloc_obj_type_is_icache(hwloc_obj_type_t type)
Check whether an object type is a CPU Instruction Cache,.
hwloc_obj_type_is_io
int hwloc_obj_type_is_io(hwloc_obj_type_t type)
Check whether an object type is I/O.
hwloc_get_shared_cache_covering_obj
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
hwloc_get_cache_covering_cpuset
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
hwloc_get_cache_type_depth
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
hwloc_bitmap_singlify_per_core
int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which)
Remove simultaneous multithreading PUs from a CPU set.
hwloc_get_closest_objs
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.
hwloc_get_pu_obj_by_os_index
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
hwloc_get_obj_below_by_type
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_get_numanode_obj_by_os_index
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
hwloc_get_obj_below_array_by_type
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
hwloc_distrib
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:851
hwloc_distrib_flags_e
hwloc_distrib_flags_e
Flags to be given to hwloc_distrib().
Definition: helper.h:820
HWLOC_DISTRIB_FLAG_REVERSE
@ HWLOC_DISTRIB_FLAG_REVERSE
Distrib in reverse order, starting from the last objects.
Definition: helper.h:824
hwloc_topology_get_allowed_nodeset
hwloc_const_nodeset_t hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology)
Get allowed node set.
hwloc_topology_get_topology_nodeset
hwloc_const_nodeset_t hwloc_topology_get_topology_nodeset(hwloc_topology_t topology)
Get topology node set.
hwloc_topology_get_allowed_cpuset
hwloc_const_cpuset_t hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology)
Get allowed CPU set.
hwloc_topology_get_complete_nodeset
hwloc_const_nodeset_t hwloc_topology_get_complete_nodeset(hwloc_topology_t topology)
Get complete node set.
hwloc_topology_get_topology_cpuset
hwloc_const_cpuset_t hwloc_topology_get_topology_cpuset(hwloc_topology_t topology)
Get topology CPU set.
hwloc_topology_get_complete_cpuset
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
hwloc_cpuset_to_nodeset
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:1031
hwloc_cpuset_from_nodeset
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:1055
hwloc_bridge_covers_pcibus
static int hwloc_bridge_covers_pcibus(hwloc_obj_t bridge, unsigned domain, unsigned bus)
Definition: helper.h:1169
hwloc_get_pcidev_by_busidstring
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:1132
hwloc_get_next_pcidev
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:1105
hwloc_get_next_osdev
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:1151
hwloc_get_next_bridge
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:1161
hwloc_get_pcidev_by_busid
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:1114
hwloc_get_non_io_ancestor_obj
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:1090
hwloc_bitmap_weight
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_bitmap_isincluded
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.
hwloc_bitmap_set
int hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id)
Add index id in bitmap bitmap.
hwloc_bitmap_isset
int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id)
Test whether index id is part of bitmap bitmap.
hwloc_bitmap_or
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.
hwloc_bitmap_isequal
int hwloc_bitmap_isequal(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmap bitmap1 is equal to bitmap bitmap2.
hwloc_bitmap_iszero
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
hwloc_bitmap_t
struct hwloc_bitmap_s * hwloc_bitmap_t
Set of bits represented as an opaque pointer to an internal bitmap.
Definition: bitmap.h:68
hwloc_bitmap_zero
void hwloc_bitmap_zero(hwloc_bitmap_t bitmap)
Empty the bitmap bitmap.
hwloc_bitmap_dup
hwloc_bitmap_t hwloc_bitmap_dup(hwloc_const_bitmap_t bitmap)
Duplicate bitmap bitmap by allocating a new bitmap and copying bitmap contents.
hwloc_bitmap_intersects
int hwloc_bitmap_intersects(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2)
Test whether bitmaps bitmap1 and bitmap2 intersects.
hwloc_obj
Structure of a topology object.
Definition: hwloc.h:395
hwloc_obj::children
struct hwloc_obj ** children
Normal children, children[0 .. arity -1].
Definition: hwloc.h:455
hwloc_obj::nodeset
hwloc_nodeset_t nodeset
NUMA nodes covered by this object or containing this object.
Definition: hwloc.h:539
hwloc_obj::depth
int depth
Vertical index in the hierarchy.
Definition: hwloc.h:418
hwloc_obj::misc_first_child
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:504
hwloc_obj::os_index
unsigned os_index
OS-provided physical index number. It is not guaranteed unique across the entire machine,...
Definition: hwloc.h:400
hwloc_obj::cpuset
hwloc_cpuset_t cpuset
CPUs covered by this object.
Definition: hwloc.h:511
hwloc_obj::next_sibling
struct hwloc_obj * next_sibling
Next object below the same parent (inside the same list of children).
Definition: hwloc.h:447
hwloc_obj::next_cousin
struct hwloc_obj * next_cousin
Next object of same type and depth.
Definition: hwloc.h:441
hwloc_obj::io_first_child
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:492
hwloc_obj::arity
unsigned arity
Number of normal children. Memory, Misc and I/O children are not listed here but rather in their dedi...
Definition: hwloc.h:451
hwloc_obj::memory_first_child
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:474
hwloc_obj::prev_cousin
struct hwloc_obj * prev_cousin
Previous object of same type and depth.
Definition: hwloc.h:442
hwloc_obj::type
hwloc_obj_type_t type
Type of object.
Definition: hwloc.h:397
hwloc_obj::attr
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition: hwloc.h:414
hwloc_obj::parent
struct hwloc_obj * parent
Parent, NULL if root (Machine object)
Definition: hwloc.h:445
hwloc_obj::first_child
struct hwloc_obj * first_child
First normal child.
Definition: hwloc.h:456
hwloc_obj_attr_u::pcidev
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
hwloc_obj_attr_u::bridge
struct hwloc_obj_attr_u::hwloc_bridge_attr_s bridge
hwloc_obj_attr_u::cache
struct hwloc_obj_attr_u::hwloc_cache_attr_s cache
hwloc_obj_attr_u::hwloc_cache_attr_s::depth
unsigned depth
Depth of cache (e.g., L1, L2, ...etc.)
Definition: hwloc.h:617
hwloc_obj_attr_u::hwloc_cache_attr_s::type
hwloc_obj_cache_type_t type
Cache type.
Definition: hwloc.h:621
hwloc_obj_attr_u::hwloc_pcidev_attr_s::dev
unsigned char dev
Definition: hwloc.h:638
hwloc_obj_attr_u::hwloc_pcidev_attr_s::func
unsigned char func
Definition: hwloc.h:638
hwloc_obj_attr_u::hwloc_pcidev_attr_s::domain
unsigned short domain
Definition: hwloc.h:634
hwloc_obj_attr_u::hwloc_pcidev_attr_s::bus
unsigned char bus
Definition: hwloc.h:638
hwloc_obj_attr_u::hwloc_bridge_attr_s::downstream
union hwloc_obj_attr_u::hwloc_bridge_attr_s::@1 downstream
hwloc_obj_attr_u::hwloc_bridge_attr_s::pci
struct hwloc_pcidev_attr_s pci
Definition: hwloc.h:647
hwloc_obj_attr_u::hwloc_bridge_attr_s::downstream_type
hwloc_obj_bridge_type_t downstream_type
Definition: hwloc.h:660