docs/release-3-6-0.html
Taskflow 3.6.0 is the 7th release in the 3.x line! This release includes several new changes, such as dynamic task graph parallelism, improved parallel algorithms, modified GPU tasking interface, documentation, examples, and unit tests.
Taskflow 3.6.0 can be downloaded from here.
To use Taskflow v3.6.0, you need a compiler that supports C++17:
Taskflow works on Linux, Windows, and Mac OS X.
This release contains several changes to largely enhance the programmability of GPU tasking and standard parallel algorithms. More importantly, we have introduced a new dependent asynchronous tasking model that offers great flexibility for expressing dynamic task graph parallelism.
Added new async methods to support dynamic task graph creation
Added new async and join methods to tf::Runtime
Added a new partitioner interface to optimize parallel algorithms
Added parallel-scan algorithms to Taskflow
Added parallel-find algorithms to Taskflow
Modified tf::Subflow as a derived class from tf::Runtime
Extended parallel algorithms to support different partitioning algorithms
Improved the performance of tf::Taskflow::sort for plain-old-data (POD) type
MAX_PRIORITY wtih winspool.h (#459)If you encounter any potential bugs, please submit an issue at issue tracker.
// previous - no longer supportedtf::Future\<int\> fu = executor.async([](){return 1;});fu.cancel();std::optional\<int\> res = fu.get();// res may be std::nullopt or 1// now - use std::future insteadstd::future\<int\> fu = executor.async([](){return 1;});int res = fu.get();
// previous - no longer supportedtaskflow.emplace([](tf::cudaFlow& cf){cf.offload();});// now - user to fully control tf::cudaFlow for maximum flexibilitytaskflow.emplace([](){tf::cudaFlow cf;// offload the cudaflow asynchronously through a streamtf::cudaStream stream;cf.run(stream);// wait for the cudaflow completesstream.synchronize();});
// previous - now longer supportedtaskflow.emplace([](tf::cudaFlowCapturer& cf){cf.offload();});// now - user to fully control tf::cudaFlowCapturer for maximum flexibilitytaskflow.emplace([](){tf::cudaFlowCapturer cf;// offload the cudaflow asynchronously through a streamtf::cudaStream stream;cf.run(stream);// wait for the cudaflow completesstream.synchronize();});
Dropped in-place support for running tf::syclFlow from a dedicated task
Move all buffer query methods of CUDA standard algorithms inside execution policy
// previous - no longer supportedtf::cuda\_reduce\_buffer\_size\<tf::cudaDefaultExecutionPolicy, int\>(N);// now (and similarly for other parallel algorithms)tf::cudaDefaultExecutionPolicy policy(stream);policy.reduce\_bufsz\<int\>(N);
// previous - async allows passing arguments to the callableexecutor.async([](int i){ std::cout \<\< i \<\< std::endl; }, 4);// now - users are responsible of wrapping the arumgnets into a callableexecutor.async([i=4]( std::cout \<\< i \<\< std::endl; ){});
named_async with an overload that takes the name string on the first argument// previous - explicitly calling named\_async to assign a name to an async taskexecutor.named\_async("name", [](){});// now - overlaodexecutor.async("name", [](){});
Revised Request Cancellation to remove support of cancelling async tasks
Revised Asynchronous Tasking to include asynchronous tasking from tf::Runtime
Revised Taskflow algorithms to include execution policy
Added Parallel Scan
We have published Taskflow in the following venues:
Please do not hesitate to contact Dr. Tsung-Wei Huang if you intend to collaborate with us on using Taskflow in your scientific computing projects.