1
0
mirror of https://github.com/xmrig/xmrig.git synced 2026-01-19 21:43:01 -05:00

Update hwloc for MSVC builds.

This commit is contained in:
XMRig
2024-03-22 18:14:39 +07:00
parent 850b43c079
commit 7a85257ad4
42 changed files with 2554 additions and 1583 deletions

View File

@@ -1,6 +1,6 @@
/*
* Copyright © 2009 CNRS
* Copyright © 2009-2022 Inria. All rights reserved.
* Copyright © 2009-2023 Inria. All rights reserved.
* Copyright © 2009-2012, 2020 Université Bordeaux
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
* Copyright © 2022 IBM Corporation. All rights reserved.
@@ -146,21 +146,24 @@ report_insert_error_format_obj(char *buf, size_t buflen, hwloc_obj_t obj)
char typestr[64];
char *cpusetstr;
char *nodesetstr = NULL;
char indexstr[64] = "";
char groupstr[64] = "";
hwloc_obj_type_snprintf(typestr, sizeof(typestr), obj, 0);
hwloc_bitmap_asprintf(&cpusetstr, obj->cpuset);
if (obj->os_index != HWLOC_UNKNOWN_INDEX)
snprintf(indexstr, sizeof(indexstr), "P#%u ", obj->os_index);
if (obj->type == HWLOC_OBJ_GROUP)
snprintf(groupstr, sizeof(groupstr), "groupkind %u-%u ", obj->attr->group.kind, obj->attr->group.subkind);
if (obj->nodeset) /* may be missing during insert */
hwloc_bitmap_asprintf(&nodesetstr, obj->nodeset);
if (obj->os_index != HWLOC_UNKNOWN_INDEX)
snprintf(buf, buflen, "%s (P#%u cpuset %s%s%s)",
typestr, obj->os_index, cpusetstr,
nodesetstr ? " nodeset " : "",
nodesetstr ? nodesetstr : "");
else
snprintf(buf, buflen, "%s (cpuset %s%s%s)",
typestr, cpusetstr,
nodesetstr ? " nodeset " : "",
nodesetstr ? nodesetstr : "");
snprintf(buf, buflen, "%s (%s%s%s%s%scpuset %s%s%s)",
typestr,
indexstr,
obj->subtype ? "subtype " : "", obj->subtype ? obj->subtype : "", obj->subtype ? " " : "",
groupstr,
cpusetstr,
nodesetstr ? " nodeset " : "", nodesetstr ? nodesetstr : "");
free(cpusetstr);
free(nodesetstr);
}
@@ -178,8 +181,9 @@ static void report_insert_error(hwloc_obj_t new, hwloc_obj_t old, const char *ms
fprintf(stderr, "****************************************************************************\n");
fprintf(stderr, "* hwloc %s received invalid information from the operating system.\n", HWLOC_VERSION);
fprintf(stderr, "*\n");
fprintf(stderr, "* Failed with: %s\n", msg);
fprintf(stderr, "* while inserting %s at %s\n", newstr, oldstr);
fprintf(stderr, "* Failed with error: %s\n", msg);
fprintf(stderr, "* while inserting %s\n", newstr);
fprintf(stderr, "* at %s\n", oldstr);
fprintf(stderr, "* coming from: %s\n", reason);
fprintf(stderr, "*\n");
fprintf(stderr, "* The following FAQ entry in the hwloc documentation may help:\n");
@@ -679,7 +683,8 @@ unlink_and_free_object_and_children(hwloc_obj_t *pobj)
void
hwloc_free_object_and_children(hwloc_obj_t obj)
{
unlink_and_free_object_and_children(&obj);
if (obj)
unlink_and_free_object_and_children(&obj);
}
/* Free an object, its next siblings and their children without unlinking from parent.
@@ -1925,6 +1930,22 @@ hwloc_topology_alloc_group_object(struct hwloc_topology *topology)
return hwloc_alloc_setup_object(topology, HWLOC_OBJ_GROUP, HWLOC_UNKNOWN_INDEX);
}
int
hwloc_topology_free_group_object(struct hwloc_topology *topology, hwloc_obj_t obj)
{
if (!topology->is_loaded) {
/* this could actually work, see insert() below */
errno = EINVAL;
return -1;
}
if (topology->adopted_shmem_addr) {
errno = EPERM;
return -1;
}
hwloc_free_unlinked_object(obj);
return 0;
}
static void hwloc_propagate_symmetric_subtree(hwloc_topology_t topology, hwloc_obj_t root);
static void propagate_total_memory(hwloc_obj_t obj);
static void hwloc_set_group_depth(hwloc_topology_t topology);
@@ -1935,7 +1956,7 @@ static int hwloc_connect_special_levels(hwloc_topology_t topology);
hwloc_obj_t
hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t obj)
{
hwloc_obj_t res, root;
hwloc_obj_t res, root, child;
int cmp;
if (!topology->is_loaded) {
@@ -1945,6 +1966,7 @@ hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t
return NULL;
}
if (topology->adopted_shmem_addr) {
hwloc_free_unlinked_object(obj);
errno = EPERM;
return NULL;
}
@@ -1998,6 +2020,7 @@ hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t
res = hwloc__insert_object_by_cpuset(topology, NULL, obj, NULL /* do not show errors on stdout */);
} else {
/* just merge root */
hwloc_free_unlinked_object(obj);
res = root;
}
@@ -2024,6 +2047,13 @@ hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t
if (hwloc_topology_reconnect(topology, 0) < 0)
return NULL;
/* Compute group total_memory. */
res->total_memory = 0;
for_each_child(child, res)
res->total_memory += child->total_memory;
for_each_memory_child(child, res)
res->total_memory += child->total_memory;
hwloc_propagate_symmetric_subtree(topology, topology->levels[0][0]);
hwloc_set_group_depth(topology);
@@ -2254,11 +2284,13 @@ fixup_sets(hwloc_obj_t obj)
int
hwloc_obj_add_other_obj_sets(hwloc_obj_t dst, hwloc_obj_t src)
{
#define ADD_OTHER_OBJ_SET(_dst, _src, _set) \
if ((_src)->_set) { \
if (!(_dst)->_set) \
(_dst)->_set = hwloc_bitmap_alloc(); \
hwloc_bitmap_or((_dst)->_set, (_dst)->_set, (_src)->_set); \
#define ADD_OTHER_OBJ_SET(_dst, _src, _set) \
if ((_src)->_set) { \
if (!(_dst)->_set) \
(_dst)->_set = hwloc_bitmap_alloc(); \
if (!(_dst)->_set \
|| hwloc_bitmap_or((_dst)->_set, (_dst)->_set, (_src)->_set) < 0) \
return -1; \
}
ADD_OTHER_OBJ_SET(dst, src, cpuset);
ADD_OTHER_OBJ_SET(dst, src, complete_cpuset);
@@ -3730,6 +3762,7 @@ hwloc__topology_init (struct hwloc_topology **topologyp,
hwloc__topology_filter_init(topology);
/* always initialize since we don't know flags to disable those yet */
hwloc_internal_distances_init(topology);
hwloc_internal_memattrs_init(topology);
hwloc_internal_cpukinds_init(topology);
@@ -3942,8 +3975,12 @@ int
hwloc_topology_set_cache_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter)
{
unsigned i;
for(i=HWLOC_OBJ_L1CACHE; i<HWLOC_OBJ_L3ICACHE; i++)
hwloc_topology_set_type_filter(topology, (hwloc_obj_type_t) i, filter);
if (topology->is_loaded) {
errno = EBUSY;
return -1;
}
for(i=HWLOC_OBJ_L1CACHE; i<=HWLOC_OBJ_L3ICACHE; i++)
hwloc__topology_set_type_filter(topology, (hwloc_obj_type_t) i, filter);
return 0;
}
@@ -3951,17 +3988,25 @@ int
hwloc_topology_set_icache_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter)
{
unsigned i;
for(i=HWLOC_OBJ_L1ICACHE; i<HWLOC_OBJ_L3ICACHE; i++)
hwloc_topology_set_type_filter(topology, (hwloc_obj_type_t) i, filter);
if (topology->is_loaded) {
errno = EBUSY;
return -1;
}
for(i=HWLOC_OBJ_L1ICACHE; i<=HWLOC_OBJ_L3ICACHE; i++)
hwloc__topology_set_type_filter(topology, (hwloc_obj_type_t) i, filter);
return 0;
}
int
hwloc_topology_set_io_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter)
{
hwloc_topology_set_type_filter(topology, HWLOC_OBJ_BRIDGE, filter);
hwloc_topology_set_type_filter(topology, HWLOC_OBJ_PCI_DEVICE, filter);
hwloc_topology_set_type_filter(topology, HWLOC_OBJ_OS_DEVICE, filter);
if (topology->is_loaded) {
errno = EBUSY;
return -1;
}
hwloc__topology_set_type_filter(topology, HWLOC_OBJ_BRIDGE, filter);
hwloc__topology_set_type_filter(topology, HWLOC_OBJ_PCI_DEVICE, filter);
hwloc__topology_set_type_filter(topology, HWLOC_OBJ_OS_DEVICE, filter);
return 0;
}
@@ -3982,9 +4027,12 @@ hwloc_topology_clear (struct hwloc_topology *topology)
{
/* no need to set to NULL after free() since callers will call setup_defaults() or just destroy the rest of the topology */
unsigned l;
/* always destroy cpukinds/distances/memattrs since there are always initialized during init() */
hwloc_internal_cpukinds_destroy(topology);
hwloc_internal_distances_destroy(topology);
hwloc_internal_memattrs_destroy(topology);
hwloc_free_object_and_children(topology->levels[0][0]);
hwloc_bitmap_free(topology->allowed_cpuset);
hwloc_bitmap_free(topology->allowed_nodeset);
@@ -4024,6 +4072,7 @@ hwloc_topology_load (struct hwloc_topology *topology)
{
struct hwloc_disc_status dstatus;
const char *env;
unsigned i;
int err;
if (topology->is_loaded) {
@@ -4032,8 +4081,18 @@ hwloc_topology_load (struct hwloc_topology *topology)
}
/* initialize envvar-related things */
hwloc_internal_distances_prepare(topology);
hwloc_internal_memattrs_prepare(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_DISTANCES))
hwloc_internal_distances_prepare(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS))
hwloc_internal_memattrs_prepare(topology);
/* check if any cpu cache filter is not NONE */
topology->want_some_cpu_caches = 0;
for(i=HWLOC_OBJ_L1CACHE; i<=HWLOC_OBJ_L3ICACHE; i++)
if (topology->type_filter[i] != HWLOC_TYPE_FILTER_KEEP_NONE) {
topology->want_some_cpu_caches = 1;
break;
}
if (getenv("HWLOC_XML_USERDATA_NOT_DECODED"))
topology->userdata_not_decoded = 1;
@@ -4110,23 +4169,32 @@ hwloc_topology_load (struct hwloc_topology *topology)
#endif
hwloc_topology_check(topology);
/* Rank cpukinds */
hwloc_internal_cpukinds_rank(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_CPUKINDS)) {
/* Rank cpukinds */
hwloc_internal_cpukinds_rank(topology);
}
/* Mark distances objs arrays as invalid since we may have removed objects
* from the topology after adding the distances (remove_empty, etc).
* It would be hard to actually verify whether it's needed.
*/
hwloc_internal_distances_invalidate_cached_objs(topology);
/* And refresh distances so that multithreaded concurrent distances_get()
* don't refresh() concurrently (disallowed).
*/
hwloc_internal_distances_refresh(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_DISTANCES)) {
/* Mark distances objs arrays as invalid since we may have removed objects
* from the topology after adding the distances (remove_empty, etc).
* It would be hard to actually verify whether it's needed.
*/
hwloc_internal_distances_invalidate_cached_objs(topology);
/* And refresh distances so that multithreaded concurrent distances_get()
* don't refresh() concurrently (disallowed).
*/
hwloc_internal_distances_refresh(topology);
}
/* Same for memattrs */
hwloc_internal_memattrs_need_refresh(topology);
hwloc_internal_memattrs_refresh(topology);
hwloc_internal_memattrs_guess_memory_tiers(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS)) {
int force_memtiers = (getenv("HWLOC_MEMTIERS_REFRESH") != NULL);
/* Same for memattrs */
hwloc_internal_memattrs_need_refresh(topology);
hwloc_internal_memattrs_refresh(topology);
/* update memtiers unless XML */
if (force_memtiers || strcmp(topology->backends->component->name, "xml"))
hwloc_internal_memattrs_guess_memory_tiers(topology, force_memtiers);
}
topology->is_loaded = 1;
@@ -4185,20 +4253,11 @@ restrict_object_by_cpuset(hwloc_topology_t topology, unsigned long flags, hwloc_
hwloc_bitmap_andnot(obj->cpuset, obj->cpuset, droppedcpuset);
hwloc_bitmap_andnot(obj->complete_cpuset, obj->complete_cpuset, droppedcpuset);
modified = 1;
} else {
if ((flags & HWLOC_RESTRICT_FLAG_REMOVE_CPULESS)
&& hwloc_bitmap_iszero(obj->complete_cpuset)) {
/* we're empty, there's a NUMAnode below us, it'll be removed this time */
modified = 1;
}
/* nodeset cannot intersect unless cpuset intersects or is empty */
if (droppednodeset)
assert(!hwloc_bitmap_intersects(obj->complete_nodeset, droppednodeset)
|| hwloc_bitmap_iszero(obj->complete_cpuset));
}
if (droppednodeset) {
if (droppednodeset && hwloc_bitmap_intersects(obj->complete_nodeset, droppednodeset)) {
hwloc_bitmap_andnot(obj->nodeset, obj->nodeset, droppednodeset);
hwloc_bitmap_andnot(obj->complete_nodeset, obj->complete_nodeset, droppednodeset);
modified = 1;
}
if (modified) {
@@ -4251,20 +4310,11 @@ restrict_object_by_nodeset(hwloc_topology_t topology, unsigned long flags, hwloc
hwloc_bitmap_andnot(obj->nodeset, obj->nodeset, droppednodeset);
hwloc_bitmap_andnot(obj->complete_nodeset, obj->complete_nodeset, droppednodeset);
modified = 1;
} else {
if ((flags & HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS)
&& hwloc_bitmap_iszero(obj->complete_nodeset)) {
/* we're empty, there's a PU below us, it'll be removed this time */
modified = 1;
}
/* cpuset cannot intersect unless nodeset intersects or is empty */
if (droppedcpuset)
assert(!hwloc_bitmap_intersects(obj->complete_cpuset, droppedcpuset)
|| hwloc_bitmap_iszero(obj->complete_nodeset));
}
if (droppedcpuset) {
if (droppedcpuset && hwloc_bitmap_intersects(obj->complete_cpuset, droppedcpuset)) {
hwloc_bitmap_andnot(obj->cpuset, obj->cpuset, droppedcpuset);
hwloc_bitmap_andnot(obj->complete_cpuset, obj->complete_cpuset, droppedcpuset);
modified = 1;
}
if (modified) {
@@ -4433,13 +4483,18 @@ hwloc_topology_restrict(struct hwloc_topology *topology, hwloc_const_bitmap_t se
if (hwloc_filter_levels_keep_structure(topology) < 0) /* takes care of reconnecting internally */
goto out;
/* some objects may have disappeared, we need to update distances objs arrays */
hwloc_internal_distances_invalidate_cached_objs(topology);
hwloc_internal_memattrs_need_refresh(topology);
/* some objects may have disappeared and sets were modified,
* we need to update distances, etc */
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_DISTANCES))
hwloc_internal_distances_invalidate_cached_objs(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS))
hwloc_internal_memattrs_need_refresh(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_CPUKINDS))
hwloc_internal_cpukinds_restrict(topology);
hwloc_propagate_symmetric_subtree(topology, topology->levels[0][0]);
propagate_total_memory(topology->levels[0][0]);
hwloc_internal_cpukinds_restrict(topology);
#ifndef HWLOC_DEBUG
if (getenv("HWLOC_DEBUG_CHECK"))
@@ -4527,9 +4582,12 @@ hwloc_topology_allow(struct hwloc_topology *topology,
int
hwloc_topology_refresh(struct hwloc_topology *topology)
{
hwloc_internal_cpukinds_rank(topology);
hwloc_internal_distances_refresh(topology);
hwloc_internal_memattrs_refresh(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_CPUKINDS))
hwloc_internal_cpukinds_rank(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_DISTANCES))
hwloc_internal_distances_refresh(topology);
if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS))
hwloc_internal_memattrs_refresh(topology);
return 0;
}
@@ -5081,6 +5139,9 @@ hwloc_topology_check(struct hwloc_topology *topology)
for(i=HWLOC_OBJ_TYPE_MIN; i<HWLOC_OBJ_TYPE_MAX; i++)
assert(obj_type_order[obj_order_type[i]] == i);
if (!topology->is_loaded)
return;
depth = hwloc_topology_get_depth(topology);
assert(!topology->modified);