Skip to content

Commit d320233

Browse files
committed
Mode selection for remaining engines. Enabled queuing for ToposortST in the process.
1 parent 9b2ca90 commit d320233

14 files changed

Lines changed: 210 additions & 210 deletions

include/react/propagation/PulseCountO1Engine.h

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ class Node : public IReactiveNode
6767
////////////////////////////////////////////////////////////////////////////////////////
6868
/// Turn
6969
////////////////////////////////////////////////////////////////////////////////////////
70-
class Turn :
71-
public TurnBase,
72-
public TurnQueueManager::QueueEntry
70+
class Turn : public TurnBase
7371
{
7472
public:
7573
Turn(TurnIdT id, TurnFlagsT flags);
@@ -78,29 +76,22 @@ class Turn :
7876
};
7977

8078
////////////////////////////////////////////////////////////////////////////////////////
81-
/// PulseCountO1Engine
79+
/// EngineBase
8280
////////////////////////////////////////////////////////////////////////////////////////
83-
class PulseCountO1Engine :
84-
public IReactiveEngine<Node,Turn>,
85-
public TurnQueueManager
81+
template <typename TTurn>
82+
class EngineBase : public IReactiveEngine<Node,TTurn>
8683
{
8784
public:
88-
PulseCountO1Engine();
89-
9085
void OnNodeAttach(Node& node, Node& parent);
9186
void OnNodeDetach(Node& node, Node& parent);
9287

93-
void OnTurnAdmissionStart(Turn& turn);
94-
void OnTurnAdmissionEnd(Turn& turn);
95-
void OnTurnEnd(Turn& turn);
96-
97-
void OnTurnInputChange(Node& node, Turn& turn);
98-
void OnTurnPropagate(Turn& turn);
88+
void OnTurnInputChange(Node& node, TTurn& turn);
89+
void OnTurnPropagate(TTurn& turn);
9990

100-
void OnNodePulse(Node& node, Turn& turn);
101-
void OnNodeIdlePulse(Node& node, Turn& turn);
91+
void OnNodePulse(Node& node, TTurn& turn);
92+
void OnNodeIdlePulse(Node& node, TTurn& turn);
10293

103-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, Turn& turn);
94+
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
10495

10596
private:
10697
typedef Node::ShiftMutexT NodeShiftMutexT;
@@ -110,22 +101,32 @@ class PulseCountO1Engine :
110101

111102
void updateNodeWeight(Node& node, MarkerT marker, int weightDelta, int costDelta);
112103

113-
void processChild(Node& node, bool update, Turn& turn);
114-
void nudgeChildren(Node& parent, bool update, Turn& turn);
104+
void processChild(Node& node, bool update, TTurn& turn);
105+
void nudgeChildren(Node& parent, bool update, TTurn& turn);
115106

116107
MarkerT nextMarker();
117108

118109
task_group tasks_;
119-
MarkerT curMarker_;
110+
MarkerT curMarker_ = 1;
120111

121112
NodeVectorT changedInputs_;
122113
};
123114

115+
class BasicEngine : public EngineBase<Turn> {};
116+
class QueuingEngine : public DefaultQueuingEngine<EngineBase,Turn> {};
117+
124118
} // ~namespace pulsecount_o1
125119
REACT_IMPL_END
126120

127121
REACT_BEGIN
128122

129-
using REACT_IMPL::pulsecount_o1::PulseCountO1Engine;
123+
struct parallel;
124+
struct parallel_queuing;
125+
126+
template <typename TMode = parallel_queuing>
127+
class PulseCountO1Engine;
128+
129+
template <> class PulseCountO1Engine<parallel> : public REACT_IMPL::pulsecount_o1::BasicEngine {};
130+
template <> class PulseCountO1Engine<parallel_queuing> : public REACT_IMPL::pulsecount_o1::QueuingEngine {};
130131

131132
REACT_END

include/react/propagation/SourceSetEngine.h

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ using tbb::spin_mutex;
2828
////////////////////////////////////////////////////////////////////////////////////////
2929
/// Turn
3030
////////////////////////////////////////////////////////////////////////////////////////
31-
class Turn :
32-
public TurnBase,
33-
public TurnQueueManager::QueueEntry
31+
class Turn : public TurnBase
3432
{
3533
public:
3634
using SourceIdSetT = SourceIdSet<ObjectId>;
@@ -100,40 +98,45 @@ class Node : public IReactiveNode
10098
};
10199

102100
////////////////////////////////////////////////////////////////////////////////////////
103-
/// SourceSetEngine
101+
/// EngineBase
104102
////////////////////////////////////////////////////////////////////////////////////////
105-
class SourceSetEngine :
106-
public IReactiveEngine<Node,Turn>,
107-
public TurnQueueManager
103+
template <typename TTurn>
104+
class EngineBase : public IReactiveEngine<Node,TTurn>
108105
{
109106
public:
110-
void SourceSetEngine::OnNodeCreate(Node& node);
107+
void OnNodeCreate(Node& node);
111108

112109
void OnNodeAttach(Node& node, Node& parent);
113110
void OnNodeDetach(Node& node, Node& parent);
114111

115112
void OnNodeDestroy(Node& node);
116113

117-
void OnTurnAdmissionStart(Turn& turn);
118-
void OnTurnAdmissionEnd(Turn& turn);
119-
void OnTurnEnd(Turn& turn);
114+
void OnTurnInputChange(Node& node, TTurn& turn);
115+
void OnTurnPropagate(TTurn& turn);
120116

121-
void OnTurnInputChange(Node& node, Turn& turn);
122-
void OnTurnPropagate(Turn& turn);
123-
124-
void OnNodePulse(Node& node, Turn& turn);
125-
void OnNodeIdlePulse(Node& node, Turn& turn);
126-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, Turn& turn);
117+
void OnNodePulse(Node& node, TTurn& turn);
118+
void OnNodeIdlePulse(Node& node, TTurn& turn);
119+
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
127120

128121
private:
129122
vector<Node*> changedInputs_;
130123
};
131124

125+
class BasicEngine : public EngineBase<Turn> {};
126+
class QueuingEngine : public DefaultQueuingEngine<EngineBase,Turn> {};
127+
132128
} // ~namespace sourceset
133129
REACT_IMPL_END
134130

135131
REACT_BEGIN
136132

137-
using REACT_IMPL::sourceset::SourceSetEngine;
133+
struct parallel;
134+
struct parallel_queuing;
135+
136+
template <typename TMode = parallel_queuing>
137+
class SourceSetEngine;
138+
139+
template <> class SourceSetEngine<parallel> : public REACT_IMPL::sourceset::BasicEngine {};
140+
template <> class SourceSetEngine<parallel_queuing> : public REACT_IMPL::sourceset::QueuingEngine {};
138141

139142
REACT_END

include/react/propagation/TopoSortEngine.h

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ struct ShiftRequestData
5252
////////////////////////////////////////////////////////////////////////////////////////
5353
/// Turn
5454
////////////////////////////////////////////////////////////////////////////////////////
55-
class Turn :
56-
public TurnBase,
57-
public TurnQueueManager::QueueEntry
55+
class Turn : public TurnBase
5856
{
5957
public:
6058
Turn(TurnIdT id, TurnFlagsT flags);
@@ -63,35 +61,28 @@ class Turn :
6361
////////////////////////////////////////////////////////////////////////////////////////
6462
/// TopoSortEngine
6563
////////////////////////////////////////////////////////////////////////////////////////
66-
class TopoSortEngine :
67-
public IReactiveEngine<Node,Turn>,
68-
public TurnQueueManager
64+
template <typename TTurn>
65+
class EngineBase : public IReactiveEngine<Node,TTurn>
6966
{
7067
public:
7168
using NodeSetT = set<Node*>;
7269
using ConcNodeVectorT = concurrent_vector<Node*>;
7370
using ShiftRequestVectorT = concurrent_vector<ShiftRequestData>;
7471
using TopoQueueT = TopoQueue<Node>;
7572

76-
TopoSortEngine();
77-
7873
void OnNodeAttach(Node& node, Node& parent);
7974
void OnNodeDetach(Node& node, Node& parent);
8075

81-
void OnTurnAdmissionStart(Turn& turn);
82-
void OnTurnAdmissionEnd(Turn& turn);
83-
void OnTurnEnd(Turn& turn);
84-
85-
void OnTurnInputChange(Node& node, Turn& turn);
86-
void OnTurnPropagate(Turn& turn);
76+
void OnTurnInputChange(Node& node, TTurn& turn);
77+
void OnTurnPropagate(TTurn& turn);
8778

88-
void OnNodePulse(Node& node, Turn& turn);
89-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, Turn& turn);
79+
void OnNodePulse(Node& node, TTurn& turn);
80+
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
9081

9182
private:
92-
void applyShift(Node& node, Node& oldParent, Node& newParent, Turn& turn);
83+
void applyShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
9384

94-
void processChildren(Node& node, Turn& turn);
85+
void processChildren(Node& node, TTurn& turn);
9586
void invalidateSuccessors(Node& node);
9687

9788
TopoQueueT scheduledNodes_;
@@ -101,11 +92,22 @@ class TopoSortEngine :
10192
task_group tasks_;
10293
};
10394

95+
class BasicEngine : public EngineBase<Turn> {};
96+
class QueuingEngine : public DefaultQueuingEngine<EngineBase,Turn> {};
97+
10498
} // ~namespace toposort
10599
REACT_IMPL_END
106100

101+
////////////////////////////////////////////////////////////////////////////////////////
107102
REACT_BEGIN
108103

109-
using REACT_IMPL::toposort::TopoSortEngine;
104+
struct parallel;
105+
struct parallel_queuing;
106+
107+
template <typename TMode = parallel_queuing>
108+
class TopoSortEngine;
109+
110+
template <> class TopoSortEngine<parallel> : public REACT_IMPL::toposort::BasicEngine {};
111+
template <> class TopoSortEngine<parallel_queuing> : public REACT_IMPL::toposort::QueuingEngine {};
110112

111113
REACT_END

include/react/propagation/TopoSortSTEngine.h

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,47 +32,52 @@ class Node : public IReactiveNode
3232
////////////////////////////////////////////////////////////////////////////////////////
3333
/// Turn
3434
////////////////////////////////////////////////////////////////////////////////////////
35-
class Turn :
36-
public TurnBase
35+
class Turn : public TurnBase
3736
{
3837
public:
3938
Turn(TurnIdT id, TurnFlagsT flags);
4039
};
4140

4241
////////////////////////////////////////////////////////////////////////////////////////
43-
/// TopoSortSTEngine
42+
/// EngineBase
4443
////////////////////////////////////////////////////////////////////////////////////////
45-
class TopoSortSTEngine : public IReactiveEngine<Node,Turn>
44+
template <typename TTurn>
45+
class EngineBase : public IReactiveEngine<Node,TTurn>
4646
{
4747
public:
4848
typedef TopoQueue<Node> TopoQueue;
4949

50-
TopoSortSTEngine();
51-
5250
void OnNodeAttach(Node& node, Node& parent);
5351
void OnNodeDetach(Node& node, Node& parent);
5452

55-
void OnTurnInputChange(Node& node, Turn& turn);
53+
void OnTurnInputChange(Node& node, TTurn& turn);
5654
void OnTurnPropagate(Turn& turn);
5755

58-
void OnNodePulse(Node& node, Turn& turn);
59-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, Turn& turn);
60-
61-
template <typename F>
62-
bool TryMerge(F&&) { return false; }
56+
void OnNodePulse(Node& node, TTurn& turn);
57+
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
6358

6459
private:
65-
void processChildren(Node& node, Turn& turn);
60+
void processChildren(Node& node, TTurn& turn);
6661
void invalidateSuccessors(Node& node);
6762

6863
TopoQueue scheduledNodes_;
6964
};
7065

66+
class BasicEngine : public EngineBase<Turn> {};
67+
class QueuingEngine : public DefaultQueuingEngine<EngineBase,Turn> {};
68+
7169
} // ~namespace toposort_st
7270
REACT_IMPL_END
7371

7472
REACT_BEGIN
7573

76-
using REACT_IMPL::toposort_st::TopoSortSTEngine;
74+
struct sequential;
75+
struct sequential_queuing;
76+
77+
template <typename TMode>
78+
class TopoSortEngine;
79+
80+
template <> class TopoSortEngine<sequential> : public REACT_IMPL::toposort_st::BasicEngine {};
81+
template <> class TopoSortEngine<sequential_queuing> : public REACT_IMPL::toposort_st::QueuingEngine {};
7782

7883
REACT_END

src/benchmark/Main.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ namespace {
2727
using namespace react;
2828

2929
REACTIVE_DOMAIN(FloodingDomain, FloodingEngine<>, EventLog);
30-
REACTIVE_DOMAIN(TopoSortDomain, TopoSortEngine, EventLog);
30+
REACTIVE_DOMAIN(TopoSortDomain, TopoSortEngine<>, EventLog);
3131
//REACTIVE_DOMAIN(TopoSortO1Domain, TopoSortO1Engine, EventLog);
3232
REACTIVE_DOMAIN(PulseCountDomain, PulseCountEngine<>, EventLog);
33-
REACTIVE_DOMAIN(SourceSetDomain, SourceSetEngine, EventLog);
34-
REACTIVE_DOMAIN(TopoSortSTDomain, TopoSortSTEngine, EventLog);
35-
REACTIVE_DOMAIN(PulseCountO1Domain, PulseCountO1Engine, EventLog);
33+
REACTIVE_DOMAIN(SourceSetDomain, SourceSetEngine<>, EventLog);
34+
REACTIVE_DOMAIN(TopoSortSTDomain, TopoSortEngine<sequential>, EventLog);
35+
REACTIVE_DOMAIN(PulseCountO1Domain, PulseCountO1Engine<>, EventLog);
3636
REACTIVE_DOMAIN(ELMDomain, ELMEngine<>, EventLog);
3737

3838
REACTIVE_DOMAIN(BFloodingDomain, FloodingEngine<>);
39-
REACTIVE_DOMAIN(BTopoSortDomain, TopoSortEngine);
39+
REACTIVE_DOMAIN(BTopoSortDomain, TopoSortEngine<>);
4040
//REACTIVE_DOMAIN(BTopoSortO1Domain, TopoSortO1Engine);
4141
REACTIVE_DOMAIN(BPulseCountDomain, PulseCountEngine<>);
42-
REACTIVE_DOMAIN(BSourceSetDomain, SourceSetEngine);
43-
REACTIVE_DOMAIN(BTopoSortSTDomain, TopoSortSTEngine);
44-
REACTIVE_DOMAIN(BPulseCountO1Domain, PulseCountO1Engine);
42+
REACTIVE_DOMAIN(BSourceSetDomain, SourceSetEngine<>);
43+
REACTIVE_DOMAIN(BTopoSortSTDomain, TopoSortEngine<sequential>);
44+
REACTIVE_DOMAIN(BPulseCountO1Domain, PulseCountO1Engine<>);
4545
REACTIVE_DOMAIN(BELMDomain, ELMEngine<>);
4646

4747
void runBenchmarkGrid(std::ostream& out)

0 commit comments

Comments
 (0)