| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent dea5a35 commit f254d69
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -260,7 +260,7 @@ set_target_properties(taskflow_test_tmp PROPERTIES OUTPUT_NAME "taskflow") | |||
| 260 | 260 | add_test(builder ${TF_UTEST_DIR}/taskflow -tc=Builder) | |
| 261 | 261 | add_test(creation ${TF_UTEST_DIR}/taskflow -tc=Creation) | |
| 262 | 262 | add_test(dispatch ${TF_UTEST_DIR}/taskflow -tc=Dispatch) | |
| 263 | - add_test(multiple_runs ${TF_UTEST_DIR}/taskflow -tc=MultipleRuns) | ||
| 263 | + add_test(sequential_runs ${TF_UTEST_DIR}/taskflow -tc=SequentialRuns) | ||
| 264 | 264 | add_test(parallel_runs ${TF_UTEST_DIR}/taskflow -tc=ParallelRuns) | |
| 265 | 265 | add_test(parallel_for ${TF_UTEST_DIR}/taskflow -tc=ParallelFor) | |
| 266 | 266 | add_test(parallel_for_idx ${TF_UTEST_DIR}/taskflow -tc=ParallelForOnIndex) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1002,8 +1002,10 @@ std::future<void> Executor::run_until(Taskflow& f, P&& pred, C&& c) { | |||
| 1002 | 1002 | ||
| 1003 | 1003 | // Special case of predicate | |
| 1004 | 1004 | if(std::invoke(pred)) { | |
| 1005 | + std::promise<void> promise; | ||
| 1006 | + promise.set_value(); | ||
| 1005 | 1007 | _decrement_topology_and_notify(); | |
| 1006 | - return std::async(std::launch::deferred, [](){}); | ||
| 1008 | + return promise.get_future(); | ||
| 1007 | 1009 | } | |
| 1008 | 1010 | ||
| 1009 | 1011 | // Special case of zero workers requires: | |
@@ -1031,10 +1033,12 @@ std::future<void> Executor::run_until(Taskflow& f, P&& pred, C&& c) { | |||
| 1031 | 1033 | if(tpg._call != nullptr) { | |
| 1032 | 1034 | std::invoke(tpg._call); | |
| 1033 | 1035 | } | |
| 1036 | + | ||
| 1037 | + tpg._promise.set_value(); | ||
| 1034 | 1038 | ||
| 1035 | 1039 | _decrement_topology_and_notify(); | |
| 1036 | 1040 | ||
| 1037 | - return std::async(std::launch::deferred, [](){}); | ||
| 1041 | + return tpg._promise.get_future(); | ||
| 1038 | 1042 | } | |
| 1039 | 1043 | ||
| 1040 | 1044 | // Multi-threaded execution. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -97,7 +97,9 @@ TEST_CASE("Builder" * doctest::timeout(300)) { | |||
| 97 | 97 | SUBCASE("LinearCounter"){ | |
| 98 | 98 | for(size_t i=0;i<num_tasks;i++){ | |
| 99 | 99 | tasks.emplace_back( | |
| 100 | - taskflow.emplace([&counter, i]() { REQUIRE(counter == i); counter += 1;}) | ||
| 100 | + taskflow.emplace([&counter, i]() { | ||
| 101 | + REQUIRE(counter == i); counter += 1;} | ||
| 102 | + ) | ||
| 101 | 103 | ); | |
| 102 | 104 | if(i>0){ | |
| 103 | 105 | taskflow.precede(tasks[i-1], tasks[i]); | |
@@ -124,7 +126,9 @@ TEST_CASE("Builder" * doctest::timeout(300)) { | |||
| 124 | 126 | SUBCASE("Gather"){ | |
| 125 | 127 | auto dst = taskflow.emplace([&]() { REQUIRE(counter == num_tasks - 1);}); | |
| 126 | 128 | for(size_t i=1;i<num_tasks;i++){ | |
| 127 | - silent_tasks.emplace_back(taskflow.emplace([&counter]() {counter += 1;})); | ||
| 129 | + silent_tasks.emplace_back( | ||
| 130 | + taskflow.emplace([&counter]() {counter += 1;}) | ||
| 131 | + ); | ||
| 128 | 132 | } | |
| 129 | 133 | dst.gather(silent_tasks); | |
| 130 | 134 | executor.run(taskflow).get(); | |
@@ -135,7 +139,9 @@ TEST_CASE("Builder" * doctest::timeout(300)) { | |||
| 135 | 139 | SUBCASE("MapReduce"){ | |
| 136 | 140 | auto src = taskflow.emplace([&counter]() {counter = 0;}); | |
| 137 | 141 | for(size_t i=0;i<num_tasks;i++){ | |
| 138 | - silent_tasks.emplace_back(taskflow.emplace([&counter]() {counter += 1;})); | ||
| 142 | + silent_tasks.emplace_back( | ||
| 143 | + taskflow.emplace([&counter]() {counter += 1;}) | ||
| 144 | + ); | ||
| 139 | 145 | } | |
| 140 | 146 | taskflow.broadcast(src, silent_tasks); | |
| 141 | 147 | auto dst = taskflow.emplace( | |
@@ -149,7 +155,9 @@ TEST_CASE("Builder" * doctest::timeout(300)) { | |||
| 149 | 155 | SUBCASE("Linearize"){ | |
| 150 | 156 | for(size_t i=0;i<num_tasks;i++){ | |
| 151 | 157 | silent_tasks.emplace_back( | |
| 152 | - taskflow.emplace([&counter, i]() { REQUIRE(counter == i); counter += 1;}) | ||
| 158 | + taskflow.emplace([&counter, i]() { | ||
| 159 | + REQUIRE(counter == i); counter += 1;} | ||
| 160 | + ) | ||
| 153 | 161 | ); | |
| 154 | 162 | } | |
| 155 | 163 | taskflow.linearize(silent_tasks); | |
@@ -162,7 +170,9 @@ TEST_CASE("Builder" * doctest::timeout(300)) { | |||
| 162 | 170 | auto src = taskflow.emplace([&counter]() {counter = 0;}); | |
| 163 | 171 | for(size_t i=0;i<num_tasks;i++){ | |
| 164 | 172 | silent_tasks.emplace_back( | |
| 165 | - taskflow.emplace([&counter, i]() { REQUIRE(counter == i); counter += 1; }) | ||
| 173 | + taskflow.emplace([&counter, i]() { | ||
| 174 | + REQUIRE(counter == i); counter += 1; } | ||
| 175 | + ) | ||
| 166 | 176 | ); | |
| 167 | 177 | } | |
| 168 | 178 | taskflow.broadcast(src, silent_tasks); | |
@@ -215,9 +225,9 @@ TEST_CASE("Creation" * doctest::timeout(300)) { | |||
| 215 | 225 | } | |
| 216 | 226 | ||
| 217 | 227 | // -------------------------------------------------------- | |
| 218 | - // Testcase: Run | ||
| 228 | + // Testcase: SequentialRun | ||
| 219 | 229 | // -------------------------------------------------------- | |
| 220 | - TEST_CASE("Run" * doctest::timeout(300)) { | ||
| 230 | + TEST_CASE("SequentialRun" * doctest::timeout(300)) { | ||
| 221 | 231 | ||
| 222 | 232 | using namespace std::chrono_literals; | |
| 223 | 233 | ||
@@ -233,13 +243,15 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 233 | 243 | std::vector<tf::Task> silent_tasks; | |
| 234 | 244 | ||
| 235 | 245 | for(size_t i=0;i<num_tasks;i++){ | |
| 236 | - silent_tasks.emplace_back(taskflow.emplace([&counter]() {counter += 1;})); | ||
| 246 | + silent_tasks.emplace_back( | ||
| 247 | + taskflow.emplace([&counter]() {counter += 1;}) | ||
| 248 | + ); | ||
| 237 | 249 | } | |
| 238 | 250 | ||
| 239 | 251 | SUBCASE("RunOnce"){ | |
| 240 | 252 | auto fu = executor.run(taskflow); | |
| 241 | 253 | REQUIRE(taskflow.num_nodes() == num_tasks); | |
| 242 | - REQUIRE(fu.wait_for(1s) == std::future_status::ready); | ||
| 254 | + fu.get(); | ||
| 243 | 255 | REQUIRE(counter == num_tasks); | |
| 244 | 256 | } | |
| 245 | 257 | ||
@@ -249,7 +261,7 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 249 | 261 | REQUIRE(counter == num_tasks); | |
| 250 | 262 | } | |
| 251 | 263 | ||
| 252 | - SUBCASE("RunVariants") { | ||
| 264 | + SUBCASE("RunWithFuture") { | ||
| 253 | 265 | // Empty subflow test | |
| 254 | 266 | for(unsigned W=0; W<=4; ++W) { | |
| 255 | 267 | ||
@@ -271,7 +283,7 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 271 | 283 | C.precede(D); | |
| 272 | 284 | ||
| 273 | 285 | tf::Executor executor(W); | |
| 274 | - std::list<std::shared_future<void>> fu_list; | ||
| 286 | + std::list<std::future<void>> fu_list; | ||
| 275 | 287 | for(size_t i=0; i<500; i++) { | |
| 276 | 288 | if(i == 499) { | |
| 277 | 289 | executor.run(f).get(); // Synchronize the first 500 runs | |
@@ -281,20 +293,26 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 281 | 293 | fu_list.push_back(executor.run(f)); | |
| 282 | 294 | } | |
| 283 | 295 | else { | |
| 284 | - fu_list.push_back(executor.run(f, [&, i=i](){ REQUIRE(count == (i+1)*7); })); | ||
| 296 | + fu_list.push_back(executor.run(f, [&, i=i](){ | ||
| 297 | + REQUIRE(count == (i+1)*7); }) | ||
| 298 | + ); | ||
| 285 | 299 | } | |
| 286 | 300 | } | |
| 301 | + | ||
| 302 | + executor.wait_for_all(); | ||
| 287 | 303 | ||
| 288 | 304 | for(auto& fu: fu_list) { | |
| 289 | - REQUIRE(fu.wait_for(std::chrono::seconds(0)) == std::future_status::ready); | ||
| 305 | + REQUIRE(fu.valid()); | ||
| 306 | + REQUIRE(fu.wait_for(std::chrono::seconds(1)) == std::future_status::ready); | ||
| 290 | 307 | } | |
| 291 | 308 | ||
| 292 | - executor.wait_for_all(); | ||
| 293 | - | ||
| 294 | 309 | REQUIRE(count == 7000); | |
| 295 | 310 | } | |
| 311 | + } | ||
| 312 | + | ||
| 313 | + SUBCASE("RunWithChange") { | ||
| 296 | 314 | ||
| 297 | - // TODO: test correctness when taskflow got changed between runs | ||
| 315 | + // test correctness when taskflow got changed between runs | ||
| 298 | 316 | for(unsigned W=0; W<=4; ++W) { | |
| 299 | 317 | ||
| 300 | 318 | std::atomic<size_t> count {0}; | |
@@ -329,7 +347,9 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 329 | 347 | executor.wait_for_all(); | |
| 330 | 348 | REQUIRE(count == 210); | |
| 331 | 349 | } | |
| 350 | + } | ||
| 332 | 351 | ||
| 352 | + SUBCASE("RunWithPred") { | ||
| 333 | 353 | // Test run_until | |
| 334 | 354 | for(unsigned W=0; W<=4; ++W) { | |
| 335 | 355 | ||
@@ -376,43 +396,39 @@ TEST_CASE("Run" * doctest::timeout(300)) { | |||
| 376 | 396 | ).get(); | |
| 377 | 397 | } | |
| 378 | 398 | } | |
| 379 | - } | ||
| 380 | 399 | ||
| 381 | - // -------------------------------------------------------- | ||
| 382 | - // Testcase: MultipleRuns | ||
| 383 | - // -------------------------------------------------------- | ||
| 384 | - TEST_CASE("MultipleRuns" * doctest::timeout(300)) { | ||
| 385 | - | ||
| 386 | - for(size_t W=0; W<=8; ++W) { | ||
| 387 | - tf::Executor executor(W); | ||
| 388 | - std::atomic<size_t> counter(0); | ||
| 400 | + SUBCASE("MultipleRuns") { | ||
| 401 | + for(size_t W=0; W<=8; ++W) { | ||
| 402 | + tf::Executor executor(W); | ||
| 403 | + std::atomic<size_t> counter(0); | ||
| 389 | 404 | ||
| 390 | - tf::Taskflow tf1, tf2, tf3, tf4; | ||
| 405 | + tf::Taskflow tf1, tf2, tf3, tf4; | ||
| 391 | 406 | ||
| 392 | - for(size_t n=0; n<16; ++n) { | ||
| 393 | - tf1.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 394 | - } | ||
| 395 | - | ||
| 396 | - for(size_t n=0; n<1024; ++n) { | ||
| 397 | - tf2.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 398 | - } | ||
| 399 | - | ||
| 400 | - for(size_t n=0; n<32; ++n) { | ||
| 401 | - tf3.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 402 | - } | ||
| 403 | - | ||
| 404 | - for(size_t n=0; n<128; ++n) { | ||
| 405 | - tf4.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 406 | - } | ||
| 407 | - | ||
| 408 | - for(int i=0; i<200; ++i) { | ||
| 409 | - executor.run(tf1); | ||
| 410 | - executor.run(tf2); | ||
| 411 | - executor.run(tf3); | ||
| 412 | - executor.run(tf4); | ||
| 407 | + for(size_t n=0; n<16; ++n) { | ||
| 408 | + tf1.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 409 | + } | ||
| 410 | + | ||
| 411 | + for(size_t n=0; n<1024; ++n) { | ||
| 412 | + tf2.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 413 | + } | ||
| 414 | + | ||
| 415 | + for(size_t n=0; n<32; ++n) { | ||
| 416 | + tf3.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 417 | + } | ||
| 418 | + | ||
| 419 | + for(size_t n=0; n<128; ++n) { | ||
| 420 | + tf4.emplace([&](){counter.fetch_add(1, std::memory_order_relaxed);}); | ||
| 421 | + } | ||
| 422 | + | ||
| 423 | + for(int i=0; i<200; ++i) { | ||
| 424 | + executor.run(tf1); | ||
| 425 | + executor.run(tf2); | ||
| 426 | + executor.run(tf3); | ||
| 427 | + executor.run(tf4); | ||
| 428 | + } | ||
| 429 | + executor.wait_for_all(); | ||
| 430 | + REQUIRE(counter == 240000); | ||
| 413 | 431 | } | |
| 414 | - executor.wait_for_all(); | ||
| 415 | - REQUIRE(counter == 240000); | ||
| 416 | 432 | } | |
| 417 | 433 | } | |
| 418 | 434 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments