3
3
#include " tatum/graph_visitors/GraphVisitor.hpp"
4
4
#include " tatum/TimingGraph.hpp"
5
5
6
- #ifdef TATUM_USE_CILK
7
- # include < cilk/cilk.h>
8
- # include < cilk/reducer_opadd.h>
9
- #endif
10
-
11
6
#ifdef TATUM_USE_TBB
12
7
# include < tbb/parallel_for_each.h>
13
8
# include < tbb/combinable.h>
@@ -18,8 +13,8 @@ namespace tatum {
18
13
/* *
19
14
* A parallel timing analyzer which traveres the timing graph in a levelized
20
15
* manner. However nodes within each level are processed in parallel using
21
- * Cilk Plus . If Cilk Plus is not available it operates serially and is
22
- * equivalent to the SerialWalker
16
+ * Thread Building Blocks (TBB) . If TBB is not available it operates serially and is
17
+ * equivalent to the SerialWalker.
23
18
*/
24
19
class ParallelLevelizedWalker : public TimingGraphWalker {
25
20
public:
@@ -28,19 +23,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
28
23
29
24
LevelId first_level = *tg.levels ().begin ();
30
25
auto nodes = tg.level_nodes (first_level);
31
- #if defined(TATUM_USE_CILK)
32
- // Use reducer for thread-safe sum
33
- cilk::reducer<cilk::op_add<size_t >> unconstrained_reducer (0 );
34
-
35
- cilk_for (auto iter = nodes.begin (); iter != nodes.end (); ++iter) {
36
- bool constrained = visitor.do_arrival_pre_traverse_node (tg, tc, *iter);
37
-
38
- if (!constrained) {
39
- *unconstrained_reducer += 1 ;
40
- }
41
- }
42
- num_unconstrained_startpoints_ = unconstrained_reducer.get_value ();
43
- #elif defined(TATUM_USE_TBB)
26
+ #if defined(TATUM_USE_TBB)
44
27
tbb::combinable<size_t > unconstrained_counter (zero);
45
28
46
29
tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
@@ -66,20 +49,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
66
49
void do_required_pre_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, GraphVisitor& visitor) override {
67
50
num_unconstrained_endpoints_ = 0 ;
68
51
const auto & po = tg.logical_outputs ();
69
- #if defined(TATUM_USE_CILK)
70
- // Use reducer for thread-safe sum
71
- cilk::reducer<cilk::op_add<size_t >> unconstrained_reducer (0 );
72
-
73
- cilk_for (auto iter = po.begin (); iter != po.end (); ++iter) {
74
- bool constrained = visitor.do_required_pre_traverse_node (tg, tc, *iter);
75
-
76
- if (!constrained) {
77
- *unconstrained_reducer += 1 ;
78
- }
79
- }
80
-
81
- num_unconstrained_endpoints_ = unconstrained_reducer.get_value ();
82
- #elif defined(TATUM_USE_TBB)
52
+ #if defined(TATUM_USE_TBB)
83
53
tbb::combinable<size_t > unconstrained_counter (zero);
84
54
85
55
tbb::parallel_for_each (po.begin (), po.end (), [&](auto node) {
@@ -106,11 +76,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
106
76
void do_arrival_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, const DelayCalculator& dc, GraphVisitor& visitor) override {
107
77
for (LevelId level_id : tg.levels ()) {
108
78
auto level_nodes = tg.level_nodes (level_id);
109
- #if defined(TATUM_USE_CILK)
110
- cilk_for (auto iter = level_nodes.begin (); iter != level_nodes.end (); ++iter) {
111
- visitor.do_arrival_traverse_node (tg, tc, dc, *iter);
112
- }
113
- #elif defined(TATUM_USE_TBB)
79
+ #if defined(TATUM_USE_TBB)
114
80
tbb::parallel_for_each (level_nodes.begin (), level_nodes.end (), [&](auto node) {
115
81
visitor.do_arrival_traverse_node (tg, tc, dc, node);
116
82
});
@@ -125,11 +91,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
125
91
void do_required_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, const DelayCalculator& dc, GraphVisitor& visitor) override {
126
92
for (LevelId level_id : tg.reversed_levels ()) {
127
93
auto level_nodes = tg.level_nodes (level_id);
128
- #if defined(TATUM_USE_CILK)
129
- cilk_for (auto iter = level_nodes.begin (); iter != level_nodes.end (); ++iter) {
130
- visitor.do_required_traverse_node (tg, tc, dc, *iter);
131
- }
132
- #elif defined(TATUM_USE_TBB)
94
+ #if defined(TATUM_USE_TBB)
133
95
tbb::parallel_for_each (level_nodes.begin (), level_nodes.end (), [&](auto node) {
134
96
visitor.do_required_traverse_node (tg, tc, dc, node);
135
97
});
@@ -143,11 +105,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
143
105
144
106
void do_update_slack_impl (const TimingGraph& tg, const DelayCalculator& dc, GraphVisitor& visitor) override {
145
107
auto nodes = tg.nodes ();
146
- #if defined(TATUM_USE_CILK)
147
- cilk_for (auto iter = nodes.begin (); iter != nodes.end (); ++iter) {
148
- visitor.do_slack_traverse_node (tg, dc, *iter);
149
- }
150
- #elif defined(TATUM_USE_TBB)
108
+ #if defined(TATUM_USE_TBB)
151
109
tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
152
110
visitor.do_slack_traverse_node (tg, dc, node);
153
111
});
@@ -161,14 +119,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
161
119
void do_reset_impl (const TimingGraph& tg, GraphVisitor& visitor) override {
162
120
auto nodes = tg.nodes ();
163
121
auto edges = tg.edges ();
164
- #if defined(TATUM_USE_CILK)
165
- cilk_for (auto node_iter = nodes.begin (); node_iter != nodes.end (); ++node_iter) {
166
- visitor.do_reset_node (*node_iter);
167
- }
168
- cilk_for (auto edge_iter = edges.begin (); edge_iter != edges.end (); ++edge_iter) {
169
- visitor.do_reset_edge (*edge_iter);
170
- }
171
- #elif defined(TATUM_USE_TBB)
122
+ #if defined(TATUM_USE_TBB)
172
123
tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
173
124
visitor.do_reset_node (node);
174
125
});
0 commit comments