29template <
class ParticleCell,
class Functor>
37 const double interactionLength,
const std::array<double, 3> &cellLength,
38 DataLayoutOption dataLayout,
bool useNewton3,
bool spaciallyForward)
40 useNewton3, spaciallyForward) {
57 std::vector<unsigned long> loads;
60 loads.resize(maxDimensionLength);
62 for (
auto x = 0; x < maxDimensionLength; x++) {
63 std::array<unsigned long, 3> lowerCorner = {0, 0, 0};
69 lowerCorner[maxDimension] = x;
70 upperCorner[maxDimension] = x;
73 "AutoPas internal error: SlicedBalancedBasedTraversal's _loadEstimator is null.");
78 for (
auto i = 1; i < loads.size(); i++) {
79 loads[i] += loads[i - 1];
81 auto fullLoad = loads.back();
82 auto loadEstimationTime = timer.
stop();
83 AutoPasLog(DEBUG,
"load estimation took {} nanoseconds", loadEstimationTime);
86 AutoPasLog(DEBUG,
"{} threads available.", numSlices);
88 unsigned int totalThickness = 0;
90 auto avg = fullLoad / numSlices;
92 for (
auto s = 0; s < numSlices; s++) {
93 unsigned int thickness;
94 if (s == numSlices - 1) {
95 thickness = maxDimensionLength - totalThickness;
97 thickness = minSliceThickness;
98 while (totalThickness + thickness + 1 < maxDimensionLength and
99 loads[totalThickness + thickness - 1] - lastLoad < avg) {
100 auto load1 = loads[totalThickness + thickness - 1] - lastLoad;
101 auto load2 = loads[totalThickness + thickness] - lastLoad;
104 if (((avg > load1) ? (avg - load1) : (load1 - avg)) < ((avg > load2) ? (avg - load2) : (load2 - avg))) {
110 if (totalThickness + thickness > maxDimensionLength || thickness < minSliceThickness) {
113 AutoPasLog(DEBUG,
"Balanced Sliced traversal only using {} threads because of greedy algorithm.", s);
118 totalThickness += thickness;
121 if (s != numSlices - 1) {
123 avg = (fullLoad - loads[totalThickness - 1]) / (numSlices - s - 1);
124 lastLoad = loads[totalThickness - 1];
128 std::string thicknessStr;
133 thicknessStr += std::to_string(t) +
", ";
135 loadStr += std::to_string(loads[totalThickness - 1] - lastLoad) +
", ";
136 lastLoad = loads[totalThickness - 1];
141 std::string thicknessStr;
146 thicknessStr += std::to_string(t) +
", ";
148 loadStr += std::to_string(loads[totalThickness - 1] - lastLoad) +
", ";
149 lastLoad = loads[totalThickness - 1];
153 AutoPasLog(DEBUG,
"Slice Thicknesses: [{}]", thicknessStr);
154 AutoPasLog(DEBUG,
"Slice loads: [{}]", loadStr);
#define AutoPasLog(lvl, fmt,...)
Macro for logging providing common meta information without filename.
Definition: Logger.h:24
#define AUTOPAS_OPENMP(args)
Empty macro to throw away any arguments.
Definition: WrapOpenMP.h:126
Base class for traversals utilising load balancing.
Definition: BalancedTraversal.h:19
EstimatorFunction _loadEstimator
Algorithm to use for estimating load.
Definition: BalancedTraversal.h:41
std::array< unsigned long, 3 > _cellsPerDimension
The dimensions of the cellblock.
Definition: CellTraversal.h:55
Functor base class.
Definition: Functor.h:40
static auto get()
Get a pointer to the actual logger object.
Definition: Logger.h:90
Class for Cells of Particles.
Definition: ParticleCell.h:51
This class provides a load balanced version of the base sliced traversal.
Definition: SlicedBalancedBasedTraversal.h:30
void initSliceThickness(unsigned long minSliceThickness) override
Calculates slice thickness according to estimates loads.
Definition: SlicedBalancedBasedTraversal.h:49
SlicedBalancedBasedTraversal(const std::array< unsigned long, 3 > &dims, Functor *functor, const double interactionLength, const std::array< double, 3 > &cellLength, DataLayoutOption dataLayout, bool useNewton3, bool spaciallyForward)
Constructor of the balanced sliced traversal.
Definition: SlicedBalancedBasedTraversal.h:36
std::array< int, 3 > _dimsPerLength
Store ids of dimensions ordered by number of cells per dimensions.
Definition: SlicedBasedTraversal.h:147
std::vector< unsigned long > _sliceThickness
The number of cells per slice in the dimension that was sliced.
Definition: SlicedBasedTraversal.h:157
bool _spaciallyForward
Whether the base step only covers neigboring cells tha are spacially forward (for example c08).
Definition: SlicedBasedTraversal.h:162
unsigned long _overlapLongestAxis
Overlap of interacting cells along the longest axis.
Definition: SlicedBasedTraversal.h:152
This class provides the sliced traversal.
Definition: SlicedLockBasedTraversal.h:32
bool _dynamic
whether to use static or dynamic scheduling.
Definition: SlicedLockBasedTraversal.h:48
static void exception(const Exception e)
Handle an exception derived by std::exception.
Definition: ExceptionHandler.h:63
Timer class to stop times.
Definition: Timer.h:20
void start()
start the timer.
Definition: Timer.cpp:17
long stop()
Stops the timer and returns the time elapsed in nanoseconds since the last call to start.
Definition: Timer.cpp:25
This is the main namespace of AutoPas.
Definition: AutoPasDecl.h:32
int autopas_get_max_threads()
Dummy for omp_get_max_threads() when no OpenMP is available.
Definition: WrapOpenMP.h:144