/* * Copyright © 2011-2017 Inria. All rights reserved. * Copyright © 2011 Université Bordeaux. All rights reserved. * See COPYING in top-level directory. */ #include #include #include #include #include hwloc_topology_t topology; const struct hwloc_topology_support *support; static int checkprocincluded; /* check that a bound process execs on a non-empty cpuset included in the binding */ static int check(hwloc_const_cpuset_t set, int flags) { hwloc_cpuset_t last; int ret; printf(" binding\n"); ret = hwloc_set_cpubind(topology, set, flags); if (ret) return 0; printf(" getting cpu location\n"); last = hwloc_bitmap_alloc(); ret = hwloc_get_last_cpu_location(topology, last, flags); assert(!ret); assert(!hwloc_bitmap_iszero(last)); if (flags == HWLOC_CPUBIND_THREAD || checkprocincluded) { printf(" checking inclusion\n"); assert(hwloc_bitmap_isincluded(last, set)); } hwloc_bitmap_free(last); return 0; } static int checkall(hwloc_const_cpuset_t set) { if (support->cpubind->get_thisthread_last_cpu_location) { printf(" with HWLOC_CPUBIND_THREAD...\n"); check(set, HWLOC_CPUBIND_THREAD); } if (support->cpubind->get_thisproc_last_cpu_location) { printf(" with HWLOC_CPUBIND_PROCESS...\n"); check(set, HWLOC_CPUBIND_PROCESS); } if (support->cpubind->get_thisthread_last_cpu_location || support->cpubind->get_thisproc_last_cpu_location) { printf(" with flags 0...\n"); check(set, 0); } return 0; } int main(void) { unsigned depth; hwloc_obj_t obj; checkprocincluded = (NULL == getenv("HWLOC_TEST_DONTCHECK_PROC_CPULOCATION")); hwloc_topology_init(&topology); hwloc_topology_load(topology); support = hwloc_topology_get_support(topology); /* check at top level */ printf("testing at top level\n"); obj = hwloc_get_root_obj(topology); checkall(obj->cpuset); depth = hwloc_topology_get_depth(topology); /* check at intermediate level if it exists */ if (depth >= 3) { printf("testing at depth %d\n", (depth-1)/2); obj = NULL; while ((obj = hwloc_get_next_obj_by_depth(topology, (depth-1)/2, obj)) != NULL) checkall(obj->cpuset); } /* check at bottom level */ printf("testing at bottom level\n"); obj = NULL; while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PU, obj)) != NULL) checkall(obj->cpuset); hwloc_topology_destroy(topology); return 0; }