From e17ef06f04cc28c99366a872299039c85e87f2a6 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 9 Oct 2018 16:19:13 +0200 Subject: [PATCH] Progress in mesh dispatching Replace broadcast by exchange of pertinent cell ids --- src/mesh/GmshReader.cpp | 118 +++++++++++----------------------------- 1 file changed, 32 insertions(+), 86 deletions(-) diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index 483e98c8e..c258855f3 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -159,11 +159,9 @@ void GmshReader::_dispatch() CSRGraph mesh_graph = mesh.cellToCellGraph(); - CellValue<int> cell_parts(mesh.connectivity()); - const int reader_rank = [&]() { - Array<int> parts = allGather(static_cast<int>(cell_parts.size())); + Array<int> parts = allGather(static_cast<int>(mesh.numberOfCells())); std::set<int> part_set; for (size_t i=0; i<parts.size(); ++i) { if (parts[i] != 0) { part_set.insert(i); } @@ -179,108 +177,56 @@ void GmshReader::_dispatch() Partitioner P; Array<int> cell_new_owner = P.partition(mesh_graph); + const std::vector<Array<const int>> cell_to_send_by_proc + = [&] () { + std::vector<std::vector<int>> cell_vector_to_send_by_proc(commSize()); + for (size_t i=0; i<cell_new_owner.size(); ++i) { + cell_vector_to_send_by_proc[cell_new_owner[i]].push_back(i); + } + + std::vector<Array<const int>> cell_to_send_by_proc(commSize()); + for (size_t i=0; i<commSize(); ++i) { + cell_to_send_by_proc[i] = convert_to_array(cell_vector_to_send_by_proc[i]); + } + + return std::move(cell_to_send_by_proc); + } (); + + Array<int> nb_cell_to_send_by_proc(commSize()); - for (size_t i=0; i<cell_new_owner.size(); ++i) { - nb_cell_to_send_by_proc[cell_new_owner[i]]++; + for (size_t i=0; i<commSize(); ++i) { + nb_cell_to_send_by_proc[i] = cell_to_send_by_proc[i].size(); } - // for (int i_rank=0; i_rank<commSize(); ++i_rank) { - // if (commRank() == i_rank) { - // for (size_t i_recv=0; i_recv<commSize(); ++i_recv) { - // std::cout << commRank() - // << " gives " << nb_cell_to_send_by_proc[i_recv] - // << " cells to " << i_recv << '\n' << std::flush; - // } - // } - // barrier(); - // } Array<int> nb_cell_to_recv_by_proc = allToAll(nb_cell_to_send_by_proc); - // for (int i_rank=0; i_rank<commSize(); ++i_rank) { - // if (commRank() == i_rank) { - // for (size_t i_send=0; i_send<commSize(); ++i_send) { - // std::cout << commRank() - // << " recv " << nb_cell_to_recv_by_proc[i_send] - // << " cells of " << i_send << '\n'; - // } - // } - // barrier(); - // } const size_t cell_number = mesh.numberOfCells(); const size_t new_cell_number = cell_number + Sum(nb_cell_to_recv_by_proc) - Sum(nb_cell_to_send_by_proc); - std::cout << commRank() << ": " << cell_number << " -> " << new_cell_number << " cells\n"; - - // now share owner table - cell_new_owner = broadcast(cell_new_owner, reader_rank); - - Array<int> cell_new_owner_nb_cell(commSize()); - cell_new_owner_nb_cell.fill(0); - for (size_t i=0; i<cell_new_owner.size(); ++i) { - cell_new_owner_nb_cell[cell_new_owner[i]]++; + std::vector<Array<int>> recv_cell_by_proc(commSize()); + for (size_t i=0; i<commSize(); ++i) { + recv_cell_by_proc[i] = Array<int>(nb_cell_to_recv_by_proc[i]); } + exchange(cell_to_send_by_proc, recv_cell_by_proc); - Array<int> node_new_owner(mesh.numberOfNodes()); - if (commRank() == reader_rank) { - const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); - parallel_for(mesh.numberOfNodes(), PASTIS_LAMBDA(const NodeId& r) { - const auto& node_cells = node_to_cell_matrix[r]; - int new_owner = cell_new_owner[node_cells[0]]; - for (size_t j=1; j<node_cells.size(); ++j) { - const int cell_owner = cell_new_owner[node_cells[j]]; - if (new_owner < cell_owner) { - new_owner = cell_owner; - } - } - node_new_owner[r] = new_owner; - }); - } + Array<int> new_cell_id(new_cell_number); - node_new_owner = broadcast(node_new_owner, reader_rank); - - for (int i_rank=0; i_rank<commSize(); ++i_rank) { - if (commRank() == i_rank) { - std::cout << i_rank << " cells -> "; - for (size_t i=0; i<cell_new_owner.size(); ++i) { - if (commRank() == cell_new_owner[i]) { - std::cout << i << ' '; - } - } - std::cout << " [" << cell_new_owner_nb_cell[i_rank] << "]\n" << std::flush; - } - // barrier(); - } - - for (int i_rank=0; i_rank<commSize(); ++i_rank) { + for (int i_rank=0; i_rank < commSize(); ++i_rank) { if (commRank() == i_rank) { - size_t cpt=0; - std::cout << i_rank << " nodes -> "; - for (size_t i=0; i<node_new_owner.size(); ++i) { - if (commRank() == node_new_owner[i]) { - std::cout << i << ' '; - cpt++; + std::cout << "----- rank=" << i_rank << " -----\n"; + for (int j_rank=0; j_rank < commSize(); ++j_rank) { + std::cout << "recv from " << j_rank << ':'; + for (size_t i=0; i<recv_cell_by_proc[j_rank].size(); ++i) { + std::cout << ' ' << recv_cell_by_proc[j_rank][i]; } + std::cout << '\n' << std::flush; } - std::cout << " [" << cpt << "]\n" << std::flush; - } - // barrier(); - } - - for (int i_rank=0; i_rank<commSize(); ++i_rank) { - if (commRank() == i_rank) { - const auto cell_type - = mesh.connectivity().cellType(); - std::cout << i_rank << " cell_type -> "; - for (CellId j=0; j<cell_type.size(); ++j) { - std::cout << static_cast<int>(cell_type[j]) << ' '; - } - std::cout << '\n'; } - // barrier(); + barrier(); } Messenger::destroy(); -- GitLab