@@ -51,7 +51,7 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k,
51
51
int p_of_k ; /* minimum power of k that is greater than or equal to number of ranks */
52
52
int shift , to , from ;
53
53
int nphases = 0 ;
54
- MPIR_Request * sreqs [MAX_RADIX ], * rreqs [MAX_RADIX * 2 ];
54
+ MPIR_Request * static_sreqs [MAX_RADIX ], * static_rreqs [MAX_RADIX * 2 ];
55
55
MPIR_Request * * send_reqs = NULL , * * recv_reqs = NULL ;
56
56
57
57
MPIR_COLL_RANK_SIZE (comm , coll_group , rank , nranks );
@@ -76,8 +76,8 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k,
76
76
send_reqs = (MPIR_Request * * ) MPL_malloc ((k - 1 ) * sizeof (MPIR_Request * ), MPL_MEM_BUFFER );
77
77
MPIR_ERR_CHKANDJUMP (!send_reqs , mpi_errno , MPI_ERR_OTHER , "**nomem" );
78
78
} else {
79
- send_reqs = sreqs ;
80
- recv_reqs = rreqs ;
79
+ send_reqs = static_sreqs ;
80
+ recv_reqs = static_rreqs ;
81
81
}
82
82
83
83
p_of_k = 1 ;
@@ -86,6 +86,8 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k,
86
86
nphases ++ ;
87
87
}
88
88
89
+ MPIR_Request * * rreqs = recv_reqs ;
90
+ MPIR_Request * * prev_rreqs = recv_reqs + (k - 1 );
89
91
shift = 1 ;
90
92
for (i = 0 ; i < nphases ; i ++ ) {
91
93
for (j = 1 ; j < k ; j ++ ) {
@@ -97,14 +99,12 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k,
97
99
MPIR_Assert (to >= 0 && to < nranks );
98
100
99
101
/* recv from (k-1) nbrs */
100
- mpi_errno =
101
- MPIC_Irecv (NULL , 0 , MPI_BYTE , from , MPIR_BARRIER_TAG , comm , coll_group ,
102
- & recv_reqs [(j - 1 ) + ((k - 1 ) * (i & 1 ))]);
102
+ mpi_errno = MPIC_Irecv (NULL , 0 , MPI_BYTE , from , MPIR_BARRIER_TAG , comm , coll_group ,
103
+ & rreqs [j - 1 ]);
103
104
MPIR_ERR_CHECK (mpi_errno );
104
105
/* wait on recvs from prev phase */
105
106
if (i > 0 && j == 1 ) {
106
- mpi_errno =
107
- MPIC_Waitall (k - 1 , & recv_reqs [((k - 1 ) * ((i - 1 ) & 1 ))], MPI_STATUSES_IGNORE );
107
+ mpi_errno = MPIC_Waitall (k - 1 , prev_rreqs , MPI_STATUSES_IGNORE );
108
108
MPIR_ERR_CHECK (mpi_errno );
109
109
}
110
110
@@ -115,10 +115,13 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k,
115
115
mpi_errno = MPIC_Waitall (k - 1 , send_reqs , MPI_STATUSES_IGNORE );
116
116
MPIR_ERR_CHECK (mpi_errno );
117
117
shift *= k ;
118
+
119
+ MPIR_Request * * tmp = rreqs ;
120
+ rreqs = prev_rreqs ;
121
+ prev_rreqs = tmp ;
118
122
}
119
123
120
- mpi_errno =
121
- MPIC_Waitall (k - 1 , recv_reqs + ((k - 1 ) * ((nphases - 1 ) & 1 )), MPI_STATUSES_IGNORE );
124
+ mpi_errno = MPIC_Waitall (k - 1 , prev_rreqs , MPI_STATUSES_IGNORE );
122
125
MPIR_ERR_CHECK (mpi_errno );
123
126
124
127
fn_exit :
0 commit comments