Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

comm: re-implement dynamic processes using mpir-layer lpid #7240

Open
wants to merge 59 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
f345ef8
misc: spellchecks
hzhou Dec 21, 2024
843cfe5
test: remove unused test glpid
hzhou Dec 10, 2024
89338a6
group: remove unused groupdebug.c
hzhou Dec 10, 2024
937cc50
group: abstract group access and lpid integer type
hzhou Dec 10, 2024
b04ca33
misc: use the new group rank/lpid conversion routines
hzhou Dec 10, 2024
d5ec57f
comm: use MPIR_Group_create_{map, stride)
hzhou Dec 10, 2024
5572c0d
group: rearange functions in group_impl.c
hzhou Dec 10, 2024
75791da
group: refactor group_impl.c to use new group interfaces
hzhou Dec 10, 2024
7ac4e21
group: refactor MPIR_Group
hzhou Dec 10, 2024
928feb9
---- START HERE ----
hzhou Dec 11, 2024
1685d2b
mpid/ch4: remove MPIDI_NM_comm_get_gpid
hzhou Dec 12, 2024
e92b94b
mpid: replace usage of uint64_t lpid with MPIR_Lpid
hzhou Dec 12, 2024
3f9677d
group: add MPIR_Worlds
hzhou Dec 11, 2024
1d109bb
group: add MPIR_Group_finalize
hzhou Dec 19, 2024
d9c96aa
group: add builtin MPIR_GROUP_{WORLD,SELF}
hzhou Dec 11, 2024
53d4742
group: add MPIR_Group_dup
hzhou Dec 13, 2024
8f6cddf
binding/group: remove error check in MPI_Group_free
hzhou Dec 12, 2024
c52fd73
comm: always set local_group and remote_group
hzhou Dec 11, 2024
3371f79
group: avoid freeing MPIR_Group_empty
hzhou Dec 13, 2024
3d9a110
ch4: release init_comm->local_group
hzhou Dec 13, 2024
0242bbc
ch4: assert group before communicator commit
hzhou Dec 12, 2024
fcce168
---- START HERE ----
hzhou Dec 12, 2024
e598d92
abi: run ABI_init_builtins in MPI_T_init_thread
hzhou Dec 22, 2024
27fbc60
test/runtests: capture stray output in run_mpitests
hzhou Dec 21, 2024
c85c02c
comm: add MPIR_comm_rank_to_lpid and make it inline
hzhou Dec 18, 2024
2e78cff
group: add LPID macros
hzhou Dec 17, 2024
ca0ed49
group: misc fixups for grouputil
hzhou Dec 19, 2024
e139b15
group: add MPIR_Group_dup duplicating builtin groups
hzhou Dec 19, 2024
8a999c6
ch3: add ch3_vcrt to MPIR_Group
hzhou Dec 18, 2024
5306acb
ch3: shortcut tmp_comm used in MPI_Comm_accept/connect
hzhou Dec 19, 2024
2b5ee69
ch3: use group to build vcrt instead of mapper
hzhou Dec 18, 2024
0ab1e55
ch3: remove the isDisconnected arg from MPIDI_VCRT_Release
hzhou Dec 20, 2024
ca79ab7
comm: avoid creating invalid intercomm then destroy it
hzhou Dec 21, 2024
d486176
---- START HERE ----
hzhou Dec 20, 2024
8fc2f94
mpir/mem: add MPIR_CHKLMEM_ADD
hzhou Dec 26, 2024
216871b
mpir: split lpid headers to mpir_lpid.h
hzhou Dec 23, 2024
4f13f23
group: optimize grouputil
hzhou Dec 24, 2024
48a4bab
group: simplify strided pmap by removing blocksize
hzhou Dec 24, 2024
f53004d
group: remove pmap->size
hzhou Dec 24, 2024
21e75a5
ch3: return error code in create_vcrt_from_group
hzhou Dec 24, 2024
ef1a145
ch3: fixup mpid_vc.c for lpid parameter type
hzhou Dec 25, 2024
82ba2c9
mpid: remove unused MPID_INTERCOMM_NO_DYNPROC
hzhou Dec 23, 2024
b7622a0
ch4: add MPIDIU_lpid_to_av and MPIDIU_lpid_to_av_slow
hzhou Dec 17, 2024
e7428e5
ch4: re-implement MPIDIU_comm_rank_to_av
hzhou Dec 18, 2024
315aa09
ch4: add utils to support dynamic av
hzhou Dec 17, 2024
b15f699
ch4: new netmod api to support dynamic processes
hzhou Dec 13, 2024
e37d1fc
ADI/comm: exchange context_id in MPID_Intercomm_exchange
hzhou Dec 16, 2024
e8d8e82
ADI: remove MPID_Comm_get_lpid
hzhou Dec 18, 2024
c605347
ch4: refactor MPID_Intercomm_exchange
hzhou Dec 16, 2024
45add2f
ch4: refactor ch4_spawn
hzhou Dec 18, 2024
e096d2b
comm: remove mapper
hzhou Dec 18, 2024
29b4dfd
ch4: remove MPIDI_rank_map_t
hzhou Dec 20, 2024
a1fefa6
ch4: rewrite MPIDIU_rank_to_lpid
hzhou Dec 20, 2024
e8f96fb
ch4: remove MPIDIU_comm_rank_to_pid
hzhou Dec 20, 2024
140d116
ch4: track lpid in upid_hash
hzhou Dec 23, 2024
7efe6b2
ch4: remove netmod api upids_to_lpids
hzhou Dec 23, 2024
b0b1744
ch4: replace MPIDIU_get_av
hzhou Dec 23, 2024
e7316e6
ch4/ofi: add a way to tell whether an av entry is empty
hzhou Dec 25, 2024
54d2544
ch4: remove av table ref_count
hzhou Dec 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dummy
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1
1
1
2 changes: 1 addition & 1 deletion maint/local_python/binding_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -1106,7 +1106,7 @@ def out_can_be_undefined(p):
G.out.append("int ret = " + static_call + ";")
for l in post_filters:
G.out.append(l)
if re.match(r'MPI_(Init|Init_thread|Session_init)$', func_name, re.IGNORECASE):
if re.match(r'MPI_(Init|Init_thread|Session_init)|MPI_T_init_thread$', func_name, re.IGNORECASE):
G.out.append("ABI_init_builtins();")
G.out.append("return ret;")
G.out.append("DEDENT")
Expand Down
1 change: 1 addition & 0 deletions src/binding/abi/mpi_abi_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ static inline ABI_Datatype ABI_Datatype_from_mpi(MPI_Datatype in)
return (ABI_Datatype) ((intptr_t) ABI_DATATYPE_NULL + i);
}
}
MPIR_Assert(0);
}
MPIR_Datatype *ptr;
MPIR_Datatype_get_ptr(in, ptr);
Expand Down
12 changes: 0 additions & 12 deletions src/binding/c/group_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,6 @@ MPI_Group_excl:

MPI_Group_free:
.desc: Frees a group
{ -- error_check --
/* Cannot free the predefined groups, but allow GROUP_EMPTY
* because otherwise many tests fail */
if ((HANDLE_IS_BUILTIN(*group)) && *group != MPI_GROUP_EMPTY) {
mpi_errno = MPIR_Err_create_code(MPI_SUCCESS,
MPIR_ERR_RECOVERABLE, __func__, __LINE__,
MPI_ERR_GROUP, "**groupperm", 0);
}
if (mpi_errno) {
goto fn_fail;
}
}

MPI_Group_incl:
.desc: Produces a group by reordering an existing group and taking only listed members
Expand Down
1 change: 1 addition & 0 deletions src/include/mpiimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ typedef struct MPIR_Stream MPIR_Stream;
#include "mpir_errhandler.h"
#include "mpir_attr_generic.h"
#include "mpir_contextid.h"
#include "mpir_lpid.h"
#include "mpir_status.h"
#include "mpir_debugger.h"
#include "mpir_op.h"
Expand Down
77 changes: 16 additions & 61 deletions src/include/mpir_comm.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,44 +31,6 @@ typedef enum MPIR_Comm_hierarchy_kind_t {
MPIR_COMM_HIERARCHY_KIND__MULTI_LEADS = 4, /* is the multi_leaders_comm for a node */
} MPIR_Comm_hierarchy_kind_t;

typedef enum {
MPIR_COMM_MAP_TYPE__DUP,
MPIR_COMM_MAP_TYPE__IRREGULAR
} MPIR_Comm_map_type_t;

/* direction of mapping: local to local, local to remote, remote to
* local, remote to remote */
typedef enum {
MPIR_COMM_MAP_DIR__L2L,
MPIR_COMM_MAP_DIR__L2R,
MPIR_COMM_MAP_DIR__R2L,
MPIR_COMM_MAP_DIR__R2R
} MPIR_Comm_map_dir_t;

typedef struct MPIR_Comm_map {
MPIR_Comm_map_type_t type;

struct MPIR_Comm *src_comm;

/* mapping direction for intercomms, which contain local and
* remote groups */
MPIR_Comm_map_dir_t dir;

/* only valid for irregular map type */
int src_mapping_size;
int *src_mapping;
int free_mapping; /* we allocated the mapping */

struct MPIR_Comm_map *next;
} MPIR_Comm_map_t;

int MPIR_Comm_map_irregular(struct MPIR_Comm *newcomm, struct MPIR_Comm *src_comm,
int *src_mapping, int src_mapping_size,
MPIR_Comm_map_dir_t dir, MPIR_Comm_map_t ** map);
int MPIR_Comm_map_dup(struct MPIR_Comm *newcomm, struct MPIR_Comm *src_comm,
MPIR_Comm_map_dir_t dir);
int MPIR_Comm_map_free(struct MPIR_Comm *comm);

/* Communicator info hint */
#define MPIR_COMM_HINT_TYPE_BOOL 0
#define MPIR_COMM_HINT_TYPE_INT 1
Expand Down Expand Up @@ -166,9 +128,9 @@ struct MPIR_Comm {
int rank; /* Value of MPI_Comm_rank */
MPIR_Attribute *attributes; /* List of attributes */
int local_size; /* Value of MPI_Comm_size for local group */
MPIR_Group *local_group, /* Groups in communicator. */
*remote_group; /* The local and remote groups are the
* same for intra communicators */
MPIR_Group *local_group; /* Groups in communicator. */
MPIR_Group *remote_group; /* The remote group in a inter communicator.
* Must be NULL in a intra communicator. */
MPIR_Comm_kind_t comm_kind; /* MPIR_COMM_KIND__INTRACOMM or MPIR_COMM_KIND__INTERCOMM */
char name[MPI_MAX_OBJECT_NAME]; /* Required for MPI-2 */
MPIR_Errhandler *errhandler; /* Pointer to the error handler structure */
Expand Down Expand Up @@ -254,12 +216,6 @@ struct MPIR_Comm {
hcoll_comm_priv_t hcoll_priv;
#endif /* HAVE_HCOLL */

/* the mapper is temporarily filled out in order to allow the
* device to setup its network addresses. it will be freed after
* the device has initialized the comm. */
MPIR_Comm_map_t *mapper_head;
MPIR_Comm_map_t *mapper_tail;

enum { MPIR_STREAM_COMM_NONE, MPIR_STREAM_COMM_SINGLE, MPIR_STREAM_COMM_MULTIPLEX }
stream_comm_type;
union {
Expand Down Expand Up @@ -296,6 +252,15 @@ void MPIR_stream_comm_free(MPIR_Comm * comm_ptr);
int MPIR_Comm_copy_stream(MPIR_Comm * oldcomm, MPIR_Comm * newcomm);
int MPIR_get_local_gpu_stream(MPIR_Comm * comm_ptr, MPL_gpu_stream_t * gpu_stream);

MPL_STATIC_INLINE_PREFIX MPIR_Lpid MPIR_comm_rank_to_lpid(MPIR_Comm * comm_ptr, int rank)
{
if (comm_ptr->comm_kind == MPIR_COMM_KIND__INTRACOMM) {
return MPIR_Group_rank_to_lpid(comm_ptr->local_group, rank);
} else {
return MPIR_Group_rank_to_lpid(comm_ptr->remote_group, rank);
}
}

MPL_STATIC_INLINE_PREFIX MPIR_Stream *MPIR_stream_comm_get_local_stream(MPIR_Comm * comm_ptr)
{
if (comm_ptr->stream_comm_type == MPIR_STREAM_COMM_SINGLE) {
Expand Down Expand Up @@ -377,10 +342,6 @@ int MPIR_Comm_commit(MPIR_Comm *);

int MPIR_Comm_is_parent_comm(MPIR_Comm *);

/* peer intercomm is an internal 1-to-1 intercomm used for connecting dynamic processes */
int MPIR_peer_intercomm_create(int context_id, int recvcontext_id,
uint64_t remote_lpid, int is_low_group, MPIR_Comm ** newcomm);

#define MPIR_Comm_rank(comm_ptr) ((comm_ptr)->rank)
#define MPIR_Comm_size(comm_ptr) ((comm_ptr)->local_size)

Expand Down Expand Up @@ -420,6 +381,10 @@ int MPIR_Comm_split_type(MPIR_Comm * comm_ptr, int split_type, int key, MPIR_Inf
int MPIR_Comm_split_type_neighborhood(MPIR_Comm * comm_ptr, int split_type, int key,
MPIR_Info * info_ptr, MPIR_Comm ** newcomm_ptr);

int MPIR_Intercomm_create_timeout(MPIR_Comm * local_comm_ptr, int local_leader,
MPIR_Comm * peer_comm_ptr, int remote_leader,
int tag, int timeout, MPIR_Comm ** new_intercomm_ptr);

/* Preallocated comm objects. There are 3: comm_world, comm_self, and
a private (non-user accessible) dup of comm world that is provided
if needed in MPI_Finalize. Having a separate version of comm_world
Expand Down Expand Up @@ -449,16 +414,6 @@ int MPII_Comm_copy_data(MPIR_Comm * comm_ptr, MPIR_Info * info, MPIR_Comm ** out

int MPII_Setup_intercomm_localcomm(MPIR_Comm *);

/* comm_create helper functions, used by both comm_create and comm_create_group */
int MPII_Comm_create_calculate_mapping(MPIR_Group * group_ptr,
MPIR_Comm * comm_ptr,
int **mapping_out, MPIR_Comm ** mapping_comm);

int MPII_Comm_create_map(int local_n,
int remote_n,
int *local_mapping,
int *remote_mapping, MPIR_Comm * mapping_comm, MPIR_Comm * newcomm);

int MPII_Comm_set_hints(MPIR_Comm * comm_ptr, MPIR_Info * info, bool in_comm_create);
int MPII_Comm_get_hints(MPIR_Comm * comm_ptr, MPIR_Info * info);
int MPII_Comm_check_hints(MPIR_Comm * comm_ptr);
Expand Down
71 changes: 44 additions & 27 deletions src/include/mpir_group.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,7 @@
* only because they are required for the group operations (e.g.,
* MPI_Group_intersection) and for the scalable RMA synchronization
*---------------------------------------------------------------------------*/
/* This structure is used to implement the group operations such as
MPI_Group_translate_ranks */
/* note: next_lpid (with idx_of_first_lpid in MPIR_Group) gives a linked list
* in a sorted lpid ascending order */
typedef struct MPII_Group_pmap_t {
uint64_t lpid; /* local process id, from VCONN */
int next_lpid; /* Index of next lpid (in lpid order) */
} MPII_Group_pmap_t;

/* Any changes in the MPIR_Group structure must be made to the
predefined value in MPIR_Group_builtin for MPI_GROUP_EMPTY in
src/mpi/group/grouputil.c */

/*S
MPIR_Group - Description of the Group data structure

Expand Down Expand Up @@ -53,22 +42,34 @@ typedef struct MPII_Group_pmap_t {
Group-DS

S*/

/* In addition to MPI_GROUP_EMPTY, internally we have a few more builtins */
#define MPIR_GROUP_WORLD ((MPI_Group)0x48000001)
#define MPIR_GROUP_SELF ((MPI_Group)0x48000002)

#define MPIR_GROUP_WORLD_PTR (MPIR_Group_builtin + 1)
#define MPIR_GROUP_SELF_PTR (MPIR_Group_builtin + 2)

struct MPIR_Pmap {
bool use_map;
union {
MPIR_Lpid *map;
struct {
MPIR_Lpid offset;
MPIR_Lpid stride;
} stride;
} u;
};

struct MPIR_Group {
MPIR_OBJECT_HEADER; /* adds handle and ref_count fields */
int size; /* Size of a group */
int rank; /* rank of this process relative to this
* group */
int idx_of_first_lpid;
MPII_Group_pmap_t *lrank_to_lpid; /* Array mapping a local rank to local
* process number */
int is_local_dense_monotonic; /* see NOTE-G1 */

/* We may want some additional data for the RMA syncrhonization calls */
/* Other, device-specific information */
int rank; /* rank of this process relative to this group */
struct MPIR_Pmap pmap;
MPIR_Session *session_ptr; /* Pointer to session to which this group belongs */
#ifdef MPID_DEV_GROUP_DECL
MPID_DEV_GROUP_DECL
#endif
MPIR_Session * session_ptr; /* Pointer to session to which this group belongs */
};

/* NOTE-G1: is_local_dense_monotonic will be true iff the group meets the
Expand Down Expand Up @@ -97,18 +98,34 @@ extern MPIR_Group *const MPIR_Group_empty;
#define MPIR_Group_release_ref(_group, _inuse) \
do { MPIR_Object_release_ref(_group, _inuse); } while (0)

void MPII_Group_setup_lpid_list(MPIR_Group *);
int MPIR_Group_check_valid_ranks(MPIR_Group *, const int[], int);
int MPIR_Group_check_valid_ranges(MPIR_Group *, int[][3], int);
void MPIR_Group_setup_lpid_pairs(MPIR_Group *, MPIR_Group *);
int MPIR_Group_create(int, MPIR_Group **);
int MPIR_Group_release(MPIR_Group * group_ptr);

int MPIR_Group_dup(MPIR_Group * old_group, MPIR_Session * session_ptr, MPIR_Group ** new_group_ptr);
int MPIR_Group_create_map(int size, int rank, MPIR_Session * session_ptr, MPIR_Lpid * map,
MPIR_Group ** new_group_ptr);
int MPIR_Group_create_stride(int size, int rank, MPIR_Session * session_ptr,
MPIR_Lpid offset, MPIR_Lpid stride, MPIR_Group ** new_group_ptr);
int MPIR_Group_lpid_to_rank(MPIR_Group * group, MPIR_Lpid lpid);

int MPIR_Group_check_subset(MPIR_Group * group_ptr, MPIR_Comm * comm_ptr);
void MPIR_Group_set_session_ptr(MPIR_Group * group_ptr, MPIR_Session * session_out);
int MPIR_Group_init(void);

/* internal functions */
void MPII_Group_setup_lpid_list(MPIR_Group *);
int MPIR_Group_finalize(void);

MPL_STATIC_INLINE_PREFIX MPIR_Lpid MPIR_Group_rank_to_lpid(MPIR_Group * group, int rank)
{
if (rank < 0 || rank >= group->size) {
return MPI_UNDEFINED;
}

if (group->pmap.use_map) {
return group->pmap.u.map[rank];
} else {
return group->pmap.u.stride.offset + rank * group->pmap.u.stride.stride;
}
}

#endif /* MPIR_GROUP_H_INCLUDED */
46 changes: 46 additions & 0 deletions src/include/mpir_lpid.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (C) by Argonne National Laboratory
* See COPYRIGHT in top-level directory
*/

#ifndef MPIR_LPID_H_INCLUDED
#define MPIR_LPID_H_INCLUDED

/* Worlds -
* We need a device-independent way of identifying processes. Assuming the concept of
* "worlds", we can describe a process with (world_idx, world_rank).
*
* The world_idx is a local id because each process may not see all worlds. Thus,
* each process only can maintain a list of worlds as it encounters them. Thus,
* a process id derived from (world_idx, world_rank) is referred as LPID, or
* "local process id".
*
* Each process should maintain a table of worlds with sufficient information so
* processes can match worlds upon connection or making address exchange.
*/

#define MPIR_NAMESPACE_MAX 128
struct MPIR_World {
char namespace[MPIR_NAMESPACE_MAX];
/* other useful fields */
int num_procs;
};

extern struct MPIR_World MPIR_Worlds[];

int MPIR_add_world(const char *namespace, int num_procs);
int MPIR_find_world(const char *namespace);

/* Abstract the integer type for lpid (process id). It is possible to use 32-bit
* in principle, but 64-bit is simpler since we can trivially combine
* (world_idx, world_rank).
*/
typedef int64_t MPIR_Lpid;

#define MPIR_LPID_WORLD_INDEX(lpid) ((lpid) >> 32)
#define MPIR_LPID_WORLD_RANK(lpid) ((lpid) & 0xffffffff)
#define MPIR_LPID_FROM(world_idx, world_rank) (((uint64_t)(world_idx) << 32) | (world_rank))
#define MPIR_LPID_DYNAMIC_MASK ((MPIR_Lpid)0x1 << 62) /* MPIR_Lpid is signed, avoid using the signed bit */
#define MPIR_LPID_INVALID 0xffffffff

#endif /* MPIR_LPID_H_INCLUDED */
6 changes: 6 additions & 0 deletions src/include/mpir_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ extern "C" {
int mpiu_chklmem_stk_sp_=0; \
MPIR_AssertDeclValue(const int mpiu_chklmem_stk_sz_,n_)

#define MPIR_CHKLMEM_ADD(pointer_) \
do { \
MPIR_Assert(mpiu_chklmem_stk_sp_<mpiu_chklmem_stk_sz_); \
mpiu_chklmem_stk_[mpiu_chklmem_stk_sp_++] = (void *) (pointer_); \
} while (0)

#define MPIR_CHKLMEM_MALLOC_ORSTMT(pointer_,type_,nbytes_,rc_,name_,class_,stmt_) \
{ \
pointer_ = (type_)MPL_malloc(nbytes_,class_); \
Expand Down
2 changes: 1 addition & 1 deletion src/include/mpir_objects.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ const char *MPIR_Handle_get_kind_str(int kind);
#define MPIR_COMM_PREALLOC 8
#endif

#define MPIR_GROUP_N_BUILTIN 1
#define MPIR_GROUP_N_BUILTIN 3
#ifdef MPID_GROUP_PREALLOC
#define MPIR_GROUP_PREALLOC MPID_GROUP_PREALLOC
#else
Expand Down
10 changes: 5 additions & 5 deletions src/mpi/coll/algorithms/treealgo/treeutil.c
Original file line number Diff line number Diff line change
Expand Up @@ -504,10 +504,10 @@ static int MPII_Treeutil_hierarchy_populate(MPIR_Comm * comm, int rank, int nran
MPIR_Assert(upper_level != NULL);

/* Get wrank from the communicator as the coords are stored with wrank */
uint64_t temp = 0;
MPID_Comm_get_lpid(comm, r, &temp, FALSE);
int wrank = (int) temp;
if (wrank < 0)
MPIR_Lpid temp = MPIR_comm_rank_to_lpid(comm, r);
int world_idx = MPIR_LPID_WORLD_INDEX(temp);
int wrank = MPIR_LPID_WORLD_RANK(temp);
if (world_idx != 0)
goto fn_fail;
MPIR_Assert(0 <= wrank && wrank < MPIR_Process.size);

Expand Down Expand Up @@ -1129,7 +1129,7 @@ int MPII_Treeutil_tree_topology_wave_init(MPIR_Comm * comm, int k, int root, boo
heap_vector minHeaps;
heap_vector_init(&minHeaps);

/* To build hierarchy of ranks, swiches and groups */
/* To build hierarchy of ranks, switches and groups */
int dim = MPIR_Process.coords_dims - 1;
for (dim = MPIR_Process.coords_dims - 1; dim >= 0; --dim)
tree_ut_hierarchy_init(&hierarchy[dim]);
Expand Down
Loading