Skip to content

Commit aa83f77

Browse files
updated parallel_for and taskflow.hpp
1 parent 49c862b commit aa83f77

2 files changed

Lines changed: 22 additions & 20 deletions

File tree

example/parallel_for.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "taskflow.hpp"
22
#include <cassert>
3+
#include <numeric>
34

45
// Function: fib
56
int fib(int n) {
@@ -23,13 +24,13 @@ void sequential(int N) {
2324

2425
// Procedure: taskflow
2526
void taskflow(int N) {
27+
28+
std::vector<int> range(N);
29+
std::iota(range.begin(), range.end(), 0);
30+
2631
auto tbeg = std::chrono::steady_clock::now();
2732
tf::Taskflow tf;
28-
std::vector<int> range(N);
29-
for(int n=0; n<N; ++n) {
30-
range[n] = n;
31-
}
32-
tf.parallel_for(range.begin(), range.end(), [&] (int& i) {
33+
tf.parallel_for(range, [&] (const int i) {
3334
printf("fib[%d]=%d\n", i, fib(i));
3435
});
3536
tf.wait_for_all();
@@ -42,10 +43,14 @@ void taskflow(int N) {
4243

4344
// Procedure: openmp
4445
void openmp(int N) {
46+
47+
std::vector<int> range(N);
48+
std::iota(range.begin(), range.end(), 0);
49+
4550
auto tbeg = std::chrono::steady_clock::now();
4651
#pragma omp parallel for
47-
for(int i=0; i<N; ++i) {
48-
printf("fib[%d]=%d\n", i, fib(i));
52+
for(size_t i=0; i<N; ++i) {
53+
printf("fib[%d]=%d\n", range[i], fib(range[i]));
4954
}
5055
auto tend = std::chrono::steady_clock::now();
5156
std::cout << "openmp version takes "

taskflow.hpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,10 @@ class BasicTaskflow {
438438
auto wait_for_all();
439439

440440
template <typename I, typename C>
441-
auto parallel_for(I, I, C&&, ssize_t = 1);
441+
auto parallel_for(I, I, C&&, size_t = 1);
442442

443443
template <typename T, typename C, std::enable_if_t<is_iterable_v<T>, void>* = nullptr>
444-
auto parallel_for(T&, C&&, ssize_t = 1);
444+
auto parallel_for(T&, C&&, size_t = 1);
445445

446446
//template<typename I, class C>
447447
//auto parallel_range(const I, const I, C&&, ssize_t = 1);
@@ -847,28 +847,25 @@ auto BasicTaskflow<F>::emplace(C&&... cs) {
847847
// Function: parallel_for
848848
template <typename F>
849849
template <typename I, class C>
850-
auto BasicTaskflow<F>::parallel_for(I beg, I end, C&& c, ssize_t group) {
850+
auto BasicTaskflow<F>::parallel_for(I beg, I end, C&& c, size_t group) {
851851

852852
if(group <= 0) {
853853
group = 1;
854854
}
855855

856856
auto source = placeholder();
857857
auto target = placeholder();
858-
auto len = std::distance(beg, end);
859858

860-
for(; beg != end;) {
859+
for(; beg != end; ) {
861860
auto e = beg;
862-
std::advance(e, group < len ? group : len);
863-
len -= group;
864-
865-
auto task = silent_emplace([c, itr=beg, e]() mutable {
866-
for(;itr!=e; itr++){
867-
c(*itr);
861+
for(size_t i=0; i<group && e != end; ++e, ++i);
862+
auto task = silent_emplace([c, beg, e] () mutable {
863+
for(auto itr = beg; itr != e; ++itr) {
864+
c(*itr);
868865
}
869866
});
870867
beg = e;
871-
868+
872869
source.precede(task);
873870
task.precede(target);
874871
}
@@ -879,7 +876,7 @@ auto BasicTaskflow<F>::parallel_for(I beg, I end, C&& c, ssize_t group) {
879876
// Function: parallel_for
880877
template <typename F>
881878
template <typename T, typename C, std::enable_if_t<is_iterable_v<T>, void>*>
882-
auto BasicTaskflow<F>::parallel_for(T& t, C&& c, ssize_t group) {
879+
auto BasicTaskflow<F>::parallel_for(T& t, C&& c, size_t group) {
883880
return parallel_for(t.begin(), t.end(), std::forward<C>(c), group);
884881
}
885882

0 commit comments

Comments
 (0)