1 #include "MyObserver.h"
3 #include "tarch/logging/Log.h"
4 #include "tarch/logging/CommandLineLogger.h"
5 #include "tarch/logging/ChromeTraceFileLogger.h"
6 #include "tarch/logging/LogFilter.h"
7 #include "tarch/multicore/Core.h"
8 #include "tarch/mpi/Rank.h"
10 #include "peano4/peano4.h"
11 #include "peano4/grid/Spacetree.h"
12 #include "peano4/parallel/SpacetreeSet.h"
13 #include "peano4/parallel/Node.h"
16 tarch::logging::Log
_log(
"examples::regulargridupscaling");
19 #include "peano4/UnitTests.h"
20 #include "tarch/UnitTests.h"
24 int unitTestsErrors = 0;
25 tarch::tests::TestCase* tests =
nullptr;
27 tests = tarch::getUnitTests();
29 unitTestsErrors += tests->getNumberOfErrors();
32 tests = peano4::getUnitTests();
34 unitTestsErrors += tests->getNumberOfErrors();
37 if (unitTestsErrors != 0) {
38 logError(
"main()",
"unit tests failed. Quit.");
48 logTraceInWith1Argument(
"runParallel",
h );
49 peano4::parallel::SpacetreeSet::getInstance().init(
62 int numberOfThreads = tarch::multicore::Core::getInstance().getNumberOfThreads();
64 if (tarch::mpi::Rank::getInstance().isGlobalMaster() ) {
65 logInfo(
"runParallel(...)",
"create initial grid (step #1)" );
66 int numberOfGridConstructionSteps = 0;
68 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() <
69 tarch::mpi::Rank::getInstance().getNumberOfRanks() * THREE_POWER_D
71 numberOfGridConstructionSteps<20
73 peano4::parallel::Node::getInstance().setNextProgramStep(1);
74 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
75 numberOfGridConstructionSteps++;
77 logInfo(
"runParallel(...)",
"grid statistics = " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().toString() );
80 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() <
81 tarch::mpi::Rank::getInstance().getNumberOfRanks()
83 logError(
"runParallel(...)",
"not enough cells to keep " << tarch::mpi::Rank::getInstance().getNumberOfRanks() <<
" busy" );
87 int numberOfCellsPerRank = peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() / tarch::mpi::Rank::getInstance().getNumberOfRanks();
88 logInfo(
"runParallel(...)",
"trigger split of initial grid among ranks with " << numberOfCellsPerRank <<
" cells per rank" );
89 for (
int rank=1; rank<tarch::mpi::Rank::getInstance().getNumberOfRanks(); rank++) {
90 if ( not peano4::parallel::SpacetreeSet::getInstance().split(0,numberOfCellsPerRank,rank)) {
91 logWarning(
"runParallel(...)",
"failed to assign rank " << rank <<
" " << numberOfCellsPerRank <<
" cell(s)" );
95 const int MaxNumberOfConstructionSteps =
static_cast<int>(std::round( std::log(1.0 /
h)/std::log(3.0)+1 )) - 1;
96 assertion1(MaxNumberOfConstructionSteps>=0, MaxNumberOfConstructionSteps);
97 logInfo(
"runParallel(...)",
"commit split and give ranks " << MaxNumberOfConstructionSteps <<
" iterations to 'recover' (step #2)" );
98 for (
int i=0; i<MaxNumberOfConstructionSteps; i++) {
99 peano4::parallel::Node::getInstance().setNextProgramStep(2);
100 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
103 int numberOfCellsPerThread = peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() / numberOfThreads;
104 logInfo(
"runParallel(...)",
"trigger split of master rank into threads with " << numberOfCellsPerThread <<
" cells per thread (total: " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() <<
")");
105 for (
int thread=1; thread<numberOfThreads; thread++) {
106 if ( not peano4::parallel::SpacetreeSet::getInstance().split(0,numberOfCellsPerThread,0)) {
107 logWarning(
"runParallel(...)",
"failed to assign thread " << thread <<
" " << numberOfCellsPerThread <<
" cell(s)" );
111 logInfo(
"runParallel(...)",
"run one step committing split and telling other ranks to split as well (step #3)" );
112 peano4::parallel::Node::getInstance().setNextProgramStep(3);
113 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
115 logInfo(
"runParallel(...)",
"commit splits into threads and give ranks time to 'recover' (step #4)" );
116 for (
int i=0; i<3; i++) {
117 peano4::parallel::Node::getInstance().setNextProgramStep(4);
118 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
121 logInfo(
"runParallel(...)",
"start parallel traversals (step #5)" );
122 logInfo(
"runParallel(...)",
"grid statistics = " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().toString() );
125 const int Iterations=2;
127 const int Iterations=20;
130 for (
int i=0; i<Iterations; i++) {
131 peano4::parallel::Node::getInstance().setNextProgramStep(5);
132 peano4::parallel::SpacetreeSet::getInstance().traverse( emptyObserver );
134 logInfo(
"runParallel(...)",
"terminated successfully" );
137 while (peano4::parallel::Node::getInstance().continueToRun()) {
138 logDebug(
"runParallel(...)",
"trigger a new sweep with step " << peano4::parallel::Node::getInstance().getCurrentProgramStep() );
140 peano4::parallel::Node::getInstance().getCurrentProgramStep()==2
142 peano4::parallel::Node::getInstance().getCurrentProgramStep()==4
144 peano4::parallel::Node::getInstance().getCurrentProgramStep()==5
146 peano4::parallel::SpacetreeSet::getInstance().traverse(emptyObserver);
148 else if (peano4::parallel::Node::getInstance().getCurrentProgramStep()==3) {
149 assertionEquals( peano4::parallel::SpacetreeSet::getInstance().getLocalSpacetrees().
size(), 1);
150 const int localTree = *(peano4::parallel::SpacetreeSet::getInstance().getLocalSpacetrees().begin());
151 int numberOfCellsPerThread = peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells() / tarch::multicore::Core::getInstance().getNumberOfThreads();
152 logInfo(
"runParallel(...)",
"local unrefined cells = " << peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getNumberOfLocalUnrefinedCells());
153 logInfo(
"runParallel(...)",
"trigger split of master rank into threads with " << numberOfCellsPerThread <<
" cells per thread");
154 for (
int thread=1; thread<numberOfThreads; thread++) {
155 if ( not peano4::parallel::SpacetreeSet::getInstance().split(localTree,numberOfCellsPerThread,tarch::mpi::Rank::getInstance().getRank())) {
156 logWarning(
"runParallel(...)",
"failed to assign thread " << thread <<
" " << numberOfCellsPerThread <<
" cell(s)" );
159 peano4::parallel::SpacetreeSet::getInstance().traverse(emptyObserver);
163 logTraceOut(
"runParallel" );
167 int main(
int argc,
char** argv) {
168 const int ExitCodeSuccess = 0;
169 const int ExitCodeUnitTestsFailed = 1;
171 peano4::initParallelEnvironment(&argc,&argv);
172 peano4::fillLookupTables();
174 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
175 tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
false
177 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
178 tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
false
180 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
181 tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"peano4",
false
183 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
184 tarch::logging::LogFilter::FilterListEntry::TargetDebug, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
true
186 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
187 tarch::logging::LogFilter::FilterListEntry::TargetInfo, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
false
189 tarch::logging::LogFilter::getInstance().addFilterListEntry( tarch::logging::LogFilter::FilterListEntry(
190 tarch::logging::LogFilter::FilterListEntry::TargetTrace, tarch::logging::LogFilter::FilterListEntry::AnyRank,
"tarch",
true
194 tarch::logging::ChromeTraceFileLogger::getInstance().setOutputFile(
"p4.tracing" );
198 if (argc<3 or argc>6) {
199 logError(
"main(...)",
"Usage: ./executable mesh-width flops-per-cell [core-count] [spawn-frequency] [integration-points]");
203 double meshWidth = std::atof( argv[1] );
204 int flopsPerCell = std::atoi( argv[2] );
206 logError(
"main(...)",
"Usage: ./executable mesh-width");
207 logError(
"main(...)",
" mesh-width has to be a positive value");
210 if (meshWidth>=1.0) {
211 logError(
"main(...)",
"Usage: ./executable mesh-width");
212 logError(
"main(...)",
" mesh-width has to be smaller than one");
217 int cores = std::atoi( argv[3] );
218 tarch::multicore::Core::getInstance().configure(cores);
228 const int numberOfRanks = tarch::mpi::Rank::getInstance().getNumberOfRanks();
229 const int numberOfCores = tarch::multicore::Core::getInstance().getNumberOfThreads();
230 logInfo(
"main(...)",
"run on " << numberOfRanks <<
" ranks with " << numberOfCores <<
" thread(s) each" );
234 peano4::shutdownParallelEnvironment();
static double FractionOfCellsYieldingIntegrationTask
static int IntegrationAccuracy
static constexpr int RanksObserverTemplate
int main(int argc, char **argv)
tarch::logging::Log _log("examples::grid")