Peano
Loading...
Searching...
No Matches
BenchmarkDriver.cpp
Go to the documentation of this file.
1#include "Benchmarks-main.h"
2#include "Constants.h"
3
5#include "tarch/logging/Log.h"
8
9#include "peano4/peano.h"
12
13#include "repositories/DataRepository.h"
14#include "repositories/StepRepository.h"
15#include "repositories/GlobalState.h"
16
18
19#include "Constants.h"
20
22
23
28
31
32#include "NohProblem.h"
33
36
37
38#include "globaldata/HydroPart.h"
39#include "vertexdata/HydroPartSet.h"
40
41
42
43
45
46
48
49
54
55vertexdata::HydroPartSet* workItemParticleSet;
56
57
65void initParticle( globaldata::HydroPart& particle, int numberOfParticles, int index ) {
66 int particlesPerAxis = static_cast<int>( std::ceil( std::pow(numberOfParticles, 1.0/Dimensions ) ) + 1.0 );
67 const double h = 1.0 / particlesPerAxis;
69 (index % particlesPerAxis) * h
70 , (index % (particlesPerAxis*particlesPerAxis) ) * h
71 #if Dimensions==3
72 , (index % (particlesPerAxis*particlesPerAxis*particlesPerAxis) ) * h
73 #endif
74 };
75 particle.setX(x);
76 particle.setCellH(0.5);
77
78 initNohProblemIC(particle, 1.0, particlesPerAxis, Dimensions );
79
80 particle.setSmoothingLengthConverged(false);
81 particle.setSmoothingLength(1.0/2.0);
82}
83
84
85void initParticles( int numberOfParticles ) {
86 const int numberOfWorkItems = numberOfParticles / Benchmark_WorkItemSize;
87
88 int currentNumberOfParticles = 0;
89 for (int currentWorkItem=0; currentWorkItem<numberOfWorkItems; currentWorkItem++) {
90 for (auto& p: workItemParticleSet[currentWorkItem]) {
91 initParticle(*p, numberOfParticles, currentNumberOfParticles);
92 currentNumberOfParticles++;
93 }
94 }
95}
96
97
110void prepareForceBenchmark(int numberOfParticles) {
111 initParticles(numberOfParticles);
112
114 const int numberOfWorkItems = numberOfParticles / Benchmark_WorkItemSize;
115
116 for (int workItem=0; workItem<numberOfWorkItems; workItem++) {
117 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetSmoothingLengthIterationCounter<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
118 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetAcceleration<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
119 }
120}
121
122
138 std::vector<int> coalescedEntries(TwoPowerD);
139 int remainingParticlesToAssignToChunk = Benchmark_WorkItemSize;
140 int chunkSize = std::max(1,Benchmark_WorkItemSize / TwoPowerD);
141 chunkSize += (Benchmark_WorkItemSize % TwoPowerD == 0) ? 0 : 1;
142 for (int i=0; i<TwoPowerD; i++) {
143 coalescedEntries[i] = chunkSize;
144 remainingParticlesToAssignToChunk -= chunkSize;
145 chunkSize = std::min( chunkSize, remainingParticlesToAssignToChunk );
146 }
147
148 return coalescedEntries;
149}
150
151
152
153void allocateParticles(int numberOfParticles) {
154 const int numberOfWorkItems = numberOfParticles / Benchmark_WorkItemSize;
155 assertionEquals( numberOfParticles % Benchmark_WorkItemSize, 0);
156 workItemParticleSet = new vertexdata::HydroPartSet[numberOfWorkItems];
157
158 int currentNumberOfParticles = 0;
159 for (int currentWorkItem=0; currentWorkItem<numberOfWorkItems; currentWorkItem++) {
160 int numberOfParticlesForThisWorkItem = std::min( Benchmark_WorkItemSize, numberOfParticles-currentNumberOfParticles );
161 // @todo We might want to allocate in managed memory
162 globaldata::HydroPart* particles = tarch::allocateMemory<globaldata::HydroPart>(numberOfParticlesForThisWorkItem, tarch::MemoryLocation::Heap);
163 for (int i=0; i<numberOfParticlesForThisWorkItem; i++) {
164 workItemParticleSet[currentWorkItem].addParticle(particles+i);
165 }
166 currentNumberOfParticles += numberOfParticlesForThisWorkItem;
167 }
168}
169
170
172 std::function< void(int) > kernelCallInLoop,
173 const std::string& name,
174 int numberOfParticles
175) {
176 const int numberOfWorkItems = numberOfParticles / Benchmark_WorkItemSize;
177
179 for (int sample=0; sample<Benchmark_Samples; sample++) {
180 ::tarch::timing::Watch watch("", "runBenchmark(int)", false);
181 #pragma omp parallel for schedule(static,1)
182 for (int workItem=0; workItem<numberOfWorkItems; workItem++) {
183 for (int i=0; i<Benchmark_WorkItemRepeats; i++) {
184 kernelCallInLoop(i);
185 }
186 }
187 watch.stop();
188 measurement.setValue( watch.getCalendarTime()/Benchmark_WorkItemRepeats/numberOfParticles );
189 }
190 logInfo( "assessKernel(int)", name << ":\t" << measurement.getValue() << " " << measurement.toString() );
191}
192
193
194void runBenchmark(int numberOfParticles) {
197
198 allocateParticles(numberOfParticles);
199
200 const int numberOfWorkItems = numberOfParticles / Benchmark_WorkItemSize;
201
202 logInfo( "runBenchmark(int)", "===============================");
203 logInfo( "runBenchmark(int)", " Experiment: " << numberOfParticles << " particles" );
204 logInfo( "runBenchmark(int)", " No of work items: " << numberOfWorkItems );
205 logInfo( "runBenchmark(int)", "===============================");
206
207
208 initParticles(numberOfParticles);
209
210 // This part is only there to be able to study if the function call is
211 // properly vectorised. This is also the reason we plot the outcome, i.e.
212 // the output ensures that the linker does not throw out the function call
213 // alltogether.
214 globaldata::HydroPart* arbitaryParticle = *(workItemParticleSet->begin());
215 auto [interaction,postinteraction] = ::swift2::kernels::internal::identifyInteractingParticles<8,globaldata::HydroPart,globaldata::HydroPart>(
216 cellMarker,
217 arbitaryParticle,
218 arbitaryParticle,
219 8,
220 ::swift2::kernels::legacy::densityKernelPairEvaluationPredicate<globaldata::HydroPart>
221 );
222 logInfo( "runBenchmark(int)", " Bit pattern for one entry: " << interaction );
223
224
225 if (Benchmark_Testforce) {
226 prepareForceBenchmark(numberOfParticles);
228 [&](int workItem) -> void {
229 ::swift2::kernels::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::forceKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
230 },
231 "force (baseline)",
232 numberOfParticles
233 );
235 [&](int workItem) -> void {
236 ::swift2::kernels::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::forceKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
237 },
238 "force (predicates)",
239 numberOfParticles
240 );
242 [&](int workItem) -> void {
243 ::swift2::kernels::coalesced::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::forceKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
244 },
245 "force (coalesced,native)",
246 numberOfParticles
247 );
249 [&](int workItem) -> void {
250 ::swift2::kernels::coalesced::prefixcheck::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::forceKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
251 },
252 "force (prefix,native)",
253 numberOfParticles
254 );
256 [&](int workItem) -> void {
257 ::swift2::kernels::ompoffloading::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::forceKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
258 },
259 "force (offloading,omp)",
260 numberOfParticles
261 );
262 }
263
264 if (Benchmark_Testdensity) {
265 initParticles(numberOfParticles);
267 [&](int workItem) -> void {
268 ::swift2::kernels::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::densityKernel<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInCellKernel<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle<globaldata::HydroPart>);
269 },
270 "density (baseline)",
271 numberOfParticles
272 );
274 [&](int workItem) -> void {
275 ::swift2::kernels::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::densityKernelWithoutChecks<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernel<globaldata::HydroPart>, ::swift2::kernels::legacy::densityKernelPairEvaluationPredicate<globaldata::HydroPart>);
276 },
277 "density (predicates)",
278 numberOfParticles
279 );
281 [&](int workItem) -> void {
282 ::swift2::kernels::coalesced::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::densityKernelWithoutChecks<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernel<globaldata::HydroPart>, ::swift2::kernels::legacy::densityKernelPairEvaluationPredicate<globaldata::HydroPart>);
283 },
284 "density (coalesced,native)",
285 numberOfParticles
286 );
288 [&](int workItem) -> void {
289 ::swift2::kernels::coalesced::prefixcheck::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::densityKernelWithoutChecks<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernel<globaldata::HydroPart>, ::swift2::kernels::legacy::densityKernelPairEvaluationPredicate<globaldata::HydroPart>);
290 },
291 "density (prefix,native)",
292 numberOfParticles
293 );
295 [&](int workItem) -> void {
296 ::swift2::kernels::ompoffloading::forAllParticlePairs( cellMarker, workItemParticleSet[workItem], workItemParticleSet[workItem], createCoalescedMemoryIndices(), createCoalescedMemoryIndices(), ::swift2::kernels::legacy::densityKernelWithoutChecks<globaldata::HydroPart>, ::swift2::kernels::localParticleCanBeUpdatedInCellKernel<globaldata::HydroPart>, ::swift2::kernels::legacy::densityKernelPairEvaluationPredicate<globaldata::HydroPart>);
297 },
298 "density (offloading,omp)",
299 numberOfParticles
300 );
301 }
302
303 if (Benchmark_Testkick1) {
304 initParticles(numberOfParticles);
306 [&](int workItem) -> void {
307 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
308 },
309 "kick1 (baseline)",
310 numberOfParticles
311 );
313 [&](int workItem) -> void {
314 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
315 },
316 "kick1 (predicates)",
317 numberOfParticles
318 );
320 [&](int workItem) -> void {
321 ::swift2::kernels::coalesced::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
322 },
323 "kick1 (coalesced,native)",
324 numberOfParticles
325 );
327 [&](int workItem) -> void {
328 ::swift2::kernels::coalesced::prefixcheck::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
329 },
330 "kick1 (prefix,native)",
331 numberOfParticles
332 );
334 [&](int workItem) -> void {
335 ::swift2::kernels::ompoffloading::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
336 },
337 "kick1 (offloading,omp)",
338 numberOfParticles
339 );
340 }
341
342 if (Benchmark_Testkick2) {
343 initParticles(numberOfParticles);
345 [&](int workItem) -> void {
346 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
347 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetPredictedValuesWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
348 },
349 "kick2 (baseline)",
350 numberOfParticles
351 );
353 [&](int workItem) -> void {
354 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
355 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetPredictedValuesWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
356 },
357 "kick2 (predicates)",
358 numberOfParticles
359 );
361 [&](int workItem) -> void {
362 ::swift2::kernels::coalesced::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
363 ::swift2::kernels::coalesced::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetPredictedValuesWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
364 },
365 "kick2 (coalesced,native)",
366 numberOfParticles
367 );
369 [&](int workItem) -> void {
370 ::swift2::kernels::coalesced::prefixcheck::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
371 ::swift2::kernels::coalesced::prefixcheck::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetPredictedValuesWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
372 },
373 "kick2 (prefix,native)",
374 numberOfParticles
375 );
377 [&](int workItem) -> void {
378 ::swift2::kernels::ompoffloading::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogKickWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
379 ::swift2::kernels::ompoffloading::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::resetPredictedValuesWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
380 },
381 "kick2 (offloading,omp)",
382 numberOfParticles
383 );
384 }
385
386 if (Benchmark_Testdrift) {
387 initParticles(numberOfParticles);
389 [&](int workItem) -> void {
390 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::timestepping::resetMovedParticleMarkerWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
391 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogDriftWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
392 },
393 "drift (baseline)",
394 numberOfParticles
395 );
397 [&](int workItem) -> void {
398 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::timestepping::resetMovedParticleMarkerWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
399 ::swift2::kernels::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogDriftWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
400 },
401 "drift (predicates)",
402 numberOfParticles
403 );
405 [&](int workItem) -> void {
406 ::swift2::kernels::coalesced::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::timestepping::resetMovedParticleMarkerWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
407 ::swift2::kernels::coalesced::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogDriftWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
408 },
409 "drift (coalesced,native)",
410 numberOfParticles
411 );
413 [&](int workItem) -> void {
414 ::swift2::kernels::coalesced::prefixcheck::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::timestepping::resetMovedParticleMarkerWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
415 ::swift2::kernels::coalesced::prefixcheck::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogDriftWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
416 },
417 "drift (prefix,native)",
418 numberOfParticles
419 );
421 [&](int workItem) -> void {
422 ::swift2::kernels::ompoffloading::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::timestepping::resetMovedParticleMarkerWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
423 ::swift2::kernels::ompoffloading::forAllParticles( vertexMarker, workItemParticleSet[workItem], -1, ::swift2::kernels::legacy::leapfrogDriftWithGlobalTimeStepSizeWithMasking<globaldata::HydroPart>, ::swift2::kernels::alwaysUpdateInVertexKernel<globaldata::HydroPart>);
424 },
425 "drift (offloading,omp)",
426 numberOfParticles
427 );
428 } // end of sample loop
429
430 for (int currentWorkItem=0; currentWorkItem<numberOfWorkItems; currentWorkItem++) {
432 }
433 delete[] workItemParticleSet;
434}
435
436
437
450 0, // std::bitset< TwoPowerD > __hasBeenRefined,
451 0, // std::bitset< TwoPowerD > __willBeRefined,
452 0, // std::bitset< TwoPowerD > __isVertexLocal,
453 0, // std::bitset< TwoPowerD > __isParentVertexLocal,
454 0, // std::bitset< TwoPowerD > __isVertexParentOfSubtree,
455 0, // std::bitset< TwoTimesD > __isFaceLocal,
456 true, // bool __isCellLocal,
457 true, // bool __isParentCellLocal,
458 0, // std::bitset< TwoPowerD > __isVertexAdjacentToParallelDomainBoundary,
459 0, // std::bitset< TwoTimesD > __isFaceAdjacentToParallelDomainBoundary,
460 tarch::la::Vector<TwoPowerD,int>(1), // __numberOfAdjacentTreesPerVertex
461 std::bitset< ThreePowerD >().all(), // __isAdjacentCellLocal,
462 tarch::la::Vector< TwoPowerD, int >(0), // __vertexDataFrom,
463 tarch::la::Vector< TwoPowerD, int >(0), // __vertexDataTo,
464 tarch::la::Vector< TwoTimesD, int >(0), // __faceDataFrom,
465 tarch::la::Vector< TwoTimesD, int >(0), // __faceDataTo,
466 0, // int __cellData,
467 tarch::la::Vector< Dimensions, int >(0), // __relativePositionToFather,
468 0, // int __invokingSpacetree,
469 true // __invokingSpacetreeIsNotInvolvedInAnyDynamicLoadBalancing
470 );
471}
472
473
474
475int main(int argc, char** argv) {
476 const int ExitCodeSuccess = 0;
477 const int ExitCodeUnitTestsFailed = 1;
478 const int ExitCodeInvalidArguments = 2;
479
484
486 DomainOffset,
487 DomainSize,
488 PeriodicBC
489 );
490
491 repositories::DataRepository::initDatatypes();
492
494
495 if (not swift2::parseCommandLineArguments(argc,argv) ) {
496 logError("main()", "Invalid command line arguments.");
497 return ExitCodeInvalidArguments;
498 }
499
500 const int numberOfThreads = tarch::multicore::Core::getInstance().getNumberOfThreads();
501
502 logInfo( "runBenchmark(int)", "===============================");
503 logInfo( "runBenchmark(int)", " threads=" << numberOfThreads );
504 logInfo( "runBenchmark(int)", " sizeof(Particle)=" << sizeof(globaldata::HydroPart) );
505 logInfo( "runBenchmark(int)", " max particles=" << Benchmark_MaxParticles );
506 logInfo( "runBenchmark(int)", " samples=" << Benchmark_Samples );
507 logInfo( "runBenchmark(int)", " size of work item (cell size)=" << Benchmark_WorkItemSize );
508 logInfo( "runBenchmark(int)", " kernel repetitions per work item=" << Benchmark_WorkItemRepeats );
509 logInfo( "runBenchmark(int)", "===============================");
510
511 int particles=std::max(Benchmark_MinParticles,Benchmark_WorkItemSize);
512 while (particles<=Benchmark_MaxParticles) {
513 int previousParticles = particles;
514 particles += (particles % Benchmark_WorkItemSize);
515 runBenchmark( particles );
516 particles = previousParticles*2 < particles ? particles*2 : previousParticles*2;
517 }
518
520 repositories::DataRepository::shutdownDatatypes();
522
523 return ExitCodeSuccess;
524}
#define assertionEquals(lhs, rhs)
void prepareForceBenchmark(int numberOfParticles)
Prepare the force benchmark.
void allocateParticles(int numberOfParticles)
void assessKernel(std::function< void(int) > kernelCallInLoop, const std::string &name, int numberOfParticles)
void initParticles(int numberOfParticles)
tarch::logging::Log _log("::")
vertexdata::HydroPartSet * workItemParticleSet
peano4::grid::GridTraversalEvent gridTraversalEvent
See initGridTraversalEvent()
void runBenchmark(int numberOfParticles)
std::vector< int > createCoalescedMemoryIndices()
Create coalesced particle indicator.
void initParticle(globaldata::HydroPart &particle, int numberOfParticles, int index)
Initialise the particles with some meaningful information.
void initGridTraversalEvent()
Initialise the global variable gridTraversalEvent.
#define TwoPowerD
Definition Globals.h:19
#define logError(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
Definition Log.h:464
#define logInfo(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
Definition Log.h:411
int main()
Definition main.cpp:321
Log Device.
Definition Log.h:516
static Core & getInstance()
Definition Core.cpp:56
int getNumberOfThreads() const
Returns the number of threads that is used.
Definition Core.cpp:67
std::string toString() const
void setValue(const double &value)
Set the value.
A simple class that has to be included to measure the clock ticks required for an operation.
Definition Watch.h:45
double getCalendarTime()
This method returns the elapsed calendar time between the start and stop command of the timer,...
Definition Watch.cpp:74
void stop()
Stop timer.
Definition Watch.cpp:55
void initNohProblemIC(globaldata::HydroPart &particle, const tarch::la::Vector< Dimensions, double > &h, double HYDRO_PART_NUMBER, double HYDRO_DIMENSIONS)
Definition NohProblem.cpp:6
void shutdownSingletons()
The very first thing I have to do is to shut down Node.
Definition peano.cpp:150
void fillLookupTables()
Fill Lookup Tables.
Definition peano.cpp:87
int initParallelEnvironment(int *argc, char ***argv)
Init Parallel Environment.
Definition peano.cpp:101
void initSingletons(const tarch::la::Vector< Dimensions, double > &offset, const tarch::la::Vector< Dimensions, double > &width, const std::bitset< Dimensions > &periodicBC=0)
Fire up all the singletons.
Definition peano.cpp:133
void shutdownParallelEnvironment()
Shutdown all the parallel environment, i.e.
Definition peano.cpp:127
void forAllParticles(const peano4::datamanagement::VertexMarker &marker, ParticleContainer &assignedParticles, int numberOfCoalescedAssignedParticles, ParticleUnaryOperatorOnVertex< typename ParticleContainer::DoFType > auto f, UpdateParticleAssignedToVertexPredicate< typename ParticleContainer::DoFType > predicate)
void forAllParticlePairs(const peano4::datamanagement::CellMarker &marker, LocalParticleContainer &localParticles, ActiveParticleContainer &activeParticles, const std::vector< int > &numberOfCoalescedLocalParticlesPerVertex, const std::vector< int > &numberOfCoalescedActiveParticlesPerVertex, ParticleBinaryOperator< PCParticle< LocalParticleContainer >, PCParticle< ActiveParticleContainer > > auto f, UpdateParticleAssignedToCellPredicate< PCParticle< LocalParticleContainer > > localParticlePredicate, UpdateParticlePairWithinCellPredicate< PCParticle< LocalParticleContainer > > particlePairPredicate)
void forAllParticlePairs(const peano4::datamanagement::CellMarker &marker, LocalParticleContainer &localParticles, ActiveParticleContainer &activeParticles, const std::vector< int > &numberOfCoalescedLocalParticlesPerVertex, const std::vector< int > &numberOfCoalescedActiveParticlesPerVertex, ParticleBinaryOperator< PCParticle< LocalParticleContainer >, PCParticle< ActiveParticleContainer > > auto f, UpdateParticleAssignedToCellPredicate< PCParticle< LocalParticleContainer > > localParticlePredicate, UpdateParticlePairWithinCellPredicate< PCParticle< LocalParticleContainer > > particlePairPredicate)
Simple vectorised version of pair-wise comparison.
void forAllParticles(const peano4::datamanagement::VertexMarker &marker, ParticleContainer &assignedParticles, int numberOfCoalescedAssignedParticles, ParticleUnaryOperatorOnVertex< typename ParticleContainer::DoFType > auto f, UpdateParticleAssignedToVertexPredicate< typename ParticleContainer::DoFType > predicate)
Version of forAllParticles assuming chunks of coalesced memory.
void forAllParticlePairs(const peano4::datamanagement::CellMarker &marker, LocalParticleContainer &localParticles, ActiveParticleContainer &activeParticles, const std::vector< int > &numberOfCoalescedLocalParticlesPerVertex, const std::vector< int > &numberOfCoalescedActiveParticlesPerVertex, ParticleBinaryOperator< PCParticle< LocalParticleContainer >, PCParticle< ActiveParticleContainer > > auto f, UpdateParticleAssignedToCellPredicate< PCParticle< LocalParticleContainer > > localParticlePredicate, UpdateParticlePairWithinCellPredicate< PCParticle< LocalParticleContainer > > particlePairPredicate)
Please consult cousing routine in swift2/kernels/ParticleSetIterators.h for generic docu.
void forAllParticles(const peano4::datamanagement::VertexMarker &marker, ParticleContainer &assignedParticles, int numberOfCoalescedAssignedParticles, ParticleUnaryOperatorOnVertex< typename ParticleContainer::DoFType > auto f, UpdateParticleAssignedToVertexPredicate< typename ParticleContainer::DoFType > predicate)
Please consult cousing routine in swift2/kernels/ParticleSetIterators.h for generic docu.
void forAllParticlePairs(const peano4::datamanagement::CellMarker &marker, LocalParticleContainer &localParticles, ActiveParticleContainer &activeParticles, const std::vector< int > &numberOfCoalescedLocalParticlesPerVertex, const std::vector< int > &numberOfCoalescedActiveParticlesPerVertex, ParticleBinaryOperator< PCParticle< LocalParticleContainer >, PCParticle< ActiveParticleContainer > > auto f, UpdateParticleAssignedToCellPredicate< PCParticle< LocalParticleContainer > > localParticlePredicate=::swift2::kernels::localParticleCanBeUpdatedInCellKernel< PCParticle< LocalParticleContainer > >, UpdateParticlePairWithinCellPredicate< PCParticle< LocalParticleContainer > > particlePairPredicate=::swift2::kernels::localParticleCanBeUpdatedInCellKernelFromAnyOtherParticle< PCParticle< LocalParticleContainer > >)
Run over all local particle-active particle combinations.
void forAllParticles(const peano4::datamanagement::VertexMarker &marker, ParticleContainer &assignedParticles, int numberOfCoalescedAssignedParticles, ParticleUnaryOperatorOnVertex< typename ParticleContainer::DoFType > auto f, UpdateParticleAssignedToVertexPredicate< typename ParticleContainer::DoFType > predicate)
Run over all particles and update them independent of each other.
bool parseCommandLineArguments(int argc, char **argv)
void initSmartMPI()
Switch on SmartMPI.
Definition multicore.cpp:33
void freeMemory(void *data, MemoryLocation location, int device=accelerator::Device::HostDevice)
Free memory.
void initNonCriticalAssertionEnvironment()
Register the assertion tag from the global communicator.
@ Heap
Create data on the heap of the local device.
Vertex marker to provide information about selected vertex.
Simple vector class.
Definition Vector.h:134