1 /*
2 * Copyright © 2020 Inria. All rights reserved.
3 * See COPYING in top-level directory.
4 */
5
6 #include "hwloc.h"
7
8 #include <assert.h>
9
10 /* check cpuset_from/to_nodeset */
11
main(void)12 int main(void)
13 {
14 hwloc_topology_t topology;
15 hwloc_bitmap_t cpuset, nodeset;
16 int err;
17
18 err = hwloc_topology_init(&topology);
19 assert(!err);
20 err = hwloc_topology_set_synthetic(topology, "pack:2 [numa] l3:2 [numa] pu:2");
21 assert(!err);
22 err = hwloc_topology_load(topology);
23 assert(!err);
24
25 cpuset = hwloc_bitmap_alloc();
26 assert(cpuset);
27 nodeset = hwloc_bitmap_alloc();
28 assert(nodeset);
29
30 /* check empty sets */
31 hwloc_bitmap_zero(cpuset);
32 hwloc_bitmap_zero(nodeset);
33 err = hwloc_cpuset_to_nodeset(topology, cpuset, nodeset);
34 assert(!err);
35 assert(hwloc_bitmap_iszero(cpuset));
36 assert(hwloc_bitmap_iszero(nodeset));
37 err = hwloc_cpuset_from_nodeset(topology, cpuset, nodeset);
38 assert(!err);
39 assert(hwloc_bitmap_iszero(cpuset));
40 assert(hwloc_bitmap_iszero(nodeset));
41
42 /* check full topology sets */
43 hwloc_bitmap_zero(nodeset);
44 err = hwloc_cpuset_to_nodeset(topology, hwloc_topology_get_topology_cpuset(topology), nodeset);
45 assert(!err);
46 assert(hwloc_bitmap_isequal(nodeset, hwloc_topology_get_topology_nodeset(topology)));
47
48 hwloc_bitmap_zero(cpuset);
49 err = hwloc_cpuset_from_nodeset(topology, cpuset, hwloc_topology_get_topology_nodeset(topology));
50 assert(!err);
51 assert(hwloc_bitmap_isequal(cpuset, hwloc_topology_get_topology_cpuset(topology)));
52
53 /* one PU per L3 in single package */
54 hwloc_bitmap_zero(cpuset);
55 hwloc_bitmap_set_range(cpuset, 1, 2);
56 hwloc_bitmap_zero(nodeset);
57 err = hwloc_cpuset_to_nodeset(topology, cpuset, nodeset);
58 assert(!err);
59 assert(hwloc_bitmap_weight(nodeset) == 3);
60 assert(hwloc_bitmap_isset(nodeset, 0));
61 assert(hwloc_bitmap_isset(nodeset, 1));
62 assert(hwloc_bitmap_isset(nodeset, 2));
63
64 /* 1 large node + 1 of its small node */
65 hwloc_bitmap_zero(nodeset);
66 hwloc_bitmap_set(nodeset, 3);
67 hwloc_bitmap_set(nodeset, 5);
68 hwloc_bitmap_zero(cpuset);
69 err = hwloc_cpuset_from_nodeset(topology, cpuset, nodeset);
70 assert(!err);
71 assert(hwloc_bitmap_weight(cpuset) == 4);
72 assert(hwloc_bitmap_isset(cpuset, 4));
73 assert(hwloc_bitmap_isset(cpuset, 5));
74 assert(hwloc_bitmap_isset(cpuset, 6));
75 assert(hwloc_bitmap_isset(cpuset, 7));
76
77 /* remove PUs from last (small) node */
78 err = hwloc_bitmap_copy(cpuset, hwloc_topology_get_topology_cpuset(topology));
79 assert(!err);
80 err = hwloc_bitmap_clr_range(cpuset, 6, 7);
81 assert(!err);
82 hwloc_topology_restrict(topology, cpuset, 0);
83 assert(!err);
84 /* remove first node and first large node, PU 0-1 are not covered by a node anymore */
85 err = hwloc_bitmap_copy(nodeset, hwloc_topology_get_topology_nodeset(topology));
86 assert(!err);
87 err = hwloc_bitmap_clr(nodeset, 0); /* first small node */
88 err = hwloc_bitmap_clr(nodeset, 2); /* first large node */
89 assert(!err);
90 hwloc_topology_restrict(topology, nodeset, HWLOC_RESTRICT_FLAG_BYNODESET);
91 assert(!err);
92
93 /* check empty sets */
94 hwloc_bitmap_zero(cpuset);
95 hwloc_bitmap_zero(nodeset);
96 err = hwloc_cpuset_to_nodeset(topology, cpuset, nodeset);
97 assert(!err);
98 assert(hwloc_bitmap_iszero(cpuset));
99 assert(hwloc_bitmap_iszero(nodeset));
100 err = hwloc_cpuset_from_nodeset(topology, cpuset, nodeset);
101 assert(!err);
102 assert(hwloc_bitmap_iszero(cpuset));
103 assert(hwloc_bitmap_iszero(nodeset));
104
105 /* check full topology sets */
106 hwloc_bitmap_zero(nodeset);
107 err = hwloc_cpuset_to_nodeset(topology, hwloc_topology_get_topology_cpuset(topology), nodeset);
108 assert(!err);
109 assert(hwloc_bitmap_weight(nodeset) == 3);
110 /* node P#0 doesn't exist anymore */
111 assert(hwloc_bitmap_isset(nodeset, 1));
112 /* node P#2 doesn't exist anymore */
113 assert(hwloc_bitmap_isset(nodeset, 3));
114 /* node P#4 has no PUs */
115 assert(hwloc_bitmap_isset(nodeset, 5));
116
117 hwloc_bitmap_zero(cpuset);
118 err = hwloc_cpuset_from_nodeset(topology, cpuset, hwloc_topology_get_topology_nodeset(topology));
119 assert(!err);
120 assert(hwloc_bitmap_weight(cpuset) == 4);
121 /* PU P#0-1 not covered anymore */
122 assert(hwloc_bitmap_isset(cpuset, 2));
123 assert(hwloc_bitmap_isset(cpuset, 3));
124 assert(hwloc_bitmap_isset(cpuset, 4));
125 assert(hwloc_bitmap_isset(cpuset, 5));
126 /* PU P#6-7 don't exist anymore */
127
128 hwloc_bitmap_free(cpuset);
129 hwloc_bitmap_free(nodeset);
130
131 hwloc_topology_destroy(topology);
132 return 0;
133 }
134