00001
00002
00003
00004
00005
00006
00014 #ifndef HWLOC_H
00015 #define HWLOC_H
00016
00017 #include <hwloc/config.h>
00018 #include <sys/types.h>
00019 #include <stdio.h>
00020 #include <limits.h>
00021 #ifdef HWLOC_HAVE_STDINT_H
00022 #include <stdint.h>
00023 #endif
00024
00025
00026
00027
00028 #include <hwloc/rename.h>
00029
00030
00031
00032
00033
00034 #include <hwloc/cpuset.h>
00035
00036
00037 #ifdef __cplusplus
00038 extern "C" {
00039 #endif
00040
00041
00047 #define HWLOC_API_VERSION 0x00010000
00048
00057 struct hwloc_topology;
00062 typedef struct hwloc_topology * hwloc_topology_t;
00063
00078 typedef enum {
00079 HWLOC_OBJ_SYSTEM,
00084 HWLOC_OBJ_MACHINE,
00089 HWLOC_OBJ_NODE,
00093 HWLOC_OBJ_SOCKET,
00097 HWLOC_OBJ_CACHE,
00100 HWLOC_OBJ_CORE,
00104 HWLOC_OBJ_PU,
00113 HWLOC_OBJ_GROUP,
00125 HWLOC_OBJ_MISC
00129 } hwloc_obj_type_t;
00130
00148 int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2) ;
00149
00150 enum hwloc_compare_types_e {
00151 HWLOC_TYPE_UNORDERED = INT_MAX
00152 };
00153
00162 union hwloc_obj_attr_u;
00163
00165 struct hwloc_obj_memory_s {
00166 uint64_t total_memory;
00167 uint64_t local_memory;
00169 unsigned page_types_len;
00175 struct hwloc_obj_memory_page_type_s {
00176 uint64_t size;
00177 uint64_t count;
00178 } * page_types;
00179 };
00180
00185 struct hwloc_obj {
00186
00187 hwloc_obj_type_t type;
00188 unsigned os_index;
00189 char *name;
00192 struct hwloc_obj_memory_s memory;
00193
00195 union hwloc_obj_attr_u *attr;
00196
00197
00198 unsigned depth;
00199 unsigned logical_index;
00201 signed os_level;
00203 struct hwloc_obj *next_cousin;
00204 struct hwloc_obj *prev_cousin;
00206
00207 struct hwloc_obj *parent;
00208 unsigned sibling_rank;
00209 struct hwloc_obj *next_sibling;
00210 struct hwloc_obj *prev_sibling;
00212
00213 unsigned arity;
00214 struct hwloc_obj **children;
00215 struct hwloc_obj *first_child;
00216 struct hwloc_obj *last_child;
00218
00219 void *userdata;
00221
00222 hwloc_cpuset_t cpuset;
00235 hwloc_cpuset_t complete_cpuset;
00246 hwloc_cpuset_t online_cpuset;
00254 hwloc_cpuset_t allowed_cpuset;
00265 hwloc_cpuset_t nodeset;
00277 hwloc_cpuset_t complete_nodeset;
00288 hwloc_cpuset_t allowed_nodeset;
00297 };
00301 typedef struct hwloc_obj * hwloc_obj_t;
00302
00304 union hwloc_obj_attr_u {
00306 struct hwloc_cache_attr_s {
00307 uint64_t size;
00308 unsigned depth;
00309 } cache;
00311 struct hwloc_machine_attr_s {
00312 char *dmi_board_vendor;
00313 char *dmi_board_name;
00314 } machine;
00316 struct hwloc_group_attr_s {
00317 unsigned depth;
00318 } group;
00319 };
00320
00335 int hwloc_topology_init (hwloc_topology_t *topologyp);
00336
00349 int hwloc_topology_load(hwloc_topology_t topology);
00350
00355 void hwloc_topology_destroy (hwloc_topology_t topology);
00356
00361 void hwloc_topology_check(hwloc_topology_t topology);
00362
00395 int hwloc_topology_ignore_type(hwloc_topology_t topology, hwloc_obj_type_t type);
00396
00403 int hwloc_topology_ignore_type_keep_structure(hwloc_topology_t topology, hwloc_obj_type_t type);
00404
00410 int hwloc_topology_ignore_all_keep_structure(hwloc_topology_t topology);
00411
00416 enum hwloc_topology_flags_e {
00417 HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM = (1<<0),
00426 HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM = (1<<1)
00445 };
00446
00451 int hwloc_topology_set_flags (hwloc_topology_t topology, unsigned long flags);
00452
00466 int hwloc_topology_set_fsroot(hwloc_topology_t restrict topology, const char * restrict fsroot_path);
00467
00481 int hwloc_topology_set_pid(hwloc_topology_t restrict topology, hwloc_pid_t pid);
00482
00496 int hwloc_topology_set_synthetic(hwloc_topology_t restrict topology, const char * restrict description);
00497
00509 int hwloc_topology_set_xml(hwloc_topology_t restrict topology, const char * restrict xmlpath);
00510
00512 struct hwloc_topology_discovery_support {
00514 unsigned char pu;
00515 };
00516
00518 struct hwloc_topology_cpubind_support {
00520 unsigned char set_thisproc_cpubind;
00522 unsigned char get_thisproc_cpubind;
00524 unsigned char set_proc_cpubind;
00526 unsigned char get_proc_cpubind;
00528 unsigned char set_thisthread_cpubind;
00530 unsigned char get_thisthread_cpubind;
00532 unsigned char set_thread_cpubind;
00534 unsigned char get_thread_cpubind;
00535 };
00536
00543 struct hwloc_topology_support {
00544 struct hwloc_topology_discovery_support *discovery;
00545 struct hwloc_topology_cpubind_support *cpubind;
00546 };
00547
00549 const struct hwloc_topology_support *hwloc_topology_get_support(hwloc_topology_t restrict topology);
00550
00563 void hwloc_topology_export_xml(hwloc_topology_t topology, const char *xmlpath);
00564
00574 hwloc_obj_t hwloc_topology_insert_misc_object_by_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset, const char *name);
00575
00585 hwloc_obj_t hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name);
00586
00599 unsigned hwloc_topology_get_depth(hwloc_topology_t restrict topology) ;
00600
00610 int hwloc_get_type_depth (hwloc_topology_t topology, hwloc_obj_type_t type);
00611
00612 enum hwloc_get_type_depth_e {
00613 HWLOC_TYPE_DEPTH_UNKNOWN = -1,
00614 HWLOC_TYPE_DEPTH_MULTIPLE = -2
00615 };
00616
00621 hwloc_obj_type_t hwloc_get_depth_type (hwloc_topology_t topology, unsigned depth) ;
00622
00624 unsigned hwloc_get_nbobjs_by_depth (hwloc_topology_t topology, unsigned depth) ;
00625
00631 static inline int
00632 hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type)
00633 {
00634 int depth = hwloc_get_type_depth(topology, type);
00635 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
00636 return 0;
00637 if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
00638 return -1;
00639 return hwloc_get_nbobjs_by_depth(topology, depth);
00640 }
00641
00649 int hwloc_topology_is_thissystem(hwloc_topology_t restrict topology) ;
00650
00660 hwloc_obj_t hwloc_get_obj_by_depth (hwloc_topology_t topology, unsigned depth, unsigned idx) ;
00661
00668 static inline hwloc_obj_t
00669 hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx)
00670 {
00671 int depth = hwloc_get_type_depth(topology, type);
00672 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
00673 return NULL;
00674 if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
00675 return NULL;
00676 return hwloc_get_obj_by_depth(topology, depth, idx);
00677 }
00678
00688 const char * hwloc_obj_type_string (hwloc_obj_type_t type) ;
00689
00694 hwloc_obj_type_t hwloc_obj_type_of_string (const char * string) ;
00695
00704 int hwloc_obj_type_snprintf(char * restrict string, size_t size, hwloc_obj_t obj,
00705 int verbose);
00706
00716 int hwloc_obj_attr_snprintf(char * restrict string, size_t size, hwloc_obj_t obj, const char * restrict separator,
00717 int verbose);
00718
00737 int hwloc_obj_snprintf(char * restrict string, size_t size,
00738 hwloc_topology_t topology, hwloc_obj_t obj,
00739 const char * restrict indexprefix, int verbose);
00740
00744 int hwloc_obj_cpuset_snprintf(char * restrict str, size_t size, size_t nobj, const hwloc_obj_t * restrict objs);
00745
00791 typedef enum {
00792 HWLOC_CPUBIND_PROCESS = (1<<0),
00795 HWLOC_CPUBIND_THREAD = (1<<1),
00797 HWLOC_CPUBIND_STRICT = (1<<2)
00825 } hwloc_cpubind_policy_t;
00826
00832 int hwloc_set_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t set,
00833 int policy);
00834
00837 int hwloc_get_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int policy);
00838
00846 int hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int policy);
00847
00855 int hwloc_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int policy);
00856
00857 #ifdef hwloc_thread_t
00858
00865 int hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_cpuset_t set, int policy);
00866 #endif
00867
00868 #ifdef hwloc_thread_t
00869
00876 int hwloc_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int policy);
00877 #endif
00878
00882 #ifdef __cplusplus
00883 }
00884 #endif
00885
00886
00887
00888 #include <hwloc/helper.h>
00889
00890
00891 #endif