Skip to content

Commit 333ece5

Browse files
Merge pull request taskflow#56 from gguo4/dev
add BFS workload to the levelgraph example
2 parents f15b5a2 + 6dea8db commit 333ece5

1 file changed

Lines changed: 78 additions & 11 deletions

File tree

benchmark/graph_traversal/levelgraph.hpp

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#ifndef _LEVEL_GRAPH_HPP
2+
#define _LEVEL_GRAPH_HPP
3+
14
#include <iostream>
25
#include <string>
36
#include <array>
@@ -9,24 +12,30 @@
912
#include <chrono>
1013
#include <cmath>
1114
#include <memory>
15+
#include <unordered_set>
16+
#include <ctime>
17+
#include <cstdlib>
1218

1319
#include <taskflow/taskflow.hpp>
1420
#include <tbb/task_scheduler_init.h>
1521
#include <tbb/flow_graph.h>
1622

23+
class LevelGraph;
24+
1725
class Node{
1826

1927
public:
2028

21-
Node(size_t level, int index, std::vector<int>& next_level_nodes){
22-
_level = level;
23-
_idx = index;
29+
Node(LevelGraph& graph, bool chosen, size_t level, int index, std::vector<int>& next_level_nodes)
30+
: _graph(graph), _chosen(chosen), _level(level), _idx(index) {
2431
_out_edges = std::move(next_level_nodes);
2532
}
2633

27-
void mark(){
28-
_visited = true;
29-
}
34+
//void mark(){
35+
// _visited = true;
36+
//}
37+
38+
inline void mark();
3039

3140
void unmark(){
3241
_visited = false;
@@ -56,6 +65,7 @@ class Node{
5665
}
5766

5867
int index() const { return _idx; }
68+
int level() const { return _level; }
5969

6070
int* edge_ptr(int edge_idx) { return &_out_edges[edge_idx]; }
6171

@@ -64,22 +74,28 @@ class Node{
6474

6575
private:
6676

77+
LevelGraph& _graph;
78+
bool _chosen {false};
6779
size_t _level;
6880
int _idx;
6981

7082
bool _visited {false};
7183
};
7284

85+
86+
7387
class LevelGraph {
7488

7589
public:
7690

77-
LevelGraph(size_t length, size_t level){
91+
LevelGraph(size_t length, size_t level, float threshold = 0.0f){
7892

7993
_level_num = level;
8094
_length_num = length;
8195

82-
std::mt19937 g(0); // fixed the seed
96+
std::mt19937 g(0); // fixed the seed for graph generator
97+
98+
std::srand(std::time(nullptr));
8399

84100
for(size_t l=0; l<level; ++l){
85101

@@ -113,7 +129,14 @@ class LevelGraph {
113129

114130
std::vector<int> edges(next_level_nodes.begin()+start, next_level_nodes.begin()+end);
115131

116-
cur_nodes.emplace_back(l, i, edges);
132+
//choose a node to do some work
133+
float rv = std::rand()/(RAND_MAX + 1u);
134+
bool chosen = false;
135+
if(rv < threshold){
136+
chosen = true;
137+
}
138+
139+
cur_nodes.emplace_back(*this, chosen, l, i, edges); //create nodes
117140

118141
if(re_shuffle){
119142
std::shuffle(next_level_nodes.begin(), next_level_nodes.end(), g);
@@ -139,7 +162,8 @@ class LevelGraph {
139162
}
140163
}
141164
}
142-
165+
166+
//print_graph();
143167

144168
}
145169

@@ -193,6 +217,41 @@ class LevelGraph {
193217
return size;
194218
}
195219

220+
//backward BFS given a destinatio node
221+
void BFS(const Node& dst){
222+
223+
std::unordered_set<int> idx_list;
224+
std::queue<int> idx_queue;
225+
226+
int dst_idx = dst.level()*_length_num + dst.index();
227+
idx_queue.push(dst_idx);
228+
idx_list.insert(dst_idx);
229+
230+
while(!idx_queue.empty()){
231+
int child = idx_queue.front();
232+
int child_level = child / _length_num;
233+
int child_index = child % _length_num;
234+
//std::cout << "Node level: " << child_level << " idx: " << child_index << std::endl;
235+
236+
idx_queue.pop();
237+
const Node& n = _graph[child_level][child_index];
238+
239+
for(size_t i=0; child_level>0 && i<n._in_edges.size(); i++){
240+
int parent_level = child_level-1;
241+
int parent_index = n._in_edges[i].first;
242+
int parent = parent_level*_length_num + parent_index;
243+
244+
if(idx_list.find(parent) == idx_list.end()){
245+
idx_queue.push(parent);
246+
idx_list.insert(parent);
247+
}
248+
}
249+
250+
}
251+
252+
}
253+
254+
196255
private:
197256

198257
const size_t _edge_max = 4;
@@ -203,12 +262,20 @@ class LevelGraph {
203262

204263
};
205264

265+
266+
inline void Node::mark(){
267+
_visited = true;
268+
if(_chosen == true){
269+
_graph.BFS(*this);
270+
}
271+
}
272+
206273
std::chrono::microseconds measure_time_taskflow(LevelGraph&, unsigned);
207274
std::chrono::microseconds measure_time_omp(LevelGraph&, unsigned);
208275
std::chrono::microseconds measure_time_tbb(LevelGraph&, unsigned);
209276

210277

211278

212-
279+
#endif
213280

214281

0 commit comments

Comments
 (0)