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