54_callMetisWith2Processors(
const Int32 ncon,
const bool need_part,
56 MetisCall& metis_call)
58 Int32 nb_rank = m_parallel_mng->commSize();
59 Int32 my_rank = m_parallel_mng->commRank();
63 int comm_0_size = nb_rank / 2 + nb_rank % 2;
64 int comm_1_size = nb_rank / 2;
65 int comm_0_io_rank = 0;
66 int comm_1_io_rank = comm_0_size;
68 for (
int i = 0; i < nb_rank + 1; ++i) {
69 half_vtxdist[i] = vtxdist[i];
75 if (my_rank >= comm_0_size) {
77 for (
int i = 0; i < comm_1_size + 1; ++i) {
78 half_vtxdist[i] = vtxdist[i + comm_0_size] - vtxdist[comm_0_size];
86 metis_gather.
gatherGraph(need_part, half_vtxdist, ncon, my_graph, metis_graph);
89 if (my_rank == comm_0_io_rank || my_rank == comm_1_io_rank) {
97 metis_vtxdist[1] = vtxdist[comm_0_size];
98 metis_vtxdist[2] = vtxdist[vtxdist.
size() - 1];
102 if (metis_pm.
get()) {
104 ierr = metis_call(metis_pm.
get(), metis_graph_view, metis_vtxdist);
110 metis_gather.
scatterPart(half_vtxdist, metis_graph.part, my_graph.part);
119callPartKway(
const bool print_digest,
const bool gather,
120 idx_t* vtxdist, idx_t* xadj, idx_t* adjncy, idx_t* vwgt,
121 idx_t* adjwgt, idx_t* wgtflag, idx_t* numflag, idx_t* ncon, idx_t* nparts,
122 real_t* tpwgts, real_t* ubvec, idx_t* options, idx_t* edgecut, idx_t* part)
125 Int32 nb_rank = m_parallel_mng->commSize();
126 Int32 my_rank = m_parallel_mng->commRank();
130 MPI_Comm graph_comm =
static_cast<MPI_Comm
>(pm->
communicator());
137 idx_t* adjncy_data = graph.adjncy.data();
138 idx_t* adjwgt_data = graph.adjwgt.data();
140 adjncy_data = &null_idx;
142 adjwgt_data = &null_idx;
143 return ParMETIS_V3_PartKway(graph_vtxdist.data(), graph.xadj.data(),
144 adjncy_data, graph.vwgt.data(),
145 adjwgt_data, wgtflag, numflag, ncon, nparts, tpwgts,
146 ubvec, options, edgecut, graph.part.data(), &graph_comm);
154 idx_t options2[METIS_NOPTIONS];
155 METIS_SetDefaultOptions(options2);
156 options2[METIS_OPTION_CTYPE] = METIS_CTYPE_SHEM;
157 options2[METIS_OPTION_UFACTOR] = 30;
158 options2[METIS_OPTION_NUMBERING] = 0;
159 options2[METIS_OPTION_MINCONN] = 0;
160 options2[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_VOL;
161 options2[METIS_OPTION_SEED] = 25;
162 pwarning() <<
"MetisWrapper: using user 'imbalance_factor' is not yet implemented. Using defaut value 30";
165 idx_t nvtxs = graph_vtxdist[1];
166 return METIS_PartGraphKway(&nvtxs , ncon, graph.xadj.data(),
167 graph.adjncy.data(), graph.vwgt.data(), graph.vsize.data(),
168 graph.adjwgt.data(), nparts, tpwgts,
169 ubvec, options2, edgecut, graph.part.data());
175 my_graph.nb_vertices = CheckedConvert::toInt32(offset[my_rank + 1] - offset[my_rank]);
177 const Int32 adjacency_size = CheckedConvert::toInt32(my_graph.xadj[my_graph.nb_vertices]);
178 const Int32 nb_con = CheckedConvert::toInt32(*ncon);
180 my_graph.vwgt =
ArrayView<idx_t>(CheckedConvert::multiply(my_graph.nb_vertices, nb_con), vwgt);
183 my_graph.have_vsize =
false;
184 my_graph.have_adjwgt =
true;
189 ncon, nparts, tpwgts, ubvec,
nullptr, options);
191 info() <<
"Metis input signature = " << digest;
195 if (gather && nb_rank > 2) {
197 info() <<
"Partitioning metis: re-grouping " << nb_rank <<
" -> 2 ranks";
201 info() <<
"Partitioning metis: nb ranks = " << nb_rank;
202 MetisCall& metis_call = (nb_rank == 1) ? partkway_seq : partkway;
203 ierr = metis_call(m_parallel_mng, my_graph, offset);
206 info() <<
"End Partitioning metis";
211 info() <<
"hash for Metis output = " << digest;
222callAdaptiveRepart(
const bool print_digest,
const bool gather,
223 idx_t* vtxdist, idx_t* xadj, idx_t* adjncy, idx_t* vwgt,
224 idx_t* vsize, idx_t* adjwgt, idx_t* wgtflag, idx_t* numflag, idx_t* ncon,
225 idx_t* nparts, real_t* tpwgts, real_t* ubvec, real_t* ipc2redist,
226 idx_t* options, idx_t* edgecut, idx_t* part)
229 Int32 nb_rank = m_parallel_mng->commSize();
230 Int32 my_rank = m_parallel_mng->commRank();
234 MPI_Comm graph_comm =
static_cast<MPI_Comm
>(pm->
communicator());
235 return ParMETIS_V3_AdaptiveRepart(graph_vtxdist.data(), graph.xadj.data(),
236 graph.adjncy.data(), graph.vwgt.data(),
237 graph.vsize.data(), graph.adjwgt.data(),
238 wgtflag, numflag, ncon, nparts, tpwgts, ubvec,
239 ipc2redist, options, edgecut,
240 graph.part.data(), &graph_comm);
248 idx_t options2[METIS_NOPTIONS];
249 METIS_SetDefaultOptions(options2);
250 options2[METIS_OPTION_CTYPE] = METIS_CTYPE_SHEM;
251 options2[METIS_OPTION_UFACTOR] = 30;
252 options2[METIS_OPTION_NUMBERING] = 0;
253 options2[METIS_OPTION_MINCONN] = 0;
254 options2[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_VOL;
255 options2[METIS_OPTION_SEED] = 25;
256 pwarning() <<
"MetisWrapper: using user 'imbalance_factor' is not yet implemented. Using defaut value 30";
258 idx_t nvtxs = graph_vtxdist[1];
259 return METIS_PartGraphKway(&nvtxs , ncon, graph.xadj.data(),
260 graph.adjncy.data(), graph.vwgt.data(), graph.vsize.data(),
261 graph.adjwgt.data(), nparts, tpwgts,
262 ubvec, options2, edgecut, graph.part.data());
268 my_graph.nb_vertices = CheckedConvert::toInt32(offset[my_rank + 1] - offset[my_rank]);
270 const Int32 adjacency_size = CheckedConvert::toInt32(my_graph.xadj[my_graph.nb_vertices]);
271 const Int32 nb_con = CheckedConvert::toInt32(*ncon);
273 my_graph.vwgt =
ArrayView<idx_t>(CheckedConvert::multiply(my_graph.nb_vertices, nb_con), vwgt);
277 my_graph.have_vsize =
true;
278 my_graph.have_adjwgt =
true;
283 ncon, nparts, tpwgts, ubvec,
nullptr, options);
285 info() <<
"Metis input signature = " << digest;
289 if (gather && nb_rank > 2) {
290 info() <<
"Metis partitioning: regrouping " << nb_rank <<
" -> 2 processors";
294 info() <<
"Metis partitioning: nb processors = " << nb_rank;
295 MetisCall& metis_call = (nb_rank == 1) ? repart_seq_func : repart_func;
296 ierr = metis_call(m_parallel_mng, my_graph, offset);
303 info() <<
"Metis output signature = " << digest;
String computeInputDigest(const bool need_part, const int nb_options, const MetisGraphView &my_graph, const idx_t *vtxdist, const idx_t *wgtflag, const idx_t *numflag, const idx_t *ncon, const idx_t *nparts, const real_t *tpwgts, const real_t *ubvec, const real_t *ipc2redist, const idx_t *options)