69void MetisGraphGather::
73 MPI_Comm comm = _getMPICommunicator(m_parallel_mng);
74 info() <<
"Metis: gather graph";
76 const Int32 io_rank = m_parallel_mng->masterIORank();
77 const Int32 nb_rank = m_nb_rank;
78 const bool is_master_io = m_parallel_mng->isMasterIO();
87 if (m_my_rank == io_rank) {
88 graph.nb_vertices = CheckedConvert::toInt32(vtxdist[m_nb_rank]);
89 graph.have_vsize = my_graph.have_vsize;
90 graph.have_adjwgt = my_graph.have_adjwgt;
93 graph.nb_vertices = 0;
94 graph.have_vsize =
false;
95 graph.have_adjwgt =
false;
101 if (m_my_rank == io_rank) {
103 buffer.
resize(2 * nb_rank);
106 my_buffer[0] = my_graph.nb_vertices;
107 my_buffer[1] = my_graph.adjncy.
size();
109 MPI_Gather((
void*)my_buffer.
data(), 2, MPI_INT, (
void*)buffer.
data(), 2, MPI_INT, io_rank, comm);
116 for (
int rank = 0; rank < nb_rank; ++rank) {
117 nb_vertices_per_rank[rank] = buffer[2 * rank];
118 adjncy_size_per_rank[rank] = buffer[2 * rank + 1];
119 nb_vertice_cons_per_rank[rank] = nb_vertices_per_rank[rank] * ncon;
120 adjcny_size += adjncy_size_per_rank[rank];
126 int max_buffer_size = my_graph.nb_vertices * ncon;
127 max_buffer_size = std::max(my_graph.adjncy.
size(), max_buffer_size);
128 my_buffer.
resize(max_buffer_size);
130 max_buffer_size = graph.nb_vertices * ncon;
131 max_buffer_size = std::max(adjcny_size, max_buffer_size);
132 buffer.
resize(max_buffer_size);
139 for (
int rank = 1; rank < nb_rank; ++rank) {
140 offset[rank] = offset[rank - 1] + adjncy_size_per_rank[rank - 1];
142 graph.adjncy.
resize(adjcny_size);
145 _convertVector(my_graph.adjncy.
size(), my_graph.adjncy.
constView(), my_buffer.
view());
147 MPI_Gatherv(my_buffer.
data(), my_graph.adjncy.
size(), MPI_INT,
148 buffer.
data(), adjncy_size_per_rank.
data(),
149 offset.
data(), MPI_INT, io_rank, comm);
151 _convertVector(adjcny_size, buffer.
constView(), graph.adjncy.
view());
155 if (my_graph.have_adjwgt) {
157 graph.adjwgt.
resize(adjcny_size);
160 _convertVector(my_graph.adjwgt.
size(), my_graph.adjwgt.
constView(), my_buffer.
view());
162 MPI_Gatherv(my_buffer.
data(), my_graph.adjwgt.
size(), MPI_INT,
163 buffer.
data(), adjncy_size_per_rank.
data(),
164 offset.
data(), MPI_INT, io_rank, comm);
166 _convertVector(adjcny_size, buffer.
constView(), graph.adjwgt.
view());
175 graph.xadj.
resize(graph.nb_vertices + 1);
176 graph.xadj[graph.nb_vertices] = graph.adjncy.
size();
178 for (
int rank = 1; rank < nb_rank; ++rank) {
179 offset[rank] = offset[rank - 1] + nb_vertices_per_rank[rank - 1];
183 _convertVector(my_graph.nb_vertices, my_graph.xadj.
constView(), my_buffer.
view());
185 MPI_Gatherv(my_buffer.
data(), my_graph.nb_vertices, MPI_INT,
186 buffer.
data(), nb_vertices_per_rank.
data(),
187 offset.
data(), MPI_INT, io_rank, comm);
189 _convertVector(graph.nb_vertices, buffer.
constView(), graph.xadj.
view());
194 int start_adjncy_index = 0;
195 for (
int rank = 1; rank < nb_rank; ++rank) {
196 start_adjncy_index += adjncy_size_per_rank[rank - 1];
198 Int32 vtxdist_rank = CheckedConvert::toInt32(vtxdist[rank]);
199 Int32 vtxdist_rank_plus_one = CheckedConvert::toInt32(vtxdist[rank + 1]);
200 for (
Int32 ixadj = vtxdist_rank; ixadj < vtxdist_rank_plus_one; ++ixadj) {
201 graph.xadj[ixadj] += start_adjncy_index;
208 if (my_graph.have_vsize) {
210 graph.vsize.
resize(graph.nb_vertices);
213 _convertVector(my_graph.nb_vertices, my_graph.vsize.
constView(), my_buffer.
view());
215 MPI_Gatherv(my_buffer.
data(), my_graph.nb_vertices, MPI_INT,
216 buffer.
data(), nb_vertices_per_rank.
data(),
217 offset.
data(), MPI_INT, io_rank, comm);
219 _convertVector(graph.nb_vertices, buffer.
constView(), graph.vsize.
view());
225 graph.part.
resize(graph.nb_vertices);
230 _convertVector(my_graph.nb_vertices, my_graph.part.
constView(), my_buffer.
view());
232 MPI_Gatherv(my_buffer.
data(), my_graph.nb_vertices, MPI_INT,
233 buffer.
data(), nb_vertices_per_rank.
data(),
234 offset.
data(), MPI_INT, io_rank, comm);
236 _convertVector(graph.nb_vertices, buffer.
constView(), graph.part.
view());
242 graph.vwgt.
resize(graph.nb_vertices * ncon);
243 for (
auto& x : offset) {
248 _convertVector(my_graph.nb_vertices * ncon, my_graph.vwgt.
constView(), my_buffer.
view());
250 MPI_Gatherv(my_buffer.
data(), my_graph.nb_vertices * ncon, MPI_INT,
251 buffer.
data(), nb_vertice_cons_per_rank.
data(),
252 offset.
data(), MPI_INT, io_rank, comm);
254 _convertVector(graph.nb_vertices * ncon, buffer.
constView(), graph.vwgt.
view());