FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

updated first version of dependent async task · taskflow/taskflow@534f527 · GitHub

Repository navigation

Commit 534f527

Browse files
twhuang
committed
updated first version of dependent async task
1 parent 505a825 commit 534f527

117 files changed

Lines changed: 4112 additions & 1723 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CMakeLists.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ cmake_minimum_required (VERSION 3.18)
1414
MESSAGE(STATUS "CMAKE_ROOT: " ${CMAKE_ROOT})
1515

1616
# Project name
17-
project(Taskflow VERSION 3.5.0 LANGUAGES CXX)
17+
project(Taskflow VERSION 3.6.0 LANGUAGES CXX)
1818

1919
# build options
2020
option(TF_BUILD_BENCHMARKS "Enables builds of benchmarks" OFF)

‎docs/AsyncTasking.html‎

Lines changed: 8 additions & 12 deletions
Large diffs are not rendered by default.

‎docs/Cookbook.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
<h1>
4949
Cookbook
5050
</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>
5252
</div>
5353
</div>
5454
</div>

‎docs/DependentAsyncTasking.html‎

Lines changed: 164 additions & 0 deletions
Large diffs are not rendered by default.

‎docs/ParallelFind.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ <h3>Contents</h3>
119119
<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">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(),</span><span class="w"> </span><span class="n">result</span><span class="w"></span>
120120
<span class="p">);</span><span class="w"></span>
121121
<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">&lt;</span><span class="kt">int</span><span class="o">&gt;</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">&lt;</span><span class="kt">int</span><span class="o">&gt;</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>
123123
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span><span class="w"> </span><span class="n">result</span><span class="p">;</span><span class="w"></span>
124124

125125
<span class="n">tf</span><span class="o">::</span><span class="n">ExecutionPolicy</span><span class="o">&lt;</span><span class="n">tf</span><span class="o">::</span><span class="n">StaticPartitioner</span><span class="o">&gt;</span><span class="w"> </span><span class="n">static_partitioner</span><span class="p">;</span><span class="w"></span>

‎docs/RequestCancellation.html‎

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ <h1>
5353
<h3>Contents</h3>
5454
<ul>
5555
<li><a href="#CancelARunningTaskflow">Cancel Execution of Taskflows</a></li>
56-
<li><a href="#CancelAnAsynchronousTask">Cancel Execution of Asynchronous Tasks</a></li>
5756
<li><a href="#UnderstandTheLimitationsOfCancellation">Understand the Limitations of Cancellation</a></li>
5857
</ul>
5958
</nav>
@@ -97,47 +96,6 @@ <h3>Contents</h3>
9796

9897
<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>
9998
<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">&lt;</span><span class="n">tf</span><span class="o">::</span><span class="n">Future</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">&gt;&gt;</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">&lt;</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">&quot;task %d</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;asynchronous task 1 is cancelled</span><span class="se">\n</span><span class="s">&quot;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;asynchronous task 1 returns &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</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">&lt;&lt;</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">;</span><span class="w"></span>
14199
<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>
142100
</div>
143101
</div>

‎docs/annotated.html‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ <h1>Classes</h1>
5050
<li class="m-doc-collapsible">
5151
<a href="#" onclick="return toggle(this)">namespace</a> <a href="namespacetf.html" class="m-doc">tf</a> <span class="m-doc">taskflow namespace</span>
5252
<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>
5354
<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>
5455
<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>
5556
<li class="m-doc-collapsible collapsed">

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL