@@ -133,7 +133,7 @@ int MPIDI_OFI_addr_exchange_root_ctx(void)
133133
134134 for (int i = 0 ; i < num_nodes ; i ++ ) {
135135 MPIR_Assert (mapped_table [i ] != FI_ADDR_NOTAVAIL );
136- MPIDI_OFI_AV (& MPIDIU_get_av (0 , node_roots [i ])). dest [ 0 ][ 0 ] = mapped_table [i ];
136+ MPIDI_OFI_AV_ROOT_ADDR (& MPIDIU_get_av (0 , node_roots [i ])) = mapped_table [i ];
137137 }
138138 MPL_free (mapped_table );
139139 /* Then, allgather all address names using init_comm */
@@ -149,7 +149,7 @@ int MPIDI_OFI_addr_exchange_root_ctx(void)
149149 char * addrname = (char * ) table + recv_bc_len * rank_map [i ];
150150 MPIDI_OFI_CALL (fi_av_insert (MPIDI_OFI_global .ctx [0 ].av ,
151151 addrname , 1 , & addr , 0ULL , NULL ), avmap );
152- MPIDI_OFI_AV (& MPIDIU_get_av (0 , i )). dest [ 0 ][ 0 ] = addr ;
152+ MPIDI_OFI_AV_ROOT_ADDR (& MPIDIU_get_av (0 , i )) = addr ;
153153 }
154154 }
155155 mpi_errno = MPIDU_bc_table_destroy ();
@@ -163,7 +163,7 @@ int MPIDI_OFI_addr_exchange_root_ctx(void)
163163
164164 for (int i = 0 ; i < size ; i ++ ) {
165165 MPIR_Assert (mapped_table [i ] != FI_ADDR_NOTAVAIL );
166- MPIDI_OFI_AV (& MPIDIU_get_av (0 , i )). dest [ 0 ][ 0 ] = mapped_table [i ];
166+ MPIDI_OFI_AV_ROOT_ADDR (& MPIDIU_get_av (0 , i )) = mapped_table [i ];
167167 }
168168 MPL_free (mapped_table );
169169 mpi_errno = MPIDU_bc_table_destroy ();
@@ -173,8 +173,8 @@ int MPIDI_OFI_addr_exchange_root_ctx(void)
173173 /* check */
174174 if (MPIDI_OFI_ENABLE_AV_TABLE ) {
175175 for (int r = 0 ; r < size ; r ++ ) {
176- MPIDI_OFI_addr_t * av ATTRIBUTE ((unused )) = & MPIDI_OFI_AV ( & MPIDIU_get_av (0 , r ) );
177- MPIR_Assert (av -> dest [ 0 ][ 0 ] == get_root_av_table_index (r ));
176+ MPIDI_av_entry_t * av ATTRIBUTE ((unused )) = & MPIDIU_get_av (0 , r );
177+ MPIR_Assert (MPIDI_OFI_AV_ROOT_ADDR ( av ) == get_root_av_table_index (r ));
178178 }
179179 }
180180
@@ -192,7 +192,7 @@ int MPIDI_OFI_addr_exchange_root_ctx(void)
192192/* Macros to reduce clutter, so we can focus on the ordering logics.
193193 * Note: they are not perfectly wrapped, but tolerable since only used here. */
194194#define GET_AV_AND_ADDRNAMES (rank ) \
195- MPIDI_OFI_addr_t *av ATTRIBUTE((unused)) = &MPIDI_OFI_AV(& MPIDIU_get_av(0, rank) ); \
195+ MPIDI_av_entry_t *av ATTRIBUTE((unused)) = &MPIDIU_get_av(0, rank); \
196196 char *r_names = all_names + rank * max_vcis * num_nics * name_len;
197197
198198#define DO_AV_INSERT (ctx_idx , nic , vci ) \
@@ -244,6 +244,14 @@ int MPIDI_OFI_addr_exchange_all_ctx(void)
244244 goto fn_exit ;
245245 }
246246
247+ /* allocate additional av addrs */
248+ for (int i = 0 ; i < size ; i ++ ) {
249+ MPIDI_av_entry_t * av = & MPIDIU_get_av (0 , i );
250+ MPIDI_OFI_AV (av ).all_dest = MPL_malloc (max_vcis * num_nics * sizeof (fi_addr_t ),
251+ MPL_MEM_ADDRESS );
252+ MPIR_ERR_CHKANDJUMP (!MPIDI_OFI_AV (av ).all_dest , mpi_errno , MPI_ERR_OTHER , "**nomem" );
253+ }
254+
247255 /* libfabric uses uniform name_len within a single provider */
248256 int name_len = MPIDI_OFI_global .addrnamelen ;
249257 int my_len = max_vcis * num_nics * name_len ;
@@ -274,7 +282,7 @@ int MPIDI_OFI_addr_exchange_all_ctx(void)
274282 for (int vci = 0 ; vci < NUM_VCIS_FOR_RANK (r ); vci ++ ) {
275283 SKIP_ROOT (nic , vci );
276284 DO_AV_INSERT (root_ctx_idx , nic , vci );
277- av -> dest [ nic ][ vci ] = addr ;
285+ MPIDI_OFI_AV_ADDR ( av , 0 , 0 , vci , nic ) = addr ;
278286 }
279287 }
280288 }
@@ -304,23 +312,23 @@ int MPIDI_OFI_addr_exchange_all_ctx(void)
304312 if (is_node_roots [r ]) {
305313 GET_AV_AND_ADDRNAMES (r );
306314 DO_AV_INSERT (ctx_idx , 0 , 0 );
307- MPIR_Assert (av -> dest [ 0 ][ 0 ] == addr );
315+ MPIR_Assert (MPIDI_OFI_AV_ROOT_ADDR ( av ) == addr );
308316 }
309317 }
310318 /* non-node-root */
311319 for (int r = 0 ; r < size ; r ++ ) {
312320 if (!is_node_roots [r ]) {
313321 GET_AV_AND_ADDRNAMES (r );
314322 DO_AV_INSERT (ctx_idx , 0 , 0 );
315- MPIR_Assert (av -> dest [ 0 ][ 0 ] == addr );
323+ MPIR_Assert (MPIDI_OFI_AV_ROOT_ADDR ( av ) == addr );
316324 }
317325 }
318326 } else {
319327 /* !MPIR_CVAR_CH4_ROOTS_ONLY_PMI */
320328 for (int r = 0 ; r < size ; r ++ ) {
321329 GET_AV_AND_ADDRNAMES (r );
322330 DO_AV_INSERT (ctx_idx , 0 , 0 );
323- MPIR_Assert (av -> dest [ 0 ][ 0 ] == addr );
331+ MPIR_Assert (MPIDI_OFI_AV_ROOT_ADDR ( av ) == addr );
324332 }
325333 }
326334
@@ -331,7 +339,7 @@ int MPIDI_OFI_addr_exchange_all_ctx(void)
331339 for (int vci = 0 ; vci < NUM_VCIS_FOR_RANK (r ); vci ++ ) {
332340 SKIP_ROOT (nic , vci );
333341 DO_AV_INSERT (ctx_idx , nic , vci );
334- MPIR_Assert (av -> dest [ nic ][ vci ] == addr );
342+ MPIR_Assert (MPIDI_OFI_AV_ADDR ( av , 0 , 0 , vci , nic ) == addr );
335343 }
336344 }
337345 }
@@ -344,11 +352,11 @@ int MPIDI_OFI_addr_exchange_all_ctx(void)
344352#if MPIDI_CH4_MAX_VCIS > 1
345353 if (MPIDI_OFI_ENABLE_AV_TABLE ) {
346354 for (int r = 0 ; r < size ; r ++ ) {
347- MPIDI_OFI_addr_t * av ATTRIBUTE ((unused )) = & MPIDI_OFI_AV ( & MPIDIU_get_av (0 , r ) );
355+ MPIDI_av_entry_t * av ATTRIBUTE ((unused )) = & MPIDIU_get_av (0 , r );
348356 for (int nic = 0 ; nic < num_nics ; nic ++ ) {
349357 for (int vci = 0 ; vci < NUM_VCIS_FOR_RANK (r ); vci ++ ) {
350- MPIR_Assert (av -> dest [ nic ][ vci ] == get_av_table_index ( r , nic , vci ,
351- all_num_vcis ));
358+ MPIR_Assert (MPIDI_OFI_AV_ADDR ( av , 0 , 0 , vci , nic ) ==
359+ get_av_table_index ( r , nic , vci , all_num_vcis ));
352360 }
353361 }
354362 }
0 commit comments