From 8404a6f5a2ae195404efc723d80fe6073476850b Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 25 Sep 2018 19:15:55 +0200 Subject: [PATCH] Add Partitioner class - Relies on ParMETIS - Start testing/playing with it --- src/utils/CMakeLists.txt | 1 + src/utils/Partitioner.cpp | 78 +++++++++++++++++++++++++++++++++++++++ src/utils/Partitioner.hpp | 13 +++++++ src/utils/PastisUtils.cpp | 5 +++ 4 files changed, 97 insertions(+) create mode 100644 src/utils/Partitioner.cpp create mode 100644 src/utils/Partitioner.hpp diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index d21584923..e4596de3d 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -10,6 +10,7 @@ add_library( ConsoleManager.cpp FPEManager.cpp Messenger.cpp + Partitioner.cpp PastisOStream.cpp PastisUtils.cpp RevisionInfo.cpp diff --git a/src/utils/Partitioner.cpp b/src/utils/Partitioner.cpp new file mode 100644 index 000000000..f5e0c945b --- /dev/null +++ b/src/utils/Partitioner.cpp @@ -0,0 +1,78 @@ +#include <Partitioner.hpp> +#include <Messenger.hpp> + +#include <parmetis.h> +#include <vector> + +Partitioner:: +Partitioner() +{ + std::cout << commRank() << " / " << commSize() << '\n' << std::flush; + + MPI_Barrier(MPI_COMM_WORLD); + if (commSize() != 3) { + Messenger::destroy(); + std::cerr << "Commsize=" << commSize() << ". Need 3 PE to test"; + std::exit(1); + } + + idx_t wgtflag = 0; + idx_t numflag = 0; + idx_t ncon = 1; + idx_t npart= 3; + real_t wgts = 1./npart; + std::vector<real_t> tpwgts{wgts, wgts, wgts}; + std::vector<real_t> ubvec{1.05}; + std::vector<idx_t> options{0,0,0}; + idx_t edgecut = 0; + std::vector<idx_t> part(5); + + MPI_Comm mpi_comm_; + MPI_Comm_dup(MPI_COMM_WORLD, &mpi_comm_); + MPI_Comm* mpi_comm = & mpi_comm_; + switch (commRank()) { + case 0: { + std::vector<idx_t> xadj {0,2,5,8,11,13}; + std::vector<idx_t> adjncy {1,5,0,2,6,1,3,7,2,4,8,3,9}; + std::vector<idx_t> vtxdist{0,5,10,15}; + + ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]), + NULL, NULL, &wgtflag, &numflag, + &ncon, &npart, &(tpwgts[0]), &(ubvec[0]), + &(options[0]), &edgecut, &(part[0]), mpi_comm); + break; + } + case 1: { + std::vector<idx_t> xadj {0,3,7,11,15,18}; + std::vector<idx_t> adjncy {0,6,10,1,5,7,11,2,6,8,12,3,7,9,13,4,8,14}; + std::vector<idx_t> vtxdist{0,5,10,15}; + + ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]), + NULL, NULL, &wgtflag, &numflag, + &ncon, &npart, &(tpwgts[0]), &(ubvec[0]), + &(options[0]), &edgecut, &(part[0]), mpi_comm); + break; + } + case 2: { + std::vector<idx_t> xadj {0,2,5,8,11,13}; + std::vector<idx_t> adjncy {5,11,6,10,12,7,11,13,8,12,14,9,13}; + std::vector<idx_t> vtxdist{0,5,10,15}; + + ParMETIS_V3_PartKway(&(vtxdist[0]), &(xadj[0]), &(adjncy[0]), + NULL, NULL, &wgtflag, &numflag, + &ncon, &npart, &(tpwgts[0]), &(ubvec[0]), + &(options[0]), &edgecut, &(part[0]), mpi_comm); + break; + } + default: { + std::cerr << "unexpected rank " << commRank() << "!\n"; + std::exit(0); + } + } + + std::cerr << commRank() << " FINISHED\n"; + MPI_Barrier(MPI_COMM_WORLD); + + Messenger::destroy(); + std::exit(0); +} diff --git a/src/utils/Partitioner.hpp b/src/utils/Partitioner.hpp new file mode 100644 index 000000000..88e3e2672 --- /dev/null +++ b/src/utils/Partitioner.hpp @@ -0,0 +1,13 @@ +#ifndef PARTITIONER_HPP +#define PARTITIONER_HPP + +class Partitioner +{ + public: + Partitioner(); + Partitioner(const Partitioner&) = default; + ~Partitioner() = default; +}; + + +#endif // PARTITIONER_HPP diff --git a/src/utils/PastisUtils.cpp b/src/utils/PastisUtils.cpp index 66aa50b49..ab6271606 100644 --- a/src/utils/PastisUtils.cpp +++ b/src/utils/PastisUtils.cpp @@ -16,10 +16,15 @@ #include <CLI/CLI.hpp> +#include <Partitioner.hpp> + std::string initialize(int& argc, char* argv[]) { Messenger::create(argc, argv); + + Partitioner P; + long unsigned number = 10; std::string filename; -- GitLab