29 MPI_Datatype dup_info_dt;
30 enum {NUM_MEMBERS = 4};
31 int array_of_blocklengths[NUM_MEMBERS] = {1, 1, 1, 1};
32 MPI_Aint array_of_displacements[NUM_MEMBERS];
39 &array_of_displacements[0]), comm);
40 array_of_displacements[0] -= base_addr;
44 &array_of_displacements[1]), comm);
45 array_of_displacements[1] -= base_addr;
49 &array_of_displacements[2]), comm);
50 array_of_displacements[2] -= base_addr;
54 &array_of_displacements[3]), comm);
55 array_of_displacements[3] -= base_addr;
57 const MPI_Datatype array_of_types[NUM_MEMBERS] =
60 MPI_Type_create_struct(
61 NUM_MEMBERS, array_of_blocklengths, array_of_displacements,
62 array_of_types, &dup_info_dt), comm);
69 MPI_Datatype stencil_info_dt;
70 enum {NUM_MEMBERS = 3};
71 int array_of_blocklengths[NUM_MEMBERS] = {1, 1, 1};
72 MPI_Aint array_of_displacements[NUM_MEMBERS];
79 array_of_displacements[0] -= base_addr;
82 &(dummy.
idx), &array_of_displacements[1]), comm);
83 array_of_displacements[1] -= base_addr;
86 &(dummy.
rank), &array_of_displacements[2]), comm);
87 array_of_displacements[2] -= base_addr;
89 const MPI_Datatype array_of_types[NUM_MEMBERS] =
92 MPI_Type_create_struct(
93 NUM_MEMBERS, array_of_blocklengths, array_of_displacements,
94 array_of_types, &stencil_info_dt), comm);
122 yac_int * tgt_orig_global_id,
size_t * tgt_duplicated_idx,
125 char const * routine =
"yac_duplicate_stencils";
127 yac_int * duplicated_global_ids =
128 xmalloc(nbr_duplicated *
sizeof(*duplicated_global_ids));
152 for (
size_t i = 0; i < nbr_duplicated; ++i)
153 duplicated_global_ids[i] = point_ids[tgt_duplicated_idx[i]];
161 int comm_rank, comm_size;
166 xmalloc((nbr_duplicated + stencil_count) *
sizeof(*int_buffer));
167 int * dup_dist_ranks = int_buffer;
168 int * stencil_dist_ranks = int_buffer + nbr_duplicated;
171 for (
size_t i = 0; i < nbr_duplicated; ++i)
172 dup_dist_ranks[i] =
compute_bucket(tgt_orig_global_id[i], comm_size);
173 for (
size_t i = 0; i < stencil_count; ++i)
174 stencil_dist_ranks[i] =
compute_bucket(stencil_tgt_ids[i], comm_size);
176 size_t * sendcounts, * recvcounts, * sdispls, * rdispls;
178 1, &sendcounts, &recvcounts, &sdispls, &rdispls, comm);
182 for (
size_t i = 0; i < nbr_duplicated; ++i)
183 sendcounts[dup_dist_ranks[i]]++;
185 1, sendcounts, recvcounts, sdispls, rdispls, comm);
187 size_t dup_info_count = recvcounts[comm_size - 1] + rdispls[comm_size - 1];
189 xmalloc((nbr_duplicated + dup_info_count) *
sizeof(*dup_info_buffer));
190 struct dup_info * dup_send_buffer = dup_info_buffer + dup_info_count;
191 struct dup_info * dup_recv_buffer = dup_info_buffer;
194 for (
size_t i = 0; i < nbr_duplicated; ++i) {
195 size_t pos = sdispls[dup_dist_ranks[i]+1]++;
206 dup_send_buffer, sendcounts, sdispls,
207 dup_recv_buffer, recvcounts, rdispls,
208 sizeof(*dup_send_buffer), dup_info_dt, comm, routine, __LINE__);
211 xrealloc(dup_recv_buffer, dup_info_count *
sizeof(*dup_recv_buffer));
213 dup_recv_buffer, dup_info_count,
sizeof(*dup_recv_buffer),
217 memset(sendcounts, 0, (
size_t)comm_size *
sizeof(*sendcounts));
218 for (
size_t i = 0; i < stencil_count; ++i)
219 sendcounts[stencil_dist_ranks[i]]++;
221 1, sendcounts, recvcounts, sdispls, rdispls, comm);
223 size_t stencil_info_count = recvcounts[comm_size - 1] + rdispls[comm_size - 1];
225 xmalloc((stencil_count + stencil_info_count) *
sizeof(*stencil_info_buffer));
227 stencil_info_buffer + stencil_info_count;
228 struct stencil_info * stencil_recv_buffer = stencil_info_buffer;
231 for (
size_t i = 0; i < stencil_count; ++i) {
232 size_t pos = sdispls[stencil_dist_ranks[i]+1]++;
234 stencil_send_buffer[pos].
idx = i;
235 stencil_send_buffer[pos].
rank = comm_rank;
237 free(stencil_tgt_ids);
243 stencil_send_buffer, sendcounts, sdispls,
244 stencil_recv_buffer, recvcounts, rdispls,
245 sizeof(*stencil_send_buffer), stencil_info_dt, comm, routine, __LINE__);
247 stencil_recv_buffer =
249 stencil_recv_buffer, stencil_info_count *
sizeof(*stencil_recv_buffer));
251 stencil_recv_buffer, stencil_info_count,
sizeof(*stencil_recv_buffer),
256 size_t dup_match_count = 0;
257 size_t stencil_match_count = 0;
258 for (
size_t i = 0, j = 0; i < dup_info_count; ++i) {
260 while ((j < stencil_info_count) &&
261 (stencil_recv_buffer[j].
tgt_global_id < curr_orig_global_id)) ++j;
262 if ((j < stencil_info_count) &&
263 (stencil_recv_buffer[j].
tgt_global_id == curr_orig_global_id))
266 while ((k < stencil_info_count) &&
267 (stencil_recv_buffer[k].
tgt_global_id == curr_orig_global_id)) {
269 ++stencil_match_count;
274 dup_remote_points.
data =
275 xmalloc(dup_match_count *
sizeof(*(dup_remote_points.
data)));
276 dup_remote_points.
count = dup_match_count;
277 size_t * num_stencils_per_tgt =
278 xmalloc(stencil_match_count *
sizeof(*num_stencils_per_tgt));
279 size_t * stencil_indices =
280 xmalloc(stencil_match_count *
sizeof(*stencil_indices));
281 int * stencil_ranks =
282 xmalloc(stencil_match_count *
sizeof(*stencil_ranks));
283 double * w =
xmalloc(stencil_match_count *
sizeof(*w));
287 stencil_match_count = 0;
288 for (
size_t i = 0, j = 0; i < dup_info_count; ++i) {
292 while ((j < stencil_info_count) &&
293 (stencil_recv_buffer[j].tgt_global_id < curr_orig_global_id)) ++j;
296 if ((j < stencil_info_count) &&
297 (stencil_recv_buffer[j].tgt_global_id == curr_orig_global_id)) {
299 size_t curr_num_stencils_per_tgt = 0;
303 while ((k < stencil_info_count) &&
304 (stencil_recv_buffer[k].tgt_global_id == curr_orig_global_id)) {
305 stencil_indices[stencil_match_count] = stencil_recv_buffer[k].
idx;
306 stencil_ranks[stencil_match_count] = stencil_recv_buffer[k].
rank;
307 w[stencil_match_count] = 1.0;
309 ++stencil_match_count;
310 ++curr_num_stencils_per_tgt;
319 (uint64_t)(dup_recv_buffer[i].duplicated_orig_pos);
320 num_stencils_per_tgt[dup_match_count] = curr_num_stencils_per_tgt;
327 weights, &dup_remote_points, num_stencils_per_tgt,
328 stencil_indices, stencil_ranks, w);
333 free(stencil_indices);
334 free(num_stencils_per_tgt);
335 free(stencil_recv_buffer);
336 free(dup_remote_points.
data);
337 free(dup_recv_buffer);
340 free(duplicated_global_ids);