1#ifndef TRAVERSALTUNER_H_
2#define TRAVERSALTUNER_H_
8#include <utils/Logger.h>
10#include "LinkedCellTraversals/CellPairTraversals.h"
11#include "LinkedCellTraversals/QuickschedTraversal.h"
12#include "LinkedCellTraversals/C08CellPairTraversal.h"
13#include "LinkedCellTraversals/C04CellPairTraversal.h"
14#include "LinkedCellTraversals/OriginalCellPairTraversal.h"
15#include "LinkedCellTraversals/HalfShellTraversal.h"
16#include "LinkedCellTraversals/MidpointTraversal.h"
17#include "LinkedCellTraversals/NeutralTerritoryTraversal.h"
18#include "LinkedCellTraversals/SlicedCellPairTraversal.h"
22template<
class CellTemplate>
24 friend class LinkedCellsTest;
45 void findOptimalTraversal();
56 void rebuild(std::vector<CellTemplate> &cells,
57 const std::array<unsigned long, 3> &dims,
double cellLength[3],
double cutoff);
65 void traverseCellPairsInner(
CellProcessor &cellProcessor,
unsigned stage,
unsigned stageCount);
68 bool isTraversalApplicable(traversalNames
name,
const std::array<unsigned long, 3> &dims)
const;
71 traversalNames getSelectedTraversal()
const {
72 return selectedTraversal;
78 std::vector<CellTemplate>* _cells;
79 std::array<unsigned long, 3> _dims;
81 traversalNames selectedTraversal;
87 unsigned _cellsInCutoff = 1;
90template<
class CellTemplate>
94 mardyn_get_max_threads() > 1 ? C08 : SLICED
106 make_pair(
nullptr, origData),
107 make_pair(
nullptr, c08Data),
108 make_pair(
nullptr, c04Data),
109 make_pair(
nullptr, slicedData),
110 make_pair(
nullptr, hsData),
111 make_pair(
nullptr, mpData),
112 make_pair(
nullptr, ntData),
113 make_pair(
nullptr, c08esData)
117 quiData->taskBlockSize = {{2, 2, 2}};
118 if (is_base_of<ParticleCellBase, CellTemplate>::value) {
119 _traversals.push_back(make_pair(
nullptr, quiData));
124template<
class CellTemplate>
126 for (
auto t : _traversals) {
127 if (t.first !=
nullptr)
129 if (t.second !=
nullptr)
134template<
class CellTemplate>
138 _optimalTraversal = _traversals[selectedTraversal].first;
142 global_log->info() <<
"Using HalfShellTraversal." << endl;
144 global_log->info() <<
"Using OriginalCellPairTraversal." << endl;
146 global_log->info() <<
"Using C08CellPairTraversal without eighthShell." << endl;
148 global_log->info() <<
"Using C08CellPairTraversal with eighthShell." << endl;
150 global_log->info() <<
"Using C04CellPairTraversal." << endl;
152 global_log->info() <<
"Using MidpointTraversal." << endl;
154 global_log->info() <<
"Using NeutralTerritoryTraversal." << endl;
156 global_log->info() <<
"Using QuickschedTraversal." << endl;
158 global_log->error() <<
"MarDyn was compiled without Quicksched Support. Aborting!" << endl;
162 global_log->info() <<
"Using SlicedCellPairTraversal." << endl;
164 global_log->warning() <<
"Using unknown traversal." << endl;
166 if (_cellsInCutoff > _optimalTraversal->maxCellsInCutoff()) {
167 global_log->error() <<
"Traversal supports up to " << _optimalTraversal->maxCellsInCutoff()
168 <<
" cells in cutoff, but value is chosen as " << _cellsInCutoff << std::endl;
173template<
class CellTemplate>
177 string traversalType;
179 xmlconfig.
getNodeValue(
"traversalSelector", traversalType);
180 transform(traversalType.begin(), traversalType.end(), traversalType.begin(), ::tolower);
182 if (traversalType.find(
"c08es") != string::npos)
183 selectedTraversal = C08ES;
184 else if (traversalType.find(
"c08") != string::npos)
185 selectedTraversal = C08;
186 else if (traversalType.find(
"c04") != string::npos)
187 selectedTraversal = C04;
188 else if (traversalType.find(
"qui") != string::npos)
189 selectedTraversal = QSCHED;
190 else if (traversalType.find(
"slice") != string::npos)
191 selectedTraversal = SLICED;
192 else if (traversalType.find(
"ori") != string::npos)
193 selectedTraversal = ORIGINAL;
194 else if (traversalType.find(
"hs") != string::npos)
195 selectedTraversal = HS;
196 else if (traversalType.find(
"mp") != string::npos)
197 selectedTraversal = MP;
198 else if (traversalType.find(
"nt") != string::npos) {
199 selectedTraversal = NT;
202 if (mardyn_get_max_threads() > 1) {
203 global_log->warning() <<
"No traversal type selected. Defaulting to c08 traversal." << endl;
205 global_log->warning() <<
"No traversal type selected. Defaulting to sliced traversal." << endl;
221 string path(basePath +
"/traversalData[" + to_string(i) +
"]");
225 transform(traversalType.begin(), traversalType.end(), traversalType.begin(), ::tolower);
226 if (traversalType ==
"c08") {
228 }
else if (traversalType.find(
"qui") != string::npos) {
230 if (not is_base_of<ParticleCellBase, CellTemplate>::value) {
231 global_log->warning() <<
"Attempting to use Quicksched with cell type that does not store task data!"
234 for (
auto p : _traversals) {
237 string tag =
"taskBlockSize/l";
238 char dimension =
'x';
240 for (
int j = 0; j < 3; ++j) {
241 tag += (dimension + j);
243 if (quiData->taskBlockSize[j] < 2) {
244 global_log->error() <<
"Task block size in "
245 << (char) (dimension + j)
246 <<
" direction is <2 and thereby invalid! ("
247 << quiData->taskBlockSize[j] <<
")"
256 global_log->warning() <<
"Found quicksched traversal data in config "
257 <<
"but mardyn was compiled without quicksched support! "
258 <<
"(make ENABLE_QUICKSCHED=1)" << endl;
261 global_log->warning() <<
"Unknown traversal type: " << traversalType << endl;
268template<
class CellTemplate>
270 double cellLength[3],
double cutoff) {
274 for (
size_t i = 0ul; i < _traversals.size(); ++i) {
275 auto& [traversalPointerReference, traversalData] = _traversals[i];
277 if (traversalPointerReference ==
nullptr) {
279 case traversalNames ::ORIGINAL:
282 case traversalNames::C08:
285 case traversalNames::C04:
288 case traversalNames::SLICED:
291 case traversalNames::HS:
294 case traversalNames::MP:
297 case traversalNames::NT:
298 traversalPointerReference =
301 case traversalNames::C08ES:
304 case traversalNames::QSCHED: {
305 mardyn_assert((is_base_of<ParticleCellBase, CellTemplate>::value));
310 global_log->error() <<
"Unknown traversal data found in TraversalTuner._traversals!" << endl;
314 traversalPointerReference->rebuild(cells, dims, cellLength, cutoff, traversalData);
316 _optimalTraversal =
nullptr;
319template<
class CellTemplate>
321 if (not _optimalTraversal) {
322 findOptimalTraversal();
324 _optimalTraversal->traverseCellPairs(cellProcessor);
327template<
class CellTemplate>
330 if (
name == getSelectedTraversal()) {
331 traverseCellPairs(cellProcessor);
336 slicedTraversal.traverseCellPairs(cellProcessor);
339 Log::global_log->error()<<
"Calling traverseCellPairs(traversalName, CellProcessor&) for something else than the Sliced Traversal is disabled for now. Aborting." << std::endl;
346template<
class CellTemplate>
348 if (not _optimalTraversal) {
349 findOptimalTraversal();
351 _optimalTraversal->traverseCellPairsOuter(cellProcessor);
354template<
class CellTemplate>
356 unsigned stageCount) {
357 if (not _optimalTraversal) {
358 findOptimalTraversal();
360 _optimalTraversal->traverseCellPairsInner(cellProcessor, stage, stageCount);
363template<
class CellTemplate>
365 traversalNames
name,
const std::array<unsigned long, 3> &dims)
const {
388 global_log->warning() <<
"unknown traversal given in TraversalTuner::isTraversalApplicable, assuming that is applicable" << std::endl;
Definition: C04CellPairTraversal.h:20
Definition: C08CellPairTraversal.h:20
Definition: CellPairTraversals.h:21
Definition: CellProcessor.h:29
Definition: HalfShellTraversal.h:17
Definition: MidpointTraversal.h:18
Definition: NeutralTerritoryTraversal.h:25
Definition: OriginalCellPairTraversal.h:21
Definition: QuickschedTraversal.h:27
static void exit(int exitcode)
Terminate simulation with given exit code.
Definition: Simulation.cpp:155
Definition: SlicedCellPairTraversal.h:19
Definition: TraversalTuner.h:23
void rebuild(std::vector< CellTemplate > &cells, const std::array< unsigned long, 3 > &dims, double cellLength[3], double cutoff)
Definition: TraversalTuner.h:269
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
Definition: xmlfile.h:240
Definition: xmlfile.h:232
const_iterator begin() const
get starting iterator return an iterator to the first node
Definition: xmlfile.h:344
Query query(const std::string &querystr) const
perform a query return a query to a given query expression
long changecurrentnode(const std::string &nodepath=std::string("/"))
set current node set a node, relative queries start with
int getNodeValue_int(const std::string &nodepath, int defaultvalue=0) const
get node value as int get the node content and convert it to an integer
Definition: xmlfile.h:514
std::string getNodeValue_string(const std::string &nodepath, const std::string defaultvalue=std::string()) const
get node value as string get the node content
Definition: xmlfile.h:499
unsigned long getNodeValue(const std::string &nodepath, T &value) const
get node value get the node content and convert it to a given type
Definition: xmlfile.h:484
std::string getcurrentnodepath() const
get current node path
Definition: xmlfile.h:477
::xsd::cxx::tree::name< char, token > name
C++ type corresponding to the Name XML Schema built-in type.
Definition: vtk-punstructured.h:288
Definition: C04CellPairTraversal.h:16
Definition: C08CellPairTraversal.h:16
Definition: CellPairTraversals.h:16
Definition: HalfShellTraversal.h:13
Definition: MidpointTraversal.h:14
Definition: NeutralTerritoryTraversal.h:13
Definition: OriginalCellPairTraversal.h:17
Definition: QuickschedTraversal.h:22
Definition: SlicedCellPairTraversal.h:15