Skip to content

Commit e3eb1e6

Browse files
added index-based parallel for
1 parent 996ad7a commit e3eb1e6

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

example/parallel_for.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ int fib(int n) {
88
return (fib(n-1) + fib(n-2))%1024;
99
}
1010

11-
// ------------------------------------------------------------------------------------------------
11+
// ----------------------------------------------------------------------------
1212

1313
// Procedure: sequential
1414
void sequential(int N) {
@@ -41,7 +41,7 @@ void taskflow(int N) {
4141
<< " ms\n";
4242
}
4343

44-
// ------------------------------------------------------------------------------------------------
44+
// ----------------------------------------------------------------------------
4545

4646
// Function: main
4747
int main(int argc, char* argv[]) {

taskflow/graph/flow_builder.hpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ class FlowBuilder {
2929
template <typename T, typename C, std::enable_if_t<is_iterable_v<T>, void>* = nullptr>
3030
auto parallel_for(T&, C&&, size_t = 0);
3131

32+
template <
33+
typename I,
34+
typename C,
35+
std::enable_if_t<std::is_arithmetic_v<I>, void>* = nullptr
36+
>
37+
auto parallel_for(I, I, I, C&&, size_t = 0);
38+
3239
template <typename I, typename T, typename B>
3340
auto reduce(I, I, T&, B&&);
3441

@@ -118,7 +125,6 @@ auto FlowBuilder::silent_emplace(C&&... cs) {
118125
return std::make_tuple(silent_emplace(std::forward<C>(cs))...);
119126
}
120127

121-
122128
// Function: parallel_for
123129
template <typename I, typename C>
124130
auto FlowBuilder::parallel_for(I beg, I end, C&& c, size_t g) {
@@ -168,6 +174,47 @@ auto FlowBuilder::parallel_for(T& t, C&& c, size_t group) {
168174
return parallel_for(t.begin(), t.end(), std::forward<C>(c), group);
169175
}
170176

177+
// Function: parallel_for
178+
template <
179+
typename I,
180+
typename C,
181+
std::enable_if_t<std::is_arithmetic_v<I>, void>* = nullptr
182+
>
183+
auto FlowBuilder::parallel_for(I beg, I end, I step, C&& c, size_t g) {
184+
185+
if(g == 0) {
186+
auto N = (end - beg + step - 1) / step;
187+
auto w = std::max(unsigned{1}, std::thread::hardware_concurrency());
188+
g = (N + w - 1) / w;
189+
}
190+
191+
auto source = placeholder();
192+
auto target = placeholder();
193+
194+
std::cout << "g is " << g << std::endl;
195+
196+
while(beg < end) {
197+
198+
auto e = beg + static_cast<I>(g) * step;
199+
200+
std::cout << beg << " " << e << std::endl;
201+
202+
// Create a task
203+
auto task = silent_emplace([beg, e, step, c] () mutable {
204+
for(auto i=beg; i<e; i+=step) {
205+
c(i);
206+
}
207+
});
208+
source.precede(task);
209+
task.precede(target);
210+
211+
// adjust the pointer
212+
beg = e;
213+
}
214+
215+
return std::make_pair(source, target);
216+
}
217+
171218
// Function: reduce_min
172219
// Find the minimum element over a range of items.
173220
template <typename I, typename T>

0 commit comments

Comments
 (0)