31 int const * transfer_pos,
size_t num_transfer_pos) {
34 int * blocklengths =
xmalloc(num_transfer_pos *
sizeof(*blocklengths));
35 int * displacements =
xmalloc(num_transfer_pos *
sizeof(*displacements));
37 int prev_transfer_pos = transfer_pos[0];
38 for (
size_t i = 0; i < num_transfer_pos; ++i) {
39 int curr_transfer_pos = transfer_pos[i];
40 if (curr_transfer_pos != prev_transfer_pos + 1) {
41 blocklengths[
count] = 1;
42 displacements[
count] = curr_transfer_pos;
45 "ERROR(parse_transfer_pos): number of elements exceeds INT_MAX");
48 blocklengths[
count-1]++;
50 prev_transfer_pos = curr_transfer_pos;
56 .array_of_blocklengths =
57 xrealloc(blocklengths, (
size_t)
count *
sizeof(*blocklengths)),
58 .array_of_displacements =
59 xrealloc(displacements, (
size_t)
count *
sizeof(*displacements)),
69 size_t * sendcounts, * recvcounts, * sdispls, * rdispls;
71 1, &sendcounts, &recvcounts, &sdispls, &rdispls, comm);
73 for (
size_t i = 0; i <
count; ++i) {
75 (point_infos[i].
count > 1)?
76 (point_infos[i].
data.multi):
78 sendcounts[curr_info->
rank]++;
82 1, sendcounts, recvcounts, sdispls, rdispls, comm);
83 size_t num_src_msg = 0, num_dst_msg = 0;
84 for (
int i = 0; i < comm_size; ++i) {
85 num_src_msg += (recvcounts[i] > 0);
86 num_dst_msg += (sendcounts[i] > 0);
90 rdispls[comm_size-1] + recvcounts[comm_size-1];
93 xmalloc((recv_count + 2 * count) *
sizeof(*pos_buffer));
94 int * src_pos_buffer = pos_buffer;
95 int * dst_pos_buffer = pos_buffer + recv_count;
96 int * send_pos_buffer = pos_buffer + recv_count + count;
99 for (
size_t i = 0; i < count; ++i) {
101 (point_infos[i].
count > 1)?
102 (point_infos[i].
data.multi):
104 size_t pos = sdispls[curr_info->
rank+1]++;
105 dst_pos_buffer[pos] = i;
106 send_pos_buffer[pos] = (int)(curr_info->
orig_pos);
110 yac_alltoallv_int_p2p(
111 send_pos_buffer, sendcounts, sdispls,
112 src_pos_buffer, recvcounts, rdispls, comm,
113 "yac_xmap_from_point_infos", __LINE__);
118 ((
size_t)(num_src_msg + num_dst_msg)) *
sizeof(xmap->
msgs[0]));
129 for (
int i = 0; i < comm_size; ++i) {
130 if (recvcounts[i] > 0) {
131 send_msgs[num_src_msg] =
133 send_msgs[num_src_msg].
rank = i;
134 src_pos_buffer += recvcounts[i];
137 if (sendcounts[i] > 0) {
138 recv_msgs[num_dst_msg] =
140 recv_msgs[num_dst_msg].
rank = i;
141 dst_pos_buffer += sendcounts[i];
165 struct Xt_redist_msg * msgs_buffer =
166 xmalloc(total_num_msg *
sizeof(*msgs_buffer));
168 for (
size_t i = 0; i < total_num_msg; ++i) {
170 MPI_Datatype msg_datatype;
177 xt_mpi_call(MPI_Type_commit(&msg_datatype), xmap->
comm);
179 msgs_buffer[i].rank = xmap->
msgs[i].
rank;
180 msgs_buffer[i].datatype = msg_datatype;
183 Xt_config redist_config = xt_config_new();
186 xt_redist_single_array_base_custom_new(
190 xt_config_delete(redist_config);
void yac_generate_alltoallv_args(int count, size_t const *sendcounts, size_t *recvcounts, size_t *sdispls, size_t *rdispls, MPI_Comm comm)
void yac_get_comm_buffers(int count, size_t **sendcounts, size_t **recvcounts, size_t **sdispls, size_t **rdispls, MPI_Comm comm)