Add an interface struct for distributions
This commit is contained in:
parent
65f804e637
commit
a03ed439f2
54
atrip.org
54
atrip.org
@ -1430,6 +1430,24 @@ using ABCTuples = std::vector<ABCTuple>;
|
|||||||
constexpr ABCTuple FAKE_TUPLE = {0, 0, 0};
|
constexpr ABCTuple FAKE_TUPLE = {0, 0, 0};
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Distributing the tuples
|
||||||
|
|
||||||
|
In general it is our task to distribute all the tuples
|
||||||
|
\( (a,b,c) \) among the ranks. Every distribution should
|
||||||
|
make sure to allocate the same amount of tuples to every rank,
|
||||||
|
padding the list with =FAKE_TUPLE= elements as necessary.
|
||||||
|
|
||||||
|
The interface that we propose for this is simplye
|
||||||
|
|
||||||
|
#+begin_src c++ :tangle (atrip-tuples-h)
|
||||||
|
struct TuplesDistribution {
|
||||||
|
virtual ABCTuples getTuples(size_t Nv, MPI_Comm universe) = 0;
|
||||||
|
virtual bool tupleIsFake(ABCTuple const& t) { return t == FAKE_TUPLE; }
|
||||||
|
};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*** Naive list
|
*** Naive list
|
||||||
|
|
||||||
The naive implementation of the global tuples list is simple
|
The naive implementation of the global tuples list is simple
|
||||||
@ -1500,6 +1518,28 @@ getABCRange(size_t np, size_t rank, ABCTuples const& tuplesList) {
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
With these two last functions we can easily define a tuple distribution like
|
||||||
|
|
||||||
|
#+begin_src c++ :tangle (atrip-tuples-h)
|
||||||
|
struct NaiveDistribution : public TuplesDistribution {
|
||||||
|
ABCTuples getTuples(size_t Nv, MPI_Comm universe) override {
|
||||||
|
int rank, np;
|
||||||
|
MPI_Comm_rank(universe, &rank);
|
||||||
|
MPI_Comm_size(universe, &np);
|
||||||
|
auto const all = getTuplesList(Nv);
|
||||||
|
auto const range = getABCRange((size_t)np, (size_t)rank, all);
|
||||||
|
std::vector<ABCTuple> result(range.second - range.first, FAKE_TUPLE);
|
||||||
|
std::copy(all.begin() + range.first,
|
||||||
|
range.second >= all.size()
|
||||||
|
? all.end()
|
||||||
|
: all.begin() + range.first + range.second,
|
||||||
|
result.begin());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
*** Group and sort list
|
*** Group and sort list
|
||||||
|
|
||||||
**** Prolog :noexport:
|
**** Prolog :noexport:
|
||||||
@ -1986,10 +2026,22 @@ inserting fake tuples where needed
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
**** Interface
|
||||||
|
|
||||||
|
The distribution interface will then simply be
|
||||||
|
|
||||||
|
#+begin_src c++ :tangle (atrip-tuples-h)
|
||||||
|
struct Distribution : public TuplesDistribution {
|
||||||
|
ABCTuples getTuples(size_t Nv, MPI_Comm universe) override {
|
||||||
|
return main(universe, Nv);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
**** Epilog :noexport:
|
**** Epilog :noexport:
|
||||||
#+begin_src c++ :tangle (atrip-tuples-h)
|
#+begin_src c++ :tangle (atrip-tuples-h)
|
||||||
}
|
} // namespace group_and_sort
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,13 @@ using ABCTuples = std::vector<ABCTuple>;
|
|||||||
constexpr ABCTuple FAKE_TUPLE = {0, 0, 0};
|
constexpr ABCTuple FAKE_TUPLE = {0, 0, 0};
|
||||||
// Tuples types:1 ends here
|
// Tuples types:1 ends here
|
||||||
|
|
||||||
|
// [[file:../../atrip.org::*Distributing the tuples][Distributing the tuples:1]]
|
||||||
|
struct TuplesDistribution {
|
||||||
|
virtual ABCTuples getTuples(size_t Nv, MPI_Comm universe) = 0;
|
||||||
|
virtual bool tupleIsFake(ABCTuple const& t) { return t == FAKE_TUPLE; }
|
||||||
|
};
|
||||||
|
// Distributing the tuples:1 ends here
|
||||||
|
|
||||||
// [[file:../../atrip.org::*Naive list][Naive list:1]]
|
// [[file:../../atrip.org::*Naive list][Naive list:1]]
|
||||||
ABCTuples getTuplesList(size_t Nv) {
|
ABCTuples getTuplesList(size_t Nv) {
|
||||||
const size_t n = Nv * (Nv + 1) * (Nv + 2) / 6 - Nv;
|
const size_t n = Nv * (Nv + 1) * (Nv + 2) / 6 - Nv;
|
||||||
@ -78,6 +85,25 @@ getABCRange(size_t np, size_t rank, ABCTuples const& tuplesList) {
|
|||||||
}
|
}
|
||||||
// Naive list:2 ends here
|
// Naive list:2 ends here
|
||||||
|
|
||||||
|
// [[file:../../atrip.org::*Naive list][Naive list:3]]
|
||||||
|
struct NaiveDistribution : public TuplesDistribution {
|
||||||
|
ABCTuples getTuples(size_t Nv, MPI_Comm universe) override {
|
||||||
|
int rank, np;
|
||||||
|
MPI_Comm_rank(universe, &rank);
|
||||||
|
MPI_Comm_size(universe, &np);
|
||||||
|
auto const all = getTuplesList(Nv);
|
||||||
|
auto const range = getABCRange((size_t)np, (size_t)rank, all);
|
||||||
|
std::vector<ABCTuple> result(range.second - range.first, FAKE_TUPLE);
|
||||||
|
std::copy(all.begin() + range.first,
|
||||||
|
range.second >= all.size()
|
||||||
|
? all.end()
|
||||||
|
: all.begin() + range.first + range.second,
|
||||||
|
result.begin());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Naive list:3 ends here
|
||||||
|
|
||||||
// [[file:../../atrip.org::*Prolog][Prolog:1]]
|
// [[file:../../atrip.org::*Prolog][Prolog:1]]
|
||||||
namespace group_and_sort {
|
namespace group_and_sort {
|
||||||
// Prolog:1 ends here
|
// Prolog:1 ends here
|
||||||
@ -467,8 +493,16 @@ result.insert(result.end(),
|
|||||||
}
|
}
|
||||||
// Main:5 ends here
|
// Main:5 ends here
|
||||||
|
|
||||||
|
// [[file:../../atrip.org::*Interface][Interface:1]]
|
||||||
|
struct Distribution : public TuplesDistribution {
|
||||||
|
ABCTuples getTuples(size_t Nv, MPI_Comm universe) override {
|
||||||
|
return main(universe, Nv);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Interface:1 ends here
|
||||||
|
|
||||||
// [[file:../../atrip.org::*Epilog][Epilog:1]]
|
// [[file:../../atrip.org::*Epilog][Epilog:1]]
|
||||||
}
|
} // namespace group_and_sort
|
||||||
// Epilog:1 ends here
|
// Epilog:1 ends here
|
||||||
|
|
||||||
// [[file:../../atrip.org::*Epilog][Epilog:1]]
|
// [[file:../../atrip.org::*Epilog][Epilog:1]]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user