71 size_t *num_src_intersections,
73 size_t *num_dst_intersections,
89 int comm_size, rank, is_inter;
91 xt_mpi_call(MPI_Comm_test_inter(comm, &is_inter), comm);
92 int (*get_comm_size)(
MPI_Comm,
int *)
93 = is_inter ? MPI_Comm_remote_size : MPI_Comm_size;
103 size_t size_sum = src_pack_size + dst_pack_size;
105 if (size_sum >= INT_MAX || size_sum < src_pack_size
106 || size_sum < dst_pack_size)
107 die(
"local src+dst index lists are too large");
109 int send_buffer_size = (int)size_sum;
112 int *restrict pack_sizes
113 =
xmalloc((
size_t)comm_size *
sizeof(*pack_sizes) * 2);
115 xt_mpi_call(MPI_Allgather(&send_buffer_size, 1, MPI_INT,
116 pack_sizes, 1, MPI_INT, comm), comm);
118 int *restrict displ = pack_sizes + comm_size;
120 unsigned recv_buffer_size = (unsigned)pack_sizes[0];
121 unsigned size_overflow = 0;
122 for (
size_t i = 1; i < (size_t)comm_size; ++i) {
124 displ[i] = (int)recv_buffer_size;
125 recv_buffer_size += (unsigned)pack_sizes[i];
126 size_overflow |= recv_buffer_size & (1U << (
sizeof(int) * CHAR_BIT - 1));
129 die(
"accumulated buffer sizes too big,"
130 " use distributed directory (xt_xmap_dist_dir_new)!");
131 void *recv_buffer =
xmalloc((
size_t)recv_buffer_size + size_sum),
132 *send_buffer = (
unsigned char *)recv_buffer + (
size_t)recv_buffer_size;
142 xt_mpi_call(MPI_Allgatherv(send_buffer, send_buffer_size, MPI_PACKED,
143 recv_buffer, pack_sizes, displ, MPI_PACKED,
146 size_t dst_isect_count = 0, src_isect_count = 0;
147 int large_list_seen = 0;
149 for (
int i = 0; i < comm_size; ++i) {
154 if (is_inter || i !=
rank) {
156 pack_sizes[i], &position, comm);
158 pack_sizes[i], &position, comm);
160 src = src_idxlist_local;
161 dst = dst_idxlist_local;
169 dsti[dst_isect_count].
list = intersect;
170 dsti[dst_isect_count].
rank = i;
179 srci[src_isect_count].
list = intersect;
180 srci[src_isect_count].
rank = i;
185 if (is_inter || i !=
rank) {
191 *stripify = large_list_seen;
197 *num_src_intersections = src_isect_count;
198 srci =
xrealloc(srci, src_isect_count *
sizeof (**src_intersections));
199 *src_intersections = srci;
201 *num_dst_intersections = dst_isect_count;
202 dsti =
xrealloc(dsti, dst_isect_count *
sizeof (**dst_intersections));
203 *dst_intersections = dsti;
207 INSTR_DEF(t_xt_xmap_all2all_new,
"xt_xmap_all2all_new")
216 struct Xt_com_list * src_intersections = NULL, * dst_intersections = NULL;
217 size_t num_src_intersections, num_dst_intersections;
222 &dst_intersections, &num_dst_intersections,
223 &stripify, src_idxlist, dst_idxlist, newcomm);
225 Xt_xmap (*xmap_new)(
int num_src_intersections,
227 int num_dst_intersections,
233 Xt_xmap xmap = xmap_new((
int)num_src_intersections, src_intersections,
234 (
int)num_dst_intersections, dst_intersections,
235 src_idxlist, dst_idxlist, newcomm);
238 for (
size_t i = 0; i < num_src_intersections; ++i)
239 if (src_intersections[i].
list != NULL)
241 for (
size_t i = 0; i < num_dst_intersections; ++i)
242 if (dst_intersections[i].
list != NULL)
244 free(src_intersections);
245 free(dst_intersections);
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
struct Xt_xmap_ * Xt_xmap
int xt_idxlist_get_num_indices(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
void xt_idxlist_pack(Xt_idxlist idxlist, void *buffer, int buffer_size, int *position, MPI_Comm comm)
size_t xt_idxlist_get_pack_size(Xt_idxlist idxlist, MPI_Comm comm)
Xt_idxlist xt_idxlist_get_intersection(Xt_idxlist idxlist_src, Xt_idxlist idxlist_dst)
void xt_idxlist_delete(Xt_idxlist idxlist)
Provide non-public declarations common to all index lists.
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
#define xt_mpi_call(call, comm)
exchange map declarations
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
static void exchange_idxlists(struct Xt_com_list **src_intersections, size_t *num_src_intersections, struct Xt_com_list **dst_intersections, size_t *num_dst_intersections, int *stripify, Xt_idxlist src_idxlist_local, Xt_idxlist dst_idxlist_local, MPI_Comm comm)
Xt_xmap xt_xmap_intersection_ext_new(int num_src_intersections, const struct Xt_com_list src_com[num_src_intersections], int num_dst_intersections, const struct Xt_com_list dst_com[num_dst_intersections], Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)
Xt_xmap xt_xmap_intersection_new(int num_src_intersections, const struct Xt_com_list src_com[num_src_intersections], int num_dst_intersections, const struct Xt_com_list dst_com[num_dst_intersections], Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)