Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 10b730b

Browse files
committed
updated flow builder
1 parent 4104616 commit 10b730b

File tree

2 files changed

+77
-22
lines changed

2 files changed

+77
-22
lines changed

taskflow/core/flow_builder.hpp

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -610,40 +610,74 @@ std::pair<Task, Task> FlowBuilder::parallel_for(I beg, I end, I s, C&& c, size_t
610610

611611
// positive case
612612
if(beg < end) {
613-
while(beg < end) {
614-
size_t N = 0;
615-
auto e = beg;
616-
while(e < end && N < chunk) {
617-
e+=s;
618-
++N;
613+
size_t N=0;
614+
I b = beg;
615+
for(I e=beg; e<end; e+=s) {
616+
if(++N == chunk) {
617+
auto task = emplace([=] () mutable {
618+
for(size_t i=0; i<N; ++i, b+=s) {
619+
c(b);
620+
}
621+
});
622+
source.precede(task);
623+
task.precede(target);
624+
N = 0;
625+
b = e;
619626
}
627+
}
628+
629+
if(N) {
620630
auto task = emplace([=] () mutable {
621-
for(auto i=beg; i<e; i+=s) {
622-
c(i);
631+
for(size_t i=0; i<N; ++i, b+=s) {
632+
c(b);
623633
}
624634
});
625635
source.precede(task);
626636
task.precede(target);
627-
beg = e;
628637
}
629638
}
630639
else if(beg > end) {
631-
while(beg > end) {
632-
size_t N = 0;
633-
auto e = beg;
634-
while(e > end && N < chunk) {
635-
e+=s;
636-
++N;
640+
size_t N=0;
641+
I b = beg;
642+
for(I e=beg; e>end; e+=s) {
643+
if(++N == chunk) {
644+
auto task = emplace([=] () mutable {
645+
for(size_t i=0; i<N; ++i, b+=s) {
646+
c(b);
647+
}
648+
});
649+
source.precede(task);
650+
task.precede(target);
651+
N = 0;
652+
b = e;
637653
}
654+
}
655+
656+
if(N) {
638657
auto task = emplace([=] () mutable {
639-
for(auto i=beg; i>e; i+=s) {
640-
c(i);
658+
for(size_t i=0; i<N; ++i, b+=s) {
659+
c(b);
641660
}
642661
});
643662
source.precede(task);
644663
task.precede(target);
645-
beg = e;
646664
}
665+
//while(beg > end) {
666+
// size_t N = 0;
667+
// auto e = beg;
668+
// while(e > end && N < chunk) {
669+
// e+=s;
670+
// ++N;
671+
// }
672+
// auto task = emplace([=] () mutable {
673+
// for(size_t i=0; i<N; ++i, beg+=s) {
674+
// c(beg);
675+
// }
676+
// });
677+
// source.precede(task);
678+
// task.precede(target);
679+
// beg = e;
680+
//}
647681
}
648682
}
649683

unittests/basics.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -807,12 +807,23 @@ TEST_CASE("ParallelForOnIndex" * doctest::timeout(300)) {
807807
for(float end=beg; end<=10.0f; ++end) {
808808
for(float s=1.0f; s<=end-beg; s+=0.1f) {
809809
int n = 0;
810+
//std::cout << "positive testcase: " << beg << ' ' << end << ' ' << s << '\n';
810811
if(beg < end) {
811-
for(float b = beg; b < end; b += s) ++n;
812+
for(float b = beg; b < end; b += s) {
813+
//std::cout << b << ' ';
814+
++n;
815+
}
816+
//std::cout << std::endl;
812817
}
813818
else if(beg > end) {
814-
for(float b = beg; b > end; b += s) ++n;
819+
for(float b = beg; b > end; b += s) {
820+
std::cout << b << ' ';
821+
++n;
822+
}
823+
//std::cout << std::endl;
815824
}
825+
826+
//std::cout << "running taskflow\n";
816827
tf::Taskflow tf;
817828
std::atomic<int> counter {0};
818829
tf.parallel_for(beg, end, s, [&] (auto) {
@@ -832,12 +843,22 @@ TEST_CASE("ParallelForOnIndex" * doctest::timeout(300)) {
832843
for(float end=beg; end>=-10.0f; --end) {
833844
for(float s=1.0f; s<=beg-end; s+=0.1f) {
834845
int n = 0;
846+
//std::cout << "negative testcase: " << beg << ' ' << end << ' ' << s << '\n';
835847
if(beg < end) {
836-
for(float b = beg; b < end; b += (-s)) ++n;
848+
for(float b = beg; b < end; b += (-s)) {
849+
//std::cout << b << ' ';
850+
++n;
851+
}
852+
//std::cout << std::endl;
837853
}
838854
else if(beg > end) {
839-
for(float b = beg; b > end; b += (-s)) ++n;
855+
for(float b = beg; b > end; b += (-s)) {
856+
//std::cout << b << ' ';
857+
++n;
858+
}
859+
//std::cout << std::endl;
840860
}
861+
//std::cout << "running taskflow" << std::endl;
841862
tf::Taskflow tf;
842863
std::atomic<int> counter {0};
843864
tf.parallel_for(beg, end, -s, [&] (auto) {

0 commit comments

Comments
 (0)