GitHub Viewer
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include
#include
#include
// ----------------------------------------------------------------------------
// Parallel Transform 1
// ----------------------------------------------------------------------------
template
void parallel_transform(size_t W) {
std::srand(static_cast(time(NULL)));
tf::Taskflow taskflow;
tf::Executor executor(W);
for(size_t N=0; N string {
return myFunction(x.second);
}, P());
subflow.join();
});
from.precede(to_ref);
from.precede(to_tgt);
executor.run(taskflow).wait();
/** Target entries much match. */
REQUIRE(std::equal(tgt.begin(), tgt.end(), ref.begin()));
}
}
// guided
TEST_CASE("ParallelTransform3.Guided.1thread") {
parallel_transform3(1);
parallel_transform3(1);
}
TEST_CASE("ParallelTransform3.Guided.2threads") {
parallel_transform3(2);
parallel_transform3(2);
}
TEST_CASE("ParallelTransform3.Guided.3threads") {
parallel_transform3(3);
parallel_transform3(3);
}
TEST_CASE("ParallelTransform3.Guided.4threads") {
parallel_transform3(4);
parallel_transform3(4);
}
// dynamic
TEST_CASE("ParallelTransform3.Dynamic.1thread") {
parallel_transform3(1);
parallel_transform3(1);
}
TEST_CASE("ParallelTransform3.Dynamic.2threads") {
parallel_transform3(2);
parallel_transform3(2);
}
TEST_CASE("ParallelTransform3.Dynamic.3threads") {
parallel_transform3(3);
parallel_transform3(3);
}
TEST_CASE("ParallelTransform3.Dynamic.4threads") {
parallel_transform3(4);
parallel_transform3(4);
}
// static
TEST_CASE("ParallelTransform3.Static.1thread") {
parallel_transform3(1);
parallel_transform3(1);
}
TEST_CASE("ParallelTransform3.Static.2threads") {
parallel_transform3(2);
parallel_transform3(2);
}
TEST_CASE("ParallelTransform3.Static.3threads") {
parallel_transform3(3);
parallel_transform3(3);
}
TEST_CASE("ParallelTransform3.Static.4threads") {
parallel_transform3(4);
parallel_transform3(4);
}
// random
TEST_CASE("ParallelTransform3.Random.1thread") {
parallel_transform3(1);
parallel_transform3(1);
}
TEST_CASE("ParallelTransform3.Random.2threads") {
parallel_transform3(2);
parallel_transform3(2);
}
TEST_CASE("ParallelTransform3.Random.3threads") {
parallel_transform3(3);
parallel_transform3(3);
}
TEST_CASE("ParallelTransform3.Random.4threads") {
parallel_transform3(4);
parallel_transform3(4);
}
// ----------------------------------------------------------------------------
// Closure Wrapper
// ----------------------------------------------------------------------------
int& GetThreadSpecificContext()
{
thread_local int context = 0;
return context;
}
const int UPPER = 1000;
TEST_CASE("ClosureWrapper.transform.Static" * doctest::timeout(300))
{
// Write a test case for using the taskwrapper on tf::transform
for (int tc = 1; tc < 16; tc++)
{
tf::Executor executor(tc);
std::atomic wrapper_called_count = 0;
tf::Taskflow taskflow;
std::vector range(UPPER, 0);
std::vector result(UPPER);
taskflow.transform(range.begin(), range.end(), begin(result),
[&](int) {
return GetThreadSpecificContext();
},
tf::StaticPartitioner(1, [&](auto&& task){
wrapper_called_count++;
GetThreadSpecificContext() = tc;
task();
GetThreadSpecificContext() = 0;
})
);
executor.run(taskflow).wait();
REQUIRE(wrapper_called_count == tc);
REQUIRE(result == std::vector(UPPER, tc));
}
}
// Implement for dynamic case for transform
TEST_CASE("ClosureWrapper.transform.Dynamic" * doctest::timeout(300))
{
for (int tc = 1; tc < 16; tc++)
{
tf::Executor executor(tc);
std::atomic wrapper_called_count = 0;
tf::Taskflow taskflow;
std::vector range(UPPER);
std::iota(range.begin(), range.end(), 0);
std::vector result(UPPER);
taskflow.transform(range.begin(), range.end(), begin(result),
[&](int){
return GetThreadSpecificContext();
},
tf::DynamicPartitioner(1, [&](auto&& task) {
wrapper_called_count++;
GetThreadSpecificContext() = tc;
task();
GetThreadSpecificContext() = 0;
})
);
executor.run(taskflow).wait();
REQUIRE(wrapper_called_count