/* * Set the node where the current process will run */ void hw_set_first_core_node(int node, int proc) { hwloc_nodeset_t nset; hwloc_cpuset_t set,newset; if (local_topo->nnodes != 0 ){ nset = hwloc_bitmap_alloc(); set = hwloc_bitmap_alloc(); newset = hwloc_bitmap_alloc(); hwloc_bitmap_zero(set); hwloc_bitmap_zero(newset); hwloc_bitmap_zero(nset); hwloc_bitmap_set(nset,node); hwloc_cpuset_from_nodeset(topology,set,nset); int core = hwloc_bitmap_first(set); hwloc_bitmap_set(newset,core); if (proc) hwloc_set_proc_cpubind (topology,0,newset,HWLOC_CPUBIND_PROCESS); else hwloc_set_proc_cpubind (topology,0,newset,HWLOC_CPUBIND_THREAD); hwloc_bitmap_free(newset); hwloc_bitmap_free(set); hwloc_bitmap_free(nset); } }
void chpl_topo_setThreadLocality(c_sublocid_t subloc) { hwloc_cpuset_t cpuset; int flags; _DBG_P("chpl_topo_setThreadLocality(%d)\n", (int) subloc); if (!haveTopology) { return; } if (!topoSupport->cpubind->set_thread_cpubind) return; if ((cpuset = hwloc_bitmap_alloc()) == NULL) { report_error("hwloc_bitmap_alloc()", errno); } hwloc_cpuset_from_nodeset(topology, cpuset, getNumaObj(subloc)->allowed_nodeset); flags = HWLOC_CPUBIND_THREAD | HWLOC_CPUBIND_STRICT; if (hwloc_set_cpubind(topology, cpuset, flags)) { report_error("hwloc_set_cpubind()", errno); } hwloc_bitmap_free(cpuset); }
int hwloc_get_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_cpuset_t set, hwloc_membind_policy_t * policy, int flags) { hwloc_nodeset_t nodeset; int ret; nodeset = hwloc_bitmap_alloc(); ret = hwloc_get_area_membind_nodeset(topology, addr, len, nodeset, policy, flags); if (!ret) hwloc_cpuset_from_nodeset(topology, set, nodeset); hwloc_bitmap_free(nodeset); return ret; }
int hwloc_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, hwloc_membind_policy_t * policy, int flags) { hwloc_nodeset_t nodeset; int ret; nodeset = hwloc_bitmap_alloc(); ret = hwloc_get_proc_membind_nodeset(topology, pid, nodeset, policy, flags); if (!ret) hwloc_cpuset_from_nodeset(topology, set, nodeset); hwloc_bitmap_free(nodeset); return ret; }
/* * Set the node where the current thread will run */ void hw_set_thread_node(int node) { hwloc_nodeset_t nset; hwloc_cpuset_t set; if (local_topo->nnodes != 0 ){ nset = hwloc_bitmap_alloc(); set = hwloc_bitmap_alloc(); hwloc_bitmap_zero(nset); hwloc_bitmap_set(nset,node); hwloc_cpuset_from_nodeset(topology,set,nset); hwloc_set_proc_cpubind (topology,0,set,HWLOC_CPUBIND_THREAD); hwloc_bitmap_free(set); hwloc_bitmap_free(nset); } }
static int hwloc_win_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { int ret; hwloc_cpuset_t cpuset; if ((policy != HWLOC_MEMBIND_DEFAULT && policy != HWLOC_MEMBIND_BIND) || flags & HWLOC_MEMBIND_NOCPUBIND) { errno = ENOSYS; return -1; } cpuset = hwloc_bitmap_alloc(); hwloc_cpuset_from_nodeset(topology, cpuset, nodeset); ret = hwloc_win_set_proc_cpubind(topology, pid, cpuset, flags & HWLOC_MEMBIND_STRICT?HWLOC_CPUBIND_STRICT:0); hwloc_bitmap_free(cpuset); return ret; }