-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathgraph_loops.cpp
More file actions
96 lines (81 loc) · 2.4 KB
/
Copy pathgraph_loops.cpp
File metadata and controls
96 lines (81 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
Copyright (c) 2025 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#include <cstdio>
#include <tbb/tbb.h>
void tryPutLoop() {
const int limit = 3;
tbb::flow::graph g;
tbb::flow::function_node my_node{g, tbb::flow::unlimited,
[](const int& i) {
std::printf("my_node: %d\n", i);
return 0;
}
};
for (int count = 0; count < limit; ++count) {
my_node.try_put(count);
}
g.wait_for_all();
}
void inputNodeLoop() {
tbb::flow::graph g;
tbb::flow::input_node my_input{g,
[](tbb::flow_control& fc) {
const int limit = 3;
static int count = 0;
if (count >= limit)
fc.stop();
return count++;
}
};
tbb::flow::function_node my_node{g,
tbb::flow::unlimited,
[](const int& i) {
std::printf("my_node: %d\n", i);
return 0;
}
};
tbb::flow::make_edge(my_input, my_node);
my_input.activate();
g.wait_for_all();
}
static void warmupTBB();
int main() {
warmupTBB();
double try_put_time = 0.0, input_node_time = 0.0;
{
tbb::tick_count t0 = tbb::tick_count::now();
tryPutLoop();
try_put_time = (tbb::tick_count::now() - t0).seconds();
}
warmupTBB();
{
tbb::tick_count t0 = tbb::tick_count::now();
inputNodeLoop();
input_node_time = (tbb::tick_count::now() - t0).seconds();
}
std::printf("try_put_time == %f seconds\n", try_put_time);
std::printf("input_node_time == %f seconds\n", input_node_time);;
return 0;
}
static void warmupTBB() {
// This is a simple loop that should get workers started.
// oneTBB creates workers lazily on first use of the library
// so this hides the startup time when looking at trivial
// examples that do little real work.
tbb::parallel_for(0, tbb::info::default_concurrency(),
[=](int) {
tbb::tick_count t0 = tbb::tick_count::now();
while ((tbb::tick_count::now() - t0).seconds() < 0.01);
}
);
}