Peano
Loading...
Searching...
No Matches
taskfusion.cpp
Go to the documentation of this file.
1#include "taskfusion.h"
2
3#include <list>
4
5#include "tarch/Assertions.h"
6
8
10#include "tarch/logging/Log.h"
11
13
14#include "LogReadyTask.h"
15#include "ProcessReadyTask.h"
16
17
18namespace {
22 std::map<int, tarch::multicore::taskfusion::ReadyFusableTasks*> pendingTasksThatCanBeFused;
23 tarch::multicore::BooleanSemaphore pendingTasksSemaphore;
24
25 tarch::logging::Log _log("tarch::multicore::taskfusion");
26
27 const std::string SubmitFusedTaskStatisticsIdentifier("tarch::multicore::taskfusion::submit-fused-tasks");
28}
29
30
32 Task* task,
33 const std::set<TaskNumber>& inDependencies,
34 const TaskNumber& taskNumber
35) {
36 ::tarch::logging::Statistics::getInstance().inc(SubmitFusedTaskStatisticsIdentifier, 1, false, true);
37
38 assertion1(task->getTaskType()>=0, task->getTaskType());
39
41
42 if (instruction.maxTasks<1) {
43 native::spawnTask(task, inDependencies, taskNumber);
44 }
45 else {
46 // ensure the entry exists
47 tarch::multicore::Lock lock(pendingTasksSemaphore);
48 if (pendingTasksThatCanBeFused.count(task->getTaskType())==0) {
49 pendingTasksThatCanBeFused.insert(
50 std::pair<int, ReadyFusableTasks*>(
51 task->getTaskType(),
53 )
54 );
55 }
56 ReadyFusableTasks* taskQueue = pendingTasksThatCanBeFused.at( task->getTaskType() );
57 lock.free();
58
60 "translateFusableTaskIntoTaskSequence(...)",
61 "spawn two tasks around " << taskNumber <<
62 " (min-tasks=" << instruction.minTasks <<
63 ", max-tasks=" << instruction.maxTasks <<
64 ")"
65 );
66
67 std::set<TaskNumber> processReadTaskInDependencyNumber;
68
69 if ( taskNumber==tarch::multicore::NoOutDependencies or inDependencies.empty() ) {
71 task,
72 taskNumber,
73 taskQueue
74 );
75 }
76 else {
77 Task* readyTask = new LogReadyTask(task, taskNumber, taskQueue);
78 readyTask->setPriority(task->getPriority());
79 tarch::multicore::native::spawnTask( readyTask, inDependencies, taskNumber);
80 processReadTaskInDependencyNumber.insert( taskNumber );
81 }
82
83 Task* processTask = new ProcessReadyTask(taskNumber, taskQueue);
84 processTask->setPriority(task->getPriority()/2);
85 tarch::multicore::native::spawnTask( processTask, processReadTaskInDependencyNumber, taskNumber);
86 }
87}
88
89
91 tarch::multicore::Lock lock(pendingTasksSemaphore);
92 for (auto& p: pendingTasksThatCanBeFused) {
93 const int AnyTask = -1;
94 ProcessReadyTask::tryToProcessOneTask(p.second, AnyTask);
95 }
96}
#define assertion1(expr, param)
#define logDebug(methodName, logMacroMessageStream)
Definition Log.h:50
Log Device.
Definition Log.h:516
void inc(const std::string &identifier, double value=1.0, bool disableSampling=false, bool clearAfterDatabaseDump=false)
Definition Statistics.h:107
static Statistics & getInstance()
This is not the canonical realisation of singletons as I use it usually for stats in Peano.
Create a lock around a boolean semaphore region.
Definition Lock.h:19
void free()
Free the lock.
Definition Lock.cpp:37
Abstract super class for a job.
Definition Task.h:21
int getPriority() const
Definition Task.cpp:33
int getTaskType() const
Definition Task.cpp:40
void setPriority(int priority)
Set priority.
Definition Task.cpp:35
virtual FuseInstruction fuse(int taskType)=0
How many tasks shall system hold back from tasking runtime in user-defined queues.
Task plugging into state transition once task becomes ready.
static void insertReadyTask(Task *task, int taskNumber, ReadyFusableTasks *taskQueue)
Insert a new ready task into the local queues.
tarch::logging::Log _log("exahype2::fv")
void translateFusableTaskIntoTaskSequence(Task *task, const std::set< TaskNumber > &inDependencies, const TaskNumber &taskNumber)
Translate a single task into a sequence of (fusable tasks)
tarch::multicore::orchestration::Strategy & getOrchestration()
Definition multicore.cpp:75
constexpr TaskNumber NoOutDependencies
Definition multicore.h:101
Task queue of tasks which we hold back.
Definition taskfusion.h:66