Macaulay2 Engine
Loading...
Searching...
No Matches
res-tasking-example.cpp
Go to the documentation of this file.
1// run this with
2// clang++ -I`brew --prefix tbb@2021`/include -L`brew --prefix tbb@2021`/lib --std=c++17 -ltbb res-tasking-example.cpp -g -o example
3
32
33#include <tbb/tbb.h>
34#include <iostream>
35#include <vector>
36#include <memory>
37#include <unistd.h>
38#include <mutex>
39#include <thread>
40#include <chrono>
41#include <random>
42
43using Node = tbb::flow::continue_node<tbb::flow::continue_msg>;
44using NodePtr = std::shared_ptr<Node>;
45
46tbb::flow::graph G;
47std::vector<std::vector<NodePtr>> nodes; // nodes[lev][sldeg] is that particular node.
48
69
70//std::vector<Node> ourNodes;
71//std::vector<int> ourDependencies;
72
73// just for syncing the output in the nodes
74std::mutex myMutex;
75
76// randomizer
77std::random_device rd;
78std::mt19937 rng(rd());
79std::uniform_int_distribution<int> uni(250,1000);
80
81NodePtr createNode(tbb::flow::graph& G, int lev, int sldeg)
82{
83 return std::make_shared<Node>(G,
84 [lev, sldeg](const tbb::flow::continue_msg &msg)
85 {
86 int sleepTime = uni(rng);
87 std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));;
88 std::lock_guard<std::mutex> guard(myMutex);
89 std::cout << "computed lev=" << lev << " sldeg="
90 << sldeg << " sum=" << lev + sldeg
91 << " sleep time=" << sleepTime << std::endl;
92 return msg;
93 });
94}
95
96void makeDependencyGraph(int nlevels, int nslanted_degrees)
97{
98 for (int lev = 0; lev < nlevels; ++lev) nodes.emplace_back(std::vector<NodePtr>(nslanted_degrees));
99
100 // Create the nodes
101 for (int lev=0; lev<nlevels; ++lev)
102 for (int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
103 nodes[lev][sldeg] = createNode(G, lev, sldeg);
104
105 // Add the edges
106 for (int lev=0; lev<nlevels; ++lev)
107 for (int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
108 {
109 if (lev > 0)
110 tbb::flow::make_edge(* nodes[lev-1][sldeg], * nodes[lev][sldeg]);
111 if (sldeg > 0)
112 tbb::flow::make_edge(* nodes[lev][sldeg-1], * nodes[lev][sldeg]);
113 }
114}
115
116int main()
117{
118 std::cout << "Hi there, we have " << tbb::info::default_concurrency()
119 <<" thread(s) available." << std::endl;
120 const int nlevels = 5;
121 const int nslanted_degrees = 10;
122 makeDependencyGraph(nlevels,nslanted_degrees);
123
124 nodes[0][0]->try_put(tbb::flow::continue_msg());
125
126 G.wait_for_all();
127
128 for (int lev=0; lev<nlevels; ++lev)
129 for (int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
130 std::cout << "nodes[" << lev << "," << sldeg << "] = " << nodes[lev][sldeg] << std::endl;
131
132 return 0;
133}
NodePtr createNode(tbb::flow::graph &G, int lev, int sldeg)
std::uniform_int_distribution< int > uni(250, 1000)
std::mutex myMutex
std::shared_ptr< Node > NodePtr
tbb::flow::continue_node< tbb::flow::continue_msg > Node
std::vector< std::vector< NodePtr > > nodes
std::random_device rd
void makeDependencyGraph(int nlevels, int nslanted_degrees)
tbb::flow::graph G
std::mt19937 rng(rd())
int main()
Scratch task descriptor used by the standalone TBB dependency-graph example.