Apply patch from @bgoglin
Fixes #4027 Signed-off-by: Ralph Castain <rhc@open-mpi.org>
Этот коммит содержится в:
родитель
0e9623faf8
Коммит
daf548b328
@ -651,6 +651,7 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
{
|
{
|
||||||
struct hwloc_tma *tma = newtopology->tma;
|
struct hwloc_tma *tma = newtopology->tma;
|
||||||
hwloc_obj_t *level;
|
hwloc_obj_t *level;
|
||||||
|
unsigned level_width;
|
||||||
size_t len;
|
size_t len;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
hwloc_obj_t child;
|
hwloc_obj_t child;
|
||||||
@ -700,6 +701,7 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
if ((int) src->depth < 0) {
|
if ((int) src->depth < 0) {
|
||||||
i = HWLOC_SLEVEL_FROM_DEPTH(src->depth);
|
i = HWLOC_SLEVEL_FROM_DEPTH(src->depth);
|
||||||
level = newtopology->slevels[i].objs;
|
level = newtopology->slevels[i].objs;
|
||||||
|
level_width = newtopology->slevels[i].nbobjs;
|
||||||
/* deal with first/last pointers of special levels, even if not really needed */
|
/* deal with first/last pointers of special levels, even if not really needed */
|
||||||
if (!newobj->logical_index)
|
if (!newobj->logical_index)
|
||||||
newtopology->slevels[i].first = newobj;
|
newtopology->slevels[i].first = newobj;
|
||||||
@ -707,13 +709,22 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
newtopology->slevels[i].last = newobj;
|
newtopology->slevels[i].last = newobj;
|
||||||
} else {
|
} else {
|
||||||
level = newtopology->levels[src->depth];
|
level = newtopology->levels[src->depth];
|
||||||
|
level_width = newtopology->level_nbobjects[src->depth];
|
||||||
}
|
}
|
||||||
/* place us for real and link to previous cousin */
|
/* place us for real */
|
||||||
|
assert(newobj->logical_index < level_width);
|
||||||
level[newobj->logical_index] = newobj;
|
level[newobj->logical_index] = newobj;
|
||||||
if (newobj->logical_index) {
|
/* link to already-inserted cousins
|
||||||
|
* (hwloc_pci_belowroot_apply_locality() can cause out-of-order logical indexes)
|
||||||
|
*/
|
||||||
|
if (newobj->logical_index > 0 && level[newobj->logical_index-1]) {
|
||||||
newobj->prev_cousin = level[newobj->logical_index-1];
|
newobj->prev_cousin = level[newobj->logical_index-1];
|
||||||
level[newobj->logical_index-1]->next_cousin = newobj;
|
level[newobj->logical_index-1]->next_cousin = newobj;
|
||||||
}
|
}
|
||||||
|
if (newobj->logical_index < level_width-1 && level[newobj->logical_index+1]) {
|
||||||
|
newobj->next_cousin = level[newobj->logical_index+1];
|
||||||
|
level[newobj->logical_index+1]->prev_cousin = newobj;
|
||||||
|
}
|
||||||
|
|
||||||
/* prepare for children */
|
/* prepare for children */
|
||||||
if (src->arity) {
|
if (src->arity) {
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user