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); }
void chpl_topo_setMemLocality(void* p, size_t size, chpl_bool onlyInside, c_sublocid_t subloc) { size_t pgSize; unsigned char* pPgLo; size_t nPages; _DBG_P("chpl_topo_setMemLocality(%p, %#zx, onlyIn=%s, %d)\n", p, size, (onlyInside ? "T" : "F"), (int) subloc); if (!haveTopology) { return; } alignAddrSize(p, size, onlyInside, &pgSize, &pPgLo, &nPages); _DBG_P(" localize %p, %#zx bytes (%#zx pages)\n", pPgLo, nPages * pgSize, nPages); if (nPages == 0) return; chpl_topo_setMemLocalityByPages(pPgLo, nPages * pgSize, getNumaObj(subloc)); }
void chpl_topo_setMemSubchunkLocality(void* p, size_t size, chpl_bool onlyInside, size_t* subchunkSizes) { size_t pgSize; unsigned char* pPgLo; size_t nPages; int i; size_t pg; size_t pgNext; _DBG_P("chpl_topo_setMemSubchunkLocality(%p, %#zx, onlyIn=%s)\n", p, size, (onlyInside ? "T" : "F")); if (!haveTopology) { return; } alignAddrSize(p, size, onlyInside, &pgSize, &pPgLo, &nPages); _DBG_P(" localize %p, %#zx bytes (%#zx pages)\n", pPgLo, nPages * pgSize, nPages); if (nPages == 0) return; for (i = 0, pg = 0; i < numNumaDomains; i++, pg = pgNext) { if (i == numNumaDomains - 1) pgNext = nPages; else pgNext = 1 + (nPages * (i + 1) - 1) / numNumaDomains; chpl_topo_setMemLocalityByPages(pPgLo + pg * pgSize, (pgNext - pg) * pgSize, getNumaObj(i)); if (subchunkSizes != NULL) { subchunkSizes[i] = (pgNext - pg) * pgSize; } } }