00001
00002
00003
00004
00005
00010 #ifndef HWLOC_DISTANCES_H
00011 #define HWLOC_DISTANCES_H
00012
00013 #ifndef HWLOC_H
00014 #error Please include the main hwloc.h instead
00015 #endif
00016
00017
00018 #ifdef __cplusplus
00019 extern "C" {
00020 #elif 0
00021 }
00022 #endif
00023
00024
00041 struct hwloc_distances_s {
00042 unsigned nbobjs;
00043 hwloc_obj_t *objs;
00048 unsigned long kind;
00049 hwloc_uint64_t *values;
00054 };
00055
00067 enum hwloc_distances_kind_e {
00071 HWLOC_DISTANCES_KIND_FROM_OS = (1UL<<0),
00075 HWLOC_DISTANCES_KIND_FROM_USER = (1UL<<1),
00076
00083 HWLOC_DISTANCES_KIND_MEANS_LATENCY = (1UL<<2),
00090 HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH = (1UL<<3)
00091 };
00092
00116 HWLOC_DECLSPEC int
00117 hwloc_distances_get(hwloc_topology_t topology,
00118 unsigned *nr, struct hwloc_distances_s **distances,
00119 unsigned long kind, unsigned long flags);
00120
00125 HWLOC_DECLSPEC int
00126 hwloc_distances_get_by_depth(hwloc_topology_t topology, int depth,
00127 unsigned *nr, struct hwloc_distances_s **distances,
00128 unsigned long kind, unsigned long flags);
00129
00134 static __hwloc_inline int
00135 hwloc_distances_get_by_type(hwloc_topology_t topology, hwloc_obj_type_t type,
00136 unsigned *nr, struct hwloc_distances_s **distances,
00137 unsigned long kind, unsigned long flags)
00138 {
00139 int depth = hwloc_get_type_depth(topology, type);
00140 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) {
00141 *nr = 0;
00142 return 0;
00143 }
00144 return hwloc_distances_get_by_depth(topology, depth, nr, distances, kind, flags);
00145 }
00146
00148 HWLOC_DECLSPEC void
00149 hwloc_distances_release(hwloc_topology_t topology, struct hwloc_distances_s *distances);
00150
00163 static __hwloc_inline int
00164 hwloc_distances_obj_index(struct hwloc_distances_s *distances, hwloc_obj_t obj)
00165 {
00166 unsigned i;
00167 for(i=0; i<distances->nbobjs; i++)
00168 if (distances->objs[i] == obj)
00169 return (int)i;
00170 return -1;
00171 }
00172
00180 static __hwloc_inline int
00181 hwloc_distances_obj_pair_values(struct hwloc_distances_s *distances,
00182 hwloc_obj_t obj1, hwloc_obj_t obj2,
00183 hwloc_uint64_t *value1to2, hwloc_uint64_t *value2to1)
00184 {
00185 int i1 = hwloc_distances_obj_index(distances, obj1);
00186 int i2 = hwloc_distances_obj_index(distances, obj2);
00187 if (i1 < 0 || i2 < 0)
00188 return -1;
00189 *value1to2 = distances->values[i1 * distances->nbobjs + i2];
00190 *value2to1 = distances->values[i2 * distances->nbobjs + i1];
00191 return 0;
00192 }
00193
00203 enum hwloc_distances_add_flag_e {
00207 HWLOC_DISTANCES_ADD_FLAG_GROUP = (1UL<<0),
00213 HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE = (1UL<<1)
00214 };
00215
00230 HWLOC_DECLSPEC int hwloc_distances_add(hwloc_topology_t topology,
00231 unsigned nbobjs, hwloc_obj_t *objs, hwloc_uint64_t *values,
00232 unsigned long kind, unsigned long flags);
00233
00242 HWLOC_DECLSPEC int hwloc_distances_remove(hwloc_topology_t topology);
00243
00248 HWLOC_DECLSPEC int hwloc_distances_remove_by_depth(hwloc_topology_t topology, int depth);
00249
00254 static __hwloc_inline int
00255 hwloc_distances_remove_by_type(hwloc_topology_t topology, hwloc_obj_type_t type)
00256 {
00257 int depth = hwloc_get_type_depth(topology, type);
00258 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
00259 return 0;
00260 return hwloc_distances_remove_by_depth(topology, depth);
00261 }
00262
00266 #ifdef __cplusplus
00267 }
00268 #endif
00269
00270
00271 #endif