33#include " tatum/graph_visitors/GraphVisitor.hpp"
44#include " tatum/TimingGraph.hpp"
55
6- #ifdef TATUM_USE_CILK
7- # include < cilk/cilk.h>
8- # include < cilk/reducer_opadd.h>
9- #endif
10-
116#ifdef TATUM_USE_TBB
127# include < tbb/parallel_for_each.h>
138# include < tbb/combinable.h>
@@ -18,8 +13,8 @@ namespace tatum {
1813/* *
1914 * A parallel timing analyzer which traveres the timing graph in a levelized
2015 * 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.
2318 */
2419class ParallelLevelizedWalker : public TimingGraphWalker {
2520 public:
@@ -28,19 +23,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
2823
2924 LevelId first_level = *tg.levels ().begin ();
3025 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)
4427 tbb::combinable<size_t > unconstrained_counter (zero);
4528
4629 tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
@@ -66,20 +49,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
6649 void do_required_pre_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, GraphVisitor& visitor) override {
6750 num_unconstrained_endpoints_ = 0 ;
6851 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)
8353 tbb::combinable<size_t > unconstrained_counter (zero);
8454
8555 tbb::parallel_for_each (po.begin (), po.end (), [&](auto node) {
@@ -106,11 +76,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
10676 void do_arrival_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, const DelayCalculator& dc, GraphVisitor& visitor) override {
10777 for (LevelId level_id : tg.levels ()) {
10878 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)
11480 tbb::parallel_for_each (level_nodes.begin (), level_nodes.end (), [&](auto node) {
11581 visitor.do_arrival_traverse_node (tg, tc, dc, node);
11682 });
@@ -125,11 +91,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
12591 void do_required_traversal_impl (const TimingGraph& tg, const TimingConstraints& tc, const DelayCalculator& dc, GraphVisitor& visitor) override {
12692 for (LevelId level_id : tg.reversed_levels ()) {
12793 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)
13395 tbb::parallel_for_each (level_nodes.begin (), level_nodes.end (), [&](auto node) {
13496 visitor.do_required_traverse_node (tg, tc, dc, node);
13597 });
@@ -143,11 +105,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
143105
144106 void do_update_slack_impl (const TimingGraph& tg, const DelayCalculator& dc, GraphVisitor& visitor) override {
145107 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)
151109 tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
152110 visitor.do_slack_traverse_node (tg, dc, node);
153111 });
@@ -161,14 +119,7 @@ class ParallelLevelizedWalker : public TimingGraphWalker {
161119 void do_reset_impl (const TimingGraph& tg, GraphVisitor& visitor) override {
162120 auto nodes = tg.nodes ();
163121 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)
172123 tbb::parallel_for_each (nodes.begin (), nodes.end (), [&](auto node) {
173124 visitor.do_reset_node (node);
174125 });
0 commit comments