1
1

Merge pull request #7356 from hppritcha/topic/pr7201_to_v40x

Topic/pr7201 to v40x
Этот коммит содержится в:
Geoff Paulsen 2020-02-12 14:06:31 -06:00 коммит произвёл GitHub
родитель 3894e5760c f136804c45
Коммит a1259e6a14
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23

Просмотреть файл

@ -19,7 +19,9 @@
* Copyright (C) 2018 Mellanox Technologies, Ltd. * Copyright (C) 2018 Mellanox Technologies, Ltd.
* All rights reserved. * All rights reserved.
* Copyright (c) 2018 Amazon.com, Inc. or its affiliates. All Rights reserved. * Copyright (c) 2018 Amazon.com, Inc. or its affiliates. All Rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved. * Copyright (c) 2019 IBM Corporation. All rights reserved.
* Copyright (c) 2019-2020 Inria. All rights reserved.
* Copyright (c) 2020 Triad National Security, LLC. All rights reserved.
* $COPYRIGHT$ * $COPYRIGHT$
* *
* Additional copyrights may follow * Additional copyrights may follow
@ -58,6 +60,7 @@
#include "opal/mca/hwloc/hwloc-internal.h" #include "opal/mca/hwloc/hwloc-internal.h"
#include "opal/mca/hwloc/base/base.h" #include "opal/mca/hwloc/base/base.h"
#include "opal/util/printf.h"
static bool topo_in_shmem = false; static bool topo_in_shmem = false;
@ -1215,16 +1218,84 @@ int opal_hwloc_base_cpu_list_parse(const char *slot_str,
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
static void opal_hwloc_base_get_relative_locality_by_depth(hwloc_topology_t topo, unsigned d,
hwloc_cpuset_t loc1, hwloc_cpuset_t loc2,
opal_hwloc_locality_t *locality, bool *shared)
{
unsigned width, w;
hwloc_obj_t obj;
int sect1, sect2;
/* get the width of the topology at this depth */
width = hwloc_get_nbobjs_by_depth(topo, d);
/* scan all objects at this depth to see if
* our locations overlap with them
*/
for (w=0; w < width; w++) {
/* get the object at this depth/index */
obj = hwloc_get_obj_by_depth(topo, d, w);
/* see if our locations intersect with the cpuset for this obj */
sect1 = hwloc_bitmap_intersects(obj->cpuset, loc1);
sect2 = hwloc_bitmap_intersects(obj->cpuset, loc2);
/* if both intersect, then we share this level */
if (sect1 && sect2) {
*shared = true;
switch(obj->type) {
case HWLOC_OBJ_NODE:
*locality |= OPAL_PROC_ON_NUMA;
break;
case HWLOC_OBJ_SOCKET:
*locality |= OPAL_PROC_ON_SOCKET;
break;
#if HWLOC_API_VERSION < 0x20000
case HWLOC_OBJ_CACHE:
if (3 == obj->attr->cache.depth) {
*locality |= OPAL_PROC_ON_L3CACHE;
} else if (2 == obj->attr->cache.depth) {
*locality |= OPAL_PROC_ON_L2CACHE;
} else {
*locality |= OPAL_PROC_ON_L1CACHE;
}
break;
#else
case HWLOC_OBJ_L3CACHE:
*locality |= OPAL_PROC_ON_L3CACHE;
break;
case HWLOC_OBJ_L2CACHE:
*locality |= OPAL_PROC_ON_L2CACHE;
break;
case HWLOC_OBJ_L1CACHE:
*locality |= OPAL_PROC_ON_L1CACHE;
break;
#endif
case HWLOC_OBJ_CORE:
*locality |= OPAL_PROC_ON_CORE;
break;
case HWLOC_OBJ_PU:
*locality |= OPAL_PROC_ON_HWTHREAD;
break;
default:
/* just ignore it */
break;
}
break;
}
/* otherwise, we don't share this
* object - but we still might share another object
* on this level, so we have to keep searching
*/
}
}
opal_hwloc_locality_t opal_hwloc_base_get_relative_locality(hwloc_topology_t topo, opal_hwloc_locality_t opal_hwloc_base_get_relative_locality(hwloc_topology_t topo,
char *cpuset1, char *cpuset2) char *cpuset1, char *cpuset2)
{ {
opal_hwloc_locality_t locality; opal_hwloc_locality_t locality;
hwloc_obj_t obj; hwloc_cpuset_t loc1, loc2;
unsigned depth, d, width, w; unsigned depth, d;
bool shared; bool shared;
hwloc_obj_type_t type; hwloc_obj_type_t type;
int sect1, sect2;
hwloc_cpuset_t loc1, loc2;
/* start with what we know - they share a node on a cluster /* start with what we know - they share a node on a cluster
* NOTE: we may alter that latter part as hwloc's ability to * NOTE: we may alter that latter part as hwloc's ability to
@ -1265,66 +1336,8 @@ opal_hwloc_locality_t opal_hwloc_base_get_relative_locality(hwloc_topology_t top
HWLOC_OBJ_PU != type) { HWLOC_OBJ_PU != type) {
continue; continue;
} }
/* get the width of the topology at this depth */ opal_hwloc_base_get_relative_locality_by_depth(topo, d, loc1, loc2, &locality, &shared);
width = hwloc_get_nbobjs_by_depth(topo, d);
/* scan all objects at this depth to see if
* our locations overlap with them
*/
for (w=0; w < width; w++) {
/* get the object at this depth/index */
obj = hwloc_get_obj_by_depth(topo, d, w);
/* see if our locations intersect with the cpuset for this obj */
sect1 = hwloc_bitmap_intersects(obj->cpuset, loc1);
sect2 = hwloc_bitmap_intersects(obj->cpuset, loc2);
/* if both intersect, then we share this level */
if (sect1 && sect2) {
shared = true;
switch(obj->type) {
case HWLOC_OBJ_NODE:
locality |= OPAL_PROC_ON_NUMA;
break;
case HWLOC_OBJ_SOCKET:
locality |= OPAL_PROC_ON_SOCKET;
break;
#if HWLOC_API_VERSION < 0x20000
case HWLOC_OBJ_CACHE:
if (3 == obj->attr->cache.depth) {
locality |= OPAL_PROC_ON_L3CACHE;
} else if (2 == obj->attr->cache.depth) {
locality |= OPAL_PROC_ON_L2CACHE;
} else {
locality |= OPAL_PROC_ON_L1CACHE;
}
break;
#else
case HWLOC_OBJ_L3CACHE:
locality |= OPAL_PROC_ON_L3CACHE;
break;
case HWLOC_OBJ_L2CACHE:
locality |= OPAL_PROC_ON_L2CACHE;
break;
case HWLOC_OBJ_L1CACHE:
locality |= OPAL_PROC_ON_L1CACHE;
break;
#endif
case HWLOC_OBJ_CORE:
locality |= OPAL_PROC_ON_CORE;
break;
case HWLOC_OBJ_PU:
locality |= OPAL_PROC_ON_HWTHREAD;
break;
default:
/* just ignore it */
break;
}
break;
}
/* otherwise, we don't share this
* object - but we still might share another object
* on this level, so we have to keep searching
*/
}
/* if we spanned the entire width without finding /* if we spanned the entire width without finding
* a point of intersection, then no need to go * a point of intersection, then no need to go
* deeper * deeper
@ -1333,6 +1346,9 @@ opal_hwloc_locality_t opal_hwloc_base_get_relative_locality(hwloc_topology_t top
break; break;
} }
} }
#if HWLOC_API_VERSION >= 0x20000
opal_hwloc_base_get_relative_locality_by_depth(topo, HWLOC_TYPE_DEPTH_NUMANODE, loc1, loc2, &locality, &shared);
#endif
opal_output_verbose(5, opal_hwloc_base_framework.framework_output, opal_output_verbose(5, opal_hwloc_base_framework.framework_output,
"locality: %s", "locality: %s",
@ -1349,9 +1365,10 @@ opal_hwloc_locality_t opal_hwloc_base_get_relative_locality(hwloc_topology_t top
*/ */
char* opal_hwloc_base_find_coprocessors(hwloc_topology_t topo) char* opal_hwloc_base_find_coprocessors(hwloc_topology_t topo)
{ {
#if HAVE_DECL_HWLOC_OBJ_OSDEV_COPROC
hwloc_obj_t osdev; hwloc_obj_t osdev;
unsigned i;
char **cps = NULL; char **cps = NULL;
#endif
char *cpstring = NULL; char *cpstring = NULL;
int depth; int depth;
@ -1369,6 +1386,7 @@ char* opal_hwloc_base_find_coprocessors(hwloc_topology_t topo)
while (NULL != osdev) { while (NULL != osdev) {
if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type) { if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type) {
/* got one! find and save its serial number */ /* got one! find and save its serial number */
unsigned i;
for (i=0; i < osdev->infos_count; i++) { for (i=0; i < osdev->infos_count; i++) {
if (0 == strncmp(osdev->infos[i].name, "MICSerialNumber", strlen("MICSerialNumber"))) { if (0 == strncmp(osdev->infos[i].name, "MICSerialNumber", strlen("MICSerialNumber"))) {
OPAL_OUTPUT_VERBOSE((5, opal_hwloc_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((5, opal_hwloc_base_framework.framework_output,
@ -2063,12 +2081,40 @@ char* opal_hwloc_base_get_topo_signature(hwloc_topology_t topo)
return sig; return sig;
} }
static int opal_hwloc_base_get_locality_string_by_depth(hwloc_topology_t topo,
int d,
hwloc_cpuset_t cpuset,
hwloc_cpuset_t result)
{
hwloc_obj_t obj;
unsigned width, w;
/* get the width of the topology at this depth */
width = hwloc_get_nbobjs_by_depth(topo, d);
if (0 == width) {
return -1;
}
/* scan all objects at this depth to see if
* the location overlaps with them
*/
for (w=0; w < width; w++) {
/* get the object at this depth/index */
obj = hwloc_get_obj_by_depth(topo, d, w);
/* see if the location intersects with it */
if (hwloc_bitmap_intersects(obj->cpuset, cpuset)) {
hwloc_bitmap_set(result, w);
}
}
return 0;
}
char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo, char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo,
char *bitmap) char *bitmap)
{ {
hwloc_obj_t obj;
char *locality=NULL, *tmp, *t2; char *locality=NULL, *tmp, *t2;
unsigned depth, d, width, w; unsigned depth, d;
hwloc_cpuset_t cpuset, result; hwloc_cpuset_t cpuset, result;
hwloc_obj_type_t type; hwloc_obj_type_t type;
@ -2111,28 +2157,15 @@ char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo,
continue; continue;
} }
/* get the width of the topology at this depth */ if (opal_hwloc_base_get_locality_string_by_depth(topo, d, cpuset, result) < 0) {
width = hwloc_get_nbobjs_by_depth(topo, d);
if (0 == width) {
continue; continue;
} }
/* scan all objects at this depth to see if
* the location overlaps with them
*/
for (w=0; w < width; w++) {
/* get the object at this depth/index */
obj = hwloc_get_obj_by_depth(topo, d, w);
/* see if the location intersects with it */
if (hwloc_bitmap_intersects(obj->cpuset, cpuset)) {
hwloc_bitmap_set(result, w);
}
}
/* it should be impossible, but allow for the possibility /* it should be impossible, but allow for the possibility
* that we came up empty at this depth */ * that we came up empty at this depth */
if (!hwloc_bitmap_iszero(result)) { if (!hwloc_bitmap_iszero(result)) {
hwloc_bitmap_list_asprintf(&tmp, result); hwloc_bitmap_list_asprintf(&tmp, result);
switch(obj->type) { switch(type) {
case HWLOC_OBJ_NODE: case HWLOC_OBJ_NODE:
asprintf(&t2, "%sNM%s:", (NULL == locality) ? "" : locality, tmp); asprintf(&t2, "%sNM%s:", (NULL == locality) ? "" : locality, tmp);
if (NULL != locality) { if (NULL != locality) {
@ -2148,15 +2181,16 @@ char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo,
locality = t2; locality = t2;
break; break;
#if HWLOC_API_VERSION < 0x20000 #if HWLOC_API_VERSION < 0x20000
case HWLOC_OBJ_CACHE: case HWLOC_OBJ_CACHE: {
if (3 == obj->attr->cache.depth) { unsigned cachedepth = hwloc_get_obj_by_depth(topo, d, 0)->attr->cache.depth;
if (3 == cachedepth) {
asprintf(&t2, "%sL3%s:", (NULL == locality) ? "" : locality, tmp); asprintf(&t2, "%sL3%s:", (NULL == locality) ? "" : locality, tmp);
if (NULL != locality) { if (NULL != locality) {
free(locality); free(locality);
} }
locality = t2; locality = t2;
break; break;
} else if (2 == obj->attr->cache.depth) { } else if (2 == cachedepth) {
asprintf(&t2, "%sL2%s:", (NULL == locality) ? "" : locality, tmp); asprintf(&t2, "%sL2%s:", (NULL == locality) ? "" : locality, tmp);
if (NULL != locality) { if (NULL != locality) {
free(locality); free(locality);
@ -2172,6 +2206,7 @@ char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo,
break; break;
} }
break; break;
}
#else #else
case HWLOC_OBJ_L3CACHE: case HWLOC_OBJ_L3CACHE:
asprintf(&t2, "%sL3%s:", (NULL == locality) ? "" : locality, tmp); asprintf(&t2, "%sL3%s:", (NULL == locality) ? "" : locality, tmp);
@ -2217,6 +2252,24 @@ char* opal_hwloc_base_get_locality_string(hwloc_topology_t topo,
} }
hwloc_bitmap_zero(result); hwloc_bitmap_zero(result);
} }
#if HWLOC_API_VERSION >= 0x20000
if (opal_hwloc_base_get_locality_string_by_depth(topo, HWLOC_TYPE_DEPTH_NUMANODE, cpuset, result) == 0) {
/* it should be impossible, but allow for the possibility
* that we came up empty at this depth */
if (!hwloc_bitmap_iszero(result)) {
hwloc_bitmap_list_asprintf(&tmp, result);
asprintf(&t2, "%sNM%s:", (NULL == locality) ? "" : locality, tmp);
if (NULL != locality) {
free(locality);
}
locality = t2;
free(tmp);
}
hwloc_bitmap_zero(result);
}
#endif
hwloc_bitmap_free(result); hwloc_bitmap_free(result);
hwloc_bitmap_free(cpuset); hwloc_bitmap_free(cpuset);