#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include #include #include // -------------------------------------------------------- // Testcase: inclusive_scan // -------------------------------------------------------- template void test_inclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i) { input[i] = std::to_string(::rand() % 10); } else { input[i] = ::rand() % 10; } } std::inclusive_scan( input.begin(), input.end(), golden.begin(), B() ); // out-of-place auto task1 = taskflow.inclusive_scan( input.begin(), input.end(), output.begin(), B() ); // enable stateful capture auto alloc = taskflow.emplace([&](){ sbeg = input.begin(); send = input.end(); dbeg = input.begin(); }); // in-place auto task2 = taskflow.inclusive_scan( std::ref(sbeg), std::ref(send), std::ref(dbeg), B() ); task1.precede(alloc); alloc.precede(task2); executor.run(taskflow).wait(); REQUIRE(input == golden); REQUIRE(output == golden); } } // int data type TEST_CASE("InclusiveScan.int+.1thread" * doctest::timeout(300)) { test_inclusive_scan>(1); } TEST_CASE("InclusiveScan.int+.2threads" * doctest::timeout(300)) { test_inclusive_scan>(2); } TEST_CASE("InclusiveScan.int+.3threads" * doctest::timeout(300)) { test_inclusive_scan>(3); } TEST_CASE("InclusiveScan.int+.4threads" * doctest::timeout(300)) { test_inclusive_scan>(4); } TEST_CASE("InclusiveScan.int+.8threads" * doctest::timeout(300)) { test_inclusive_scan>(8); } TEST_CASE("InclusiveScan.int+.12threads" * doctest::timeout(300)) { test_inclusive_scan>(12); } // int data type TEST_CASE("InclusiveScan.int*.1thread" * doctest::timeout(300)) { test_inclusive_scan>(1); } TEST_CASE("InclusiveScan.int*.2threads" * doctest::timeout(300)) { test_inclusive_scan>(2); } TEST_CASE("InclusiveScan.int*.3threads" * doctest::timeout(300)) { test_inclusive_scan>(3); } TEST_CASE("InclusiveScan.int*.4threads" * doctest::timeout(300)) { test_inclusive_scan>(4); } TEST_CASE("InclusiveScan.int*.8threads" * doctest::timeout(300)) { test_inclusive_scan>(8); } TEST_CASE("InclusiveScan.int*.12threads" * doctest::timeout(300)) { test_inclusive_scan>(12); } // string data type TEST_CASE("InclusiveScan.string.1thread" * doctest::timeout(300)) { test_inclusive_scan>(1); } TEST_CASE("InclusiveScan.string.2threads" * doctest::timeout(300)) { test_inclusive_scan>(2); } TEST_CASE("InclusiveScan.string.3threads" * doctest::timeout(300)) { test_inclusive_scan>(3); } TEST_CASE("InclusiveScan.string.4threads" * doctest::timeout(300)) { test_inclusive_scan>(4); } TEST_CASE("InclusiveScan.string.8threads" * doctest::timeout(300)) { test_inclusive_scan>(8); } TEST_CASE("InclusiveScan.string.12threads" * doctest::timeout(300)) { test_inclusive_scan>(12); } // -------------------------------------------------------- // Testcase: inclusive_scan with initial value // -------------------------------------------------------- template void test_initialized_inclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i) { input[i] = std::to_string(::rand() % 10); } else { input[i] = ::rand() % 10; } } T init; if constexpr(std::is_same_v) { init = std::to_string(::rand() % 10); } else { init = ::rand() % 10; } std::inclusive_scan( input.begin(), input.end(), golden.begin(), B(), init ); // out-of-place auto task1 = taskflow.inclusive_scan( input.begin(), input.end(), output.begin(), B(), init ); // enable stateful capture auto alloc = taskflow.emplace([&](){ sbeg = input.begin(); send = input.end(); dbeg = input.begin(); }); // in-place auto task2 = taskflow.inclusive_scan( std::ref(sbeg), std::ref(send), std::ref(dbeg), B(), init ); task1.precede(alloc); alloc.precede(task2); executor.run(taskflow).wait(); REQUIRE(input == golden); REQUIRE(output == golden); } } // int data type TEST_CASE("Initialized.InclusiveScan.int+.1thread" * doctest::timeout(300)) { test_initialized_inclusive_scan>(1); } TEST_CASE("Initialized.InclusiveScan.int+.2threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(2); } TEST_CASE("Initialized.InclusiveScan.int+.3threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(3); } TEST_CASE("Initialized.InclusiveScan.int+.4threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(4); } TEST_CASE("Initialized.InclusiveScan.int+.8threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(8); } TEST_CASE("Initialized.InclusiveScan.int+.12threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(12); } // int data type TEST_CASE("Initialized.InclusiveScan.int*.1thread" * doctest::timeout(300)) { test_initialized_inclusive_scan>(1); } TEST_CASE("Initialized.InclusiveScan.int*.2threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(2); } TEST_CASE("Initialized.InclusiveScan.int*.3threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(3); } TEST_CASE("Initialized.InclusiveScan.int*.4threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(4); } TEST_CASE("Initialized.InclusiveScan.int*.8threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(8); } TEST_CASE("Initialized.InclusiveScan.int*.12threads" * doctest::timeout(300)) { test_initialized_inclusive_scan>(12); } // -------------------------------------------------------- // Testcase: exclusive_scan // -------------------------------------------------------- template void test_exclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i) { input[i] = std::to_string(::rand() % 10); } else { input[i] = ::rand() % 10; } } T init; if constexpr(std::is_same_v) { init = std::to_string(::rand() % 10); } else { init = ::rand() % 10; } std::exclusive_scan( input.begin(), input.end(), golden.begin(), init, B() ); // out-of-place auto task1 = taskflow.exclusive_scan( input.begin(), input.end(), output.begin(), init, B() ); // enable stateful capture auto alloc = taskflow.emplace([&](){ sbeg = input.begin(); send = input.end(); dbeg = input.begin(); }); // in-place auto task2 = taskflow.exclusive_scan( std::ref(sbeg), std::ref(send), std::ref(dbeg), init, B() ); task1.precede(alloc); alloc.precede(task2); executor.run(taskflow).wait(); REQUIRE(input == golden); REQUIRE(output == golden); } } // int data type TEST_CASE("ExclusiveScan.int+.1thread" * doctest::timeout(300)) { test_exclusive_scan>(1); } TEST_CASE("ExclusiveScan.int+.2threads" * doctest::timeout(300)) { test_exclusive_scan>(2); } TEST_CASE("ExclusiveScan.int+.3threads" * doctest::timeout(300)) { test_exclusive_scan>(3); } TEST_CASE("ExclusiveScan.int+.4threads" * doctest::timeout(300)) { test_exclusive_scan>(4); } TEST_CASE("ExclusiveScan.int+.8threads" * doctest::timeout(300)) { test_exclusive_scan>(8); } TEST_CASE("ExclusiveScan.int+.12threads" * doctest::timeout(300)) { test_exclusive_scan>(12); } // int data type TEST_CASE("ExclusiveScan.int*.1thread" * doctest::timeout(300)) { test_exclusive_scan>(1); } TEST_CASE("ExclusiveScan.int*.2threads" * doctest::timeout(300)) { test_exclusive_scan>(2); } TEST_CASE("ExclusiveScan.int*.3threads" * doctest::timeout(300)) { test_exclusive_scan>(3); } TEST_CASE("ExclusiveScan.int*.4threads" * doctest::timeout(300)) { test_exclusive_scan>(4); } TEST_CASE("ExclusiveScan.int*.8threads" * doctest::timeout(300)) { test_exclusive_scan>(8); } TEST_CASE("ExclusiveScan.int*.12threads" * doctest::timeout(300)) { test_exclusive_scan>(12); } // string data type TEST_CASE("ExclusiveScan.string.1thread" * doctest::timeout(300)) { test_exclusive_scan>(1); } TEST_CASE("ExclusiveScan.string.2threads" * doctest::timeout(300)) { test_exclusive_scan>(2); } TEST_CASE("ExclusiveScan.string.3threads" * doctest::timeout(300)) { test_exclusive_scan>(3); } TEST_CASE("ExclusiveScan.string.4threads" * doctest::timeout(300)) { test_exclusive_scan>(4); } TEST_CASE("ExclusiveScan.string.8threads" * doctest::timeout(300)) { test_exclusive_scan>(8); } TEST_CASE("ExclusiveScan.string.12threads" * doctest::timeout(300)) { test_exclusive_scan>(12); } // -------------------------------------------------------- // Testcase: transform_inclusive_scan // -------------------------------------------------------- template void test_transform_inclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i>(1); } TEST_CASE("TransformedInclusiveScan.int+.2threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(2); } TEST_CASE("TransformedInclusiveScan.int+.3threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(3); } TEST_CASE("TransformedInclusiveScan.int+.4threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(4); } TEST_CASE("TransformedInclusiveScan.int+.8threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(8); } TEST_CASE("TransformedInclusiveScan.int+.12threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(12); } // int data type TEST_CASE("TransformedInclusiveScan.int*.1thread" * doctest::timeout(300)) { test_transform_inclusive_scan>(1); } TEST_CASE("TransformedInclusiveScan.int*.2threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(2); } TEST_CASE("TransformedInclusiveScan.int*.3threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(3); } TEST_CASE("TransformedInclusiveScan.int*.4threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(4); } TEST_CASE("TransformedInclusiveScan.int*.8threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(8); } TEST_CASE("TransformedInclusiveScan.int*.12threads" * doctest::timeout(300)) { test_transform_inclusive_scan>(12); } // -------------------------------------------------------- // Testcase: initialized_transform_inclusive_scan // -------------------------------------------------------- template void test_initialized_transform_inclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i>(1); } TEST_CASE("Initialized.TransformedInclusiveScan.int+.2threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(2); } TEST_CASE("Initialized.TransformedInclusiveScan.int+.3threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(3); } TEST_CASE("Initialized.TransformedInclusiveScan.int+.4threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(4); } TEST_CASE("Initialized.TransformedInclusiveScan.int+.8threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(8); } TEST_CASE("Initialized.TransformedInclusiveScan.int+.12threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(12); } // int data type TEST_CASE("Initialized.TransformedInclusiveScan.int*.1thread" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(1); } TEST_CASE("Initialized.TransformedInclusiveScan.int*.2threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(2); } TEST_CASE("Initialized.TransformedInclusiveScan.int*.3threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(3); } TEST_CASE("Initialized.TransformedInclusiveScan.int*.4threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(4); } TEST_CASE("Initialized.TransformedInclusiveScan.int*.8threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(8); } TEST_CASE("Initialized.TransformedInclusiveScan.int*.12threads" * doctest::timeout(300)) { test_initialized_transform_inclusive_scan>(12); } // -------------------------------------------------------- // Testcase: transform_exclusive_scan // -------------------------------------------------------- template void test_transform_exclusive_scan(unsigned W) { tf::Executor executor(W); tf::Taskflow taskflow; size_t limit = std::is_same_v ? 2500 : 250000; for(size_t n=0; n<=limit; n=n*2+1) { taskflow.clear(); std::vector input(n), output(n), golden(n); typename std::vector::iterator sbeg, send, dbeg; for(size_t i=0; i>(1); } TEST_CASE("TransformedExclusiveScan.int+.2threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(2); } TEST_CASE("TransformedExclusiveScan.int+.3threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(3); } TEST_CASE("TransformedExclusiveScan.int+.4threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(4); } TEST_CASE("TransformedExclusiveScan.int+.8threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(8); } TEST_CASE("TransformedExclusiveScan.int+.12threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(12); } // int data type TEST_CASE("TransformedExclusiveScan.int*.1thread" * doctest::timeout(300)) { test_transform_exclusive_scan>(1); } TEST_CASE("TransformedExclusiveScan.int*.2threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(2); } TEST_CASE("TransformedExclusiveScan.int*.3threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(3); } TEST_CASE("TransformedExclusiveScan.int*.4threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(4); } TEST_CASE("TransformedExclusiveScan.int*.8threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(8); } TEST_CASE("TransformedExclusiveScan.int*.12threads" * doctest::timeout(300)) { test_transform_exclusive_scan>(12); }