| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 505a825 commit 534f527
117 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -14,7 +14,7 @@ cmake_minimum_required (VERSION 3.18) | |||
| 14 | 14 | MESSAGE(STATUS "CMAKE_ROOT: " ${CMAKE_ROOT}) | |
| 15 | 15 | ||
| 16 | 16 | # Project name | |
| 17 | - project(Taskflow VERSION 3.5.0 LANGUAGES CXX) | ||
| 17 | + project(Taskflow VERSION 3.6.0 LANGUAGES CXX) | ||
| 18 | 18 | ||
| 19 | 19 | # build options | |
| 20 | 20 | option(TF_BUILD_BENCHMARKS "Enables builds of benchmarks" OFF) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -48,7 +48,7 @@ | |||
| 48 | 48 | <h1> | |
| 49 | 49 | Cookbook | |
| 50 | 50 | </h1> | |
| 51 | - <p>This cookbook provides a step-by-step tutorial for writing Taskflow programs.</p><ul><li><a href="ProjectMotivation.html" class="m-doc">Project Motivation</a></li><li><a href="StaticTasking.html" class="m-doc">Static Tasking</a></li><li><a href="ExecuteTaskflow.html" class="m-doc">Executor</a></li><li><a href="DynamicTasking.html" class="m-doc">Dynamic Tasking</a></li><li><a href="ConditionalTasking.html" class="m-doc">Conditional Tasking</a></li><li><a href="ComposableTasking.html" class="m-doc">Composable Tasking</a></li><li><a href="AsyncTasking.html" class="m-doc">Asynchronous Tasking</a></li><li><a href="RuntimeTasking.html" class="m-doc">Interact with the Runtime</a></li><li><a href="PrioritizedTasking.html" class="m-doc">Prioritized Tasking</a></li><li><a href="GPUTaskingcudaFlow.html" class="m-doc">GPU Tasking (cudaFlow)</a></li><li><a href="GPUTaskingcudaFlowCapturer.html" class="m-doc">GPU Tasking (cudaFlowCapturer)</a></li><li><a href="LimitTheMaximumConcurrency.html" class="m-doc">Limit the Maximum Concurrency</a></li><li><a href="RequestCancellation.html" class="m-doc">Request Cancellation</a></li><li><a href="Profiler.html" class="m-doc">Profile Taskflow Programs</a></li></ul> | ||
| 51 | + <p>This cookbook provides a step-by-step tutorial for writing Taskflow programs.</p><ul><li><a href="ProjectMotivation.html" class="m-doc">Project Motivation</a></li><li><a href="StaticTasking.html" class="m-doc">Static Tasking</a></li><li><a href="ExecuteTaskflow.html" class="m-doc">Executor</a></li><li><a href="DynamicTasking.html" class="m-doc">Dynamic Tasking</a></li><li><a href="ConditionalTasking.html" class="m-doc">Conditional Tasking</a></li><li><a href="ComposableTasking.html" class="m-doc">Composable Tasking</a></li><li><a href="AsyncTasking.html" class="m-doc">Asynchronous Tasking</a></li><li><a href="DependentAsyncTasking.html" class="m-doc">Asynchronous Tasking with Dependencies</a></li><li><a href="RuntimeTasking.html" class="m-doc">Interact with the Runtime</a></li><li><a href="PrioritizedTasking.html" class="m-doc">Prioritized Tasking</a></li><li><a href="GPUTaskingcudaFlow.html" class="m-doc">GPU Tasking (cudaFlow)</a></li><li><a href="GPUTaskingcudaFlowCapturer.html" class="m-doc">GPU Tasking (cudaFlowCapturer)</a></li><li><a href="LimitTheMaximumConcurrency.html" class="m-doc">Limit the Maximum Concurrency</a></li><li><a href="RequestCancellation.html" class="m-doc">Request Cancellation</a></li><li><a href="Profiler.html" class="m-doc">Profile Taskflow Programs</a></li></ul> | ||
| 52 | 52 | </div> | |
| 53 | 53 | </div> | |
| 54 | 54 | </div> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -119,7 +119,7 @@ <h3>Contents</h3> | |||
| 119 | 119 | <span class="w"> </span><span class="n">input</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">input</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">less</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">(),</span><span class="w"> </span><span class="n">result</span><span class="w"></span> | |
| 120 | 120 | <span class="p">);</span><span class="w"></span> | |
| 121 | 121 | <span class="n">executor</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">taskflow</span><span class="p">).</span><span class="n">wait</span><span class="p">();</span><span class="w"></span> | |
| 122 | - <span class="n">assert</span><span class="p">(</span><span class="o">*</span><span class="n">result</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span><span class="w"></span></pre><aside class="m-note m-info"><h4>Note</h4><p>When using <a href="classtf_1_1FlowBuilder.html#af0415d1fa5f36fee2405b0fcbf592fe0" class="m-doc">tf::<wbr />Taskflow::<wbr />max_element</a> to find the large element, we will still need to use <a href="http://en.cppreference.com/w/cpp/utility/functional/less.html" class="m-doc-external">std::<wbr />less</a> as our comparison function. Details can be referred to std::max_element.</p></aside></section><section id="ParallelFindConfigureAPartitioner"><h2><a href="#ParallelFindConfigureAPartitioner">Configure a Partitioner</a></h2><p>You can configure a partitioner for parallel-find tasks (<a href="classtf_1_1FlowBuilder.html#a94e70e5f7a459a7762cc312b6d6dec79" class="m-doc">tf::<wbr />Taskflow::<wbr />find_if</a>, <a href="classtf_1_1FlowBuilder.html#aae268c9763df9323dc349fb1b35988cf" class="m-doc">tf::<wbr />Taskflow::<wbr />find_if_not</a>, <a href="classtf_1_1FlowBuilder.html#ad6a7caf3cfc8d1887bd211be307a3eb0" class="m-doc">tf::<wbr />Taskflow::<wbr />min_element</a>, <a href="classtf_1_1FlowBuilder.html#af0415d1fa5f36fee2405b0fcbf592fe0" class="m-doc">tf::<wbr />Taskflow::<wbr />max_element</a>) to run with different scheduling methods, such as guided partitioning, dynamic partitioning, and static partitioning. The following example creates two parallel-find tasks using two different partitioners, one with the static partitioning algorithm and another one with the guided partitioning algorithm:</p><pre class="m-code"><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">vec</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span><span class="w"></span> | ||
| 122 | + <span class="n">assert</span><span class="p">(</span><span class="o">*</span><span class="n">result</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span><span class="w"></span></pre><aside class="m-note m-info"><h4>Note</h4><p>When using <a href="classtf_1_1FlowBuilder.html#af0415d1fa5f36fee2405b0fcbf592fe0" class="m-doc">tf::<wbr />Taskflow::<wbr />max_element</a> to find the large element, we will still need to use <a href="http://en.cppreference.com/w/cpp/utility/functional/less.html" class="m-doc-external">std::<wbr />less</a> as our comparison function. Details can be referred to <a href="https://en.cppreference.com/w/cpp/algorithm/max_element">std::<wbr />max_element</a>.</p></aside></section><section id="ParallelFindConfigureAPartitioner"><h2><a href="#ParallelFindConfigureAPartitioner">Configure a Partitioner</a></h2><p>You can configure a partitioner for parallel-find tasks (<a href="classtf_1_1FlowBuilder.html#a94e70e5f7a459a7762cc312b6d6dec79" class="m-doc">tf::<wbr />Taskflow::<wbr />find_if</a>, <a href="classtf_1_1FlowBuilder.html#aae268c9763df9323dc349fb1b35988cf" class="m-doc">tf::<wbr />Taskflow::<wbr />find_if_not</a>, <a href="classtf_1_1FlowBuilder.html#ad6a7caf3cfc8d1887bd211be307a3eb0" class="m-doc">tf::<wbr />Taskflow::<wbr />min_element</a>, <a href="classtf_1_1FlowBuilder.html#af0415d1fa5f36fee2405b0fcbf592fe0" class="m-doc">tf::<wbr />Taskflow::<wbr />max_element</a>) to run with different scheduling methods, such as guided partitioning, dynamic partitioning, and static partitioning. The following example creates two parallel-find tasks using two different partitioners, one with the static partitioning algorithm and another one with the guided partitioning algorithm:</p><pre class="m-code"><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">vec</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span><span class="w"></span> | ||
| 123 | 123 | <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">>::</span><span class="n">iterator</span><span class="w"> </span><span class="n">result</span><span class="p">;</span><span class="w"></span> | |
| 124 | 124 | ||
| 125 | 125 | <span class="n">tf</span><span class="o">::</span><span class="n">ExecutionPolicy</span><span class="o"><</span><span class="n">tf</span><span class="o">::</span><span class="n">StaticPartitioner</span><span class="o">></span><span class="w"> </span><span class="n">static_partitioner</span><span class="p">;</span><span class="w"></span> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -53,7 +53,6 @@ <h1> | |||
| 53 | 53 | <h3>Contents</h3> | |
| 54 | 54 | <ul> | |
| 55 | 55 | <li><a href="#CancelARunningTaskflow">Cancel Execution of Taskflows</a></li> | |
| 56 | - <li><a href="#CancelAnAsynchronousTask">Cancel Execution of Asynchronous Tasks</a></li> | ||
| 57 | 56 | <li><a href="#UnderstandTheLimitationsOfCancellation">Understand the Limitations of Cancellation</a></li> | |
| 58 | 57 | </ul> | |
| 59 | 58 | </nav> | |
@@ -97,47 +96,6 @@ <h3>Contents</h3> | |||
| 97 | 96 | ||
| 98 | 97 | <span class="w"> </span><span class="n">fu</span><span class="p">.</span><span class="n">cancel</span><span class="p">();</span><span class="w"> </span><span class="c1">// there can still be task running after cancellation</span> | |
| 99 | 98 | <span class="w"> </span><span class="n">fu</span><span class="p">.</span><span class="n">get</span><span class="p">();</span><span class="w"> </span><span class="c1">// waits until the cancellation completes</span> | |
| 100 | - <span class="p">}</span><span class="w"></span></pre></section><section id="CancelAnAsynchronousTask"><h2><a href="#CancelAnAsynchronousTask">Cancel Execution of Asynchronous Tasks</a></h2><p>You can cancel submitted asynchronous tasks using <a href="classtf_1_1Future.html#a3bf5f104864ab2590b6409712d3a469b" class="m-doc">tf::<wbr />Future::<wbr />cancel</a>. The following example launches 10000 asynchronous tasks through an executor, acquires their futures, and cancel all of them.</p><pre class="m-code"><span class="n">tf</span><span class="o">::</span><span class="n">Executor</span><span class="w"> </span><span class="n">executor</span><span class="p">;</span><span class="w"></span> | ||
| 101 | - | ||
| 102 | - <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">tf</span><span class="o">::</span><span class="n">Future</span><span class="o"><</span><span class="kt">void</span><span class="o">>></span><span class="w"> </span><span class="n">futures</span><span class="p">;</span><span class="w"></span> | ||
| 103 | - | ||
| 104 | - <span class="c1">// submit 10000 asynchronous tasks</span> | ||
| 105 | - <span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">10000</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span> | ||
| 106 | - <span class="w"> </span><span class="n">futures</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">executor</span><span class="p">.</span><span class="n">async</span><span class="p">([</span><span class="n">i</span><span class="p">](){</span><span class="w"></span> | ||
| 107 | - <span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"task %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">);</span><span class="w"></span> | ||
| 108 | - <span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="mi">100</span><span class="p">));</span><span class="w"></span> | ||
| 109 | - <span class="w"> </span><span class="p">}));</span><span class="w"></span> | ||
| 110 | - <span class="p">}</span><span class="w"></span> | ||
| 111 | - | ||
| 112 | - <span class="c1">// cancel all asynchronous tasks</span> | ||
| 113 | - <span class="k">for</span><span class="p">(</span><span class="k">auto</span><span class="o">&</span><span class="w"> </span><span class="n">fu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">futures</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span> | ||
| 114 | - <span class="w"> </span><span class="n">fu</span><span class="p">.</span><span class="n">cancel</span><span class="p">();</span><span class="w"></span> | ||
| 115 | - <span class="p">}</span><span class="w"></span> | ||
| 116 | - | ||
| 117 | - <span class="c1">// wait until the 10000 cancellations complete</span> | ||
| 118 | - <span class="n">executor</span><span class="p">.</span><span class="n">wait_for_all</span><span class="p">();</span><span class="w"></span></pre><pre class="m-console"><span class="go">task 0</span> | ||
| 119 | - <span class="go">task 5</span> | ||
| 120 | - <span class="go">task 7</span> | ||
| 121 | - <span class="go">task 9</span> | ||
| 122 | - <span class="go">task 4</span> | ||
| 123 | - <span class="go">task 1</span> | ||
| 124 | - <span class="go">task 6</span> | ||
| 125 | - <span class="go">task 8</span> | ||
| 126 | - <span class="go">task 2</span> | ||
| 127 | - <span class="go">task 10</span> | ||
| 128 | - <span class="go">task 3</span> | ||
| 129 | - <span class="go">task 11</span></pre><p>Similar to cancelling a running taskflow, cancelling a submitted asynchronous task does not guarantee the execution will be cancelled. The result depends on the present available workers and whether the asynchronous task is being run by a worker. To wait for a cancellation to complete, you may explicitly call <code>tf::Future::get</code>. The result may be a <a href="https://en.cppreference.com/w/cpp/utility/optional/nullopt">std::<wbr />nullopt</a> if that asynchronous task does not run.</p><pre class="m-code"><span class="n">tf</span><span class="o">::</span><span class="n">Executor</span><span class="w"> </span><span class="n">executor</span><span class="p">;</span><span class="w"></span> | ||
| 130 | - | ||
| 131 | - <span class="n">tf</span><span class="o">::</span><span class="n">Future</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="kt">int</span><span class="o">>></span><span class="w"> </span><span class="n">fu</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">executor</span><span class="p">.</span><span class="n">async</span><span class="p">([](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="p">};</span><span class="w"></span> | ||
| 132 | - | ||
| 133 | - <span class="n">fu</span><span class="p">.</span><span class="n">cancel</span><span class="p">();</span><span class="w"></span> | ||
| 134 | - | ||
| 135 | - <span class="c1">// call tf::Future::get to wait for the cancellation to complete</span> | ||
| 136 | - <span class="k">if</span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fu</span><span class="p">.</span><span class="n">get</span><span class="p">();</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">nullopt</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span> | ||
| 137 | - <span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"asynchronous task 1 is cancelled</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span><span class="w"> </span> | ||
| 138 | - <span class="p">}</span><span class="w"></span> | ||
| 139 | - <span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"></span> | ||
| 140 | - <span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"asynchronous task 1 returns "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">ret</span><span class="p">.</span><span class="n">value</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="sc">'\n'</span><span class="p">;</span><span class="w"></span> | ||
| 141 | 99 | <span class="p">}</span><span class="w"></span></pre></section><section id="UnderstandTheLimitationsOfCancellation"><h2><a href="#UnderstandTheLimitationsOfCancellation">Understand the Limitations of Cancellation</a></h2><p>Canceling the execution of a running taskflow has the following limitations:</p><ul><li>Cancellation is non-preemptive. A running task will not be cancelled until it finishes.</li><li>Cancelling a taskflow with tasks acquiring and/or releasing <a href="classtf_1_1Semaphore.html" class="m-doc">tf::<wbr />Semaphore</a> results is currently not supported.</li></ul><p>We may overcome these limitations in the future releases.</p></section> | |
| 142 | 100 | </div> | |
| 143 | 101 | </div> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -50,6 +50,7 @@ <h1>Classes</h1> | |||
| 50 | 50 | <li class="m-doc-collapsible"> | |
| 51 | 51 | <a href="#" onclick="return toggle(this)">namespace</a> <a href="namespacetf.html" class="m-doc">tf</a> <span class="m-doc">taskflow namespace</span> | |
| 52 | 52 | <ul class="m-doc"> | |
| 53 | + <li>class <a href="classtf_1_1AsyncTask.html" class="m-doc">AsyncTask</a> <span class="m-doc">class to create a dependent asynchronous task</span></li> | ||
| 53 | 54 | <li>class <a href="classtf_1_1ChromeObserver.html" class="m-doc">ChromeObserver</a> <span class="m-doc">class to create an observer based on Chrome tracing format</span></li> | |
| 54 | 55 | <li>class <a href="classtf_1_1CriticalSection.html" class="m-doc">CriticalSection</a> <span class="m-doc">class to create a critical region of limited workers to run tasks</span></li> | |
| 55 | 56 | <li class="m-doc-collapsible collapsed"> | |
| Back | FazBrowse Home | New Git URL |
0 commit comments