10#include "topology/topologies.h"
28 const std::string BSPConcurrencyLevelStatisticsIdentifier(
"tarch::multicore::bsp-concurrency-level");
29 const std::string SpawnedTasksStatisticsIdentifier(
"tarch::multicore::spawned-tasks");
35 using namespace smartmpi::topology;
36 typedef UseSmartMPI MyTopology;
37 smartmpi::topology::Topology* smartMPITopology =
new MyTopology(
40 smartmpi::init( smartMPITopology );
42 smartmpi::appendToSchedulerChain(
"HardcodedMigrationScheduler" );
57 assertion(orchestrationStrategy !=
nullptr);
60 delete orchestrationStrategy;
61 orchestrationStrategy = realisation;
66 assertion(orchestrationStrategy !=
nullptr);
70 orchestrationStrategy = realisation;
76 return *orchestrationStrategy;
81 tarch::multicore::native::waitForTasks(inDependencies);
86 std::set<int> tmp{taskNumber};
94 if (not tasks.empty()) {
95 static int nestedSpawnAndWaits = 0;
100 nestedSpawnAndWaits++;
101 const int localNestedSpawnAndWaits = nestedSpawnAndWaits;
104 orchestrationStrategy->startBSPSection(localNestedSpawnAndWaits);
106 switch (orchestrationStrategy->paralleliseForkJoinSection(localNestedSpawnAndWaits, tasks.size(), tasks[0]->getTaskType())) {
108 for (
auto& p : tasks) {
110 Core::getInstance().yield();
117 native::spawnAndWaitAsTaskLoop(tasks);
122 orchestrationStrategy->endBSPSection(localNestedSpawnAndWaits);
125 nestedSpawnAndWaits--;
132 native::waitForAllTasks();
138 const std::set<TaskNumber>& inDependencies,
146 taskfusion::translateFusableTaskIntoTaskSequence(task, inDependencies, taskNumber);
148 native::spawnTask(task, inDependencies, taskNumber);
153#ifndef SharedMemoryParallelisation
156 for (
auto& p : tasks) {
165 bool stillExecuteLocally = myTask->fuse(tasksOfSameType, device);
166 if (stillExecuteLocally) {
167 tarch::multicore::native::spawnTask(myTask, std::set<TaskNumber>(), NoOutDependencies);
174void tarch::multicore::native::spawnTask(
176 const std::set<TaskNumber>& ,
185void tarch::multicore::native::waitForTasks(
const std::set<TaskNumber>& ) {}
188void tarch::multicore::native::waitForAllTasks() {}
tarch::logging::Log _log("::")
void inc(const std::string &identifier, double value=1.0, bool disableSampling=false, bool clearAfterDatabaseDump=false)
static Statistics & getInstance()
This is not the canonical realisation of singletons as I use it usually for stats in Peano.
void setCommunicator(MPI_Comm communicator, bool recomputeRankAndWorld=true)
Set communicator to be used by Peano.
static Rank & getInstance()
This operation returns the singleton instance.
Create a lock around a boolean semaphore region.
void free()
Free the lock.
Abstract super class for a job.
virtual bool canFuse() const
Interface for any task orchestration.
void spawnAndWaitAsTaskLoop(const std::vector< tarch::multicore::Task * > &tasks)
Map onto native tasking.
void processFusedTask(Task *myTask, const std::list< tarch::multicore::Task * > &tasksOfSameType, int device)
Process a fused task.
Strategy * createDefaultStrategy()
tarch::multicore::orchestration::Strategy & getOrchestration()
void waitForTask(const int taskNumber)
Wrapper around waitForTasks() with a single-element set.
void waitForTasks(const std::set< TaskNumber > &inDependencies)
Wait for set of tasks.
void setOrchestration(tarch::multicore::orchestration::Strategy *realisation)
void spawnAndWait(const std::vector< Task * > &tasks)
Fork-join task submission pattern.
tarch::multicore::orchestration::Strategy * swapOrchestration(tarch::multicore::orchestration::Strategy *realisation)
Swap the active orchestration.
void spawnTask(Task *task, const std::set< TaskNumber > &inDependencies=tarch::multicore::NoInDependencies, const TaskNumber &taskNumber=tarch::multicore::NoOutDependencies)
Spawns a single task in a non-blocking fashion.
void initSmartMPI()
Switch on SmartMPI.