Skip to content

Commit f9a2bd0

Browse files
updated docs
1 parent eefdb8c commit f9a2bd0

Some content is hidden

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

49 files changed

+524
-136
lines changed

README.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ A fast C++ *header-only* library to help you quickly write parallel programs wit
1313
# Why Cpp-Taskflow?
1414

1515
Cpp-Taskflow is by far faster, more expressive, fewer lines of code, and easier for drop-in integration
16-
than existing parallel task programming libraries such as [OpenMP Tasking][OpenMP Tasking] and Intel [TBB FlowGraph][TBB FlowGraph].
16+
than existing parallel task programming libraries such as [OpenMP Tasking][OpenMP Tasking]
17+
and Intel [TBB FlowGraph][TBB FlowGraph].
1718

1819
![](image/performance.jpg)
1920

@@ -259,7 +260,7 @@ tf::Task C = tf.emplace([](){}).name("C");
259260
tf::Task D = tf.emplace([](){}).name("D");
260261

261262
// create a subflow graph (dynamic tasking)
262-
tf::Task B = tf.emplace([] (tf::SubflowBuilder& subflow) {
263+
tf::Task B = tf.emplace([] (tf::Subflow& subflow) {
263264
tf::Task B1 = subflow.emplace([](){}).name("B1");
264265
tf::Task B2 = subflow.emplace([](){}).name("B2");
265266
tf::Task B3 = subflow.emplace([](){}).name("B3");
@@ -283,7 +284,7 @@ For example, detaching the above subflow will result in the following execution
283284

284285
```cpp
285286
// create a "detached" subflow graph (dynamic tasking)
286-
tf::Task B = tf.emplace([] (tf::SubflowBuilder& subflow) {
287+
tf::Task B = tf.emplace([] (tf::Subflow& subflow) {
287288
tf::Task B1 = subflow.emplace([](){}).name("B1");
288289
tf::Task B2 = subflow.emplace([](){}).name("B2");
289290
tf::Task B3 = subflow.emplace([](){}).name("B3");
@@ -299,10 +300,10 @@ tf::Task B = tf.emplace([] (tf::SubflowBuilder& subflow) {
299300

300301
Cpp-Taskflow has an unified interface for static and dynamic tasking.
301302
To create a subflow for dynamic tasking,
302-
emplace a callable with one argument of type `tf::SubflowBuilder`.
303+
emplace a callable with one argument of type `tf::Subflow`.
303304

304305
```cpp
305-
tf::Task A = tf.emplace([] (tf::SubflowBuilder& subflow) {});
306+
tf::Task A = tf.emplace([] (tf::Subflow& subflow) {});
306307
```
307308

308309
A subflow builder is a lightweight object that allows you to create
@@ -311,7 +312,7 @@ All graph building methods defined in taskflow
311312
can be used in the subflow builder.
312313

313314
```cpp
314-
tf::Task A = tf.emplace([] (tf::SubflowBuilder& subflow) {
315+
tf::Task A = tf.emplace([] (tf::Subflow& subflow) {
315316
std::cout << "Task A is spawning two subtasks A1 and A2" << '\n';
316317
auto [A1, A2] = subflow.emplace(
317318
[] () { std::cout << "subtask A1" << '\n'; },
@@ -327,13 +328,13 @@ the execution of a subflow and so on.
327328
<img align="right" src="image/nested_subflow.png" width="25%">
328329

329330
```cpp
330-
tf::Task A = tf.emplace([] (tf::SubflowBuilder& sbf) {
331+
tf::Task A = tf.emplace([] (tf::Subflow& sbf) {
331332
std::cout << "A spawns A1 & subflow A2\n";
332333
tf::Task A1 = sbf.emplace([] () {
333334
std::cout << "subtask A1\n";
334335
}).name("A1");
335336

336-
tf::Task A2 = sbf.emplace([] (tf::SubflowBuilder& sbf2) {
337+
tf::Task A2 = sbf.emplace([] (tf::Subflow& sbf2) {
337338
std::cout << "A2 spawns A2_1 & A2_2\n";
338339
tf::Task A2_1 = sbf2.emplace([] () {
339340
std::cout << "subtask A2_1\n";
@@ -355,7 +356,7 @@ By default, a subflow joins to its parent task.
355356
Depending on applications, you can detach a subflow to enable more parallelism.
356357

357358
```cpp
358-
tf::Task A = tf.emplace([] (tf::SubflowBuilder& subflow) {
359+
tf::Task A = tf.emplace([] (tf::Subflow& subflow) {
359360
subflow.detach(); // detach this subflow from its parent task A
360361
}); // subflow starts to run after the callable scope
361362
```
@@ -372,7 +373,7 @@ inside the subflow (possibly nested) finish.
372373
int value {0};
373374

374375
// create a joined subflow
375-
tf::Task A = tf.emplace([&] (tf::SubflowBuilder& subflow) {
376+
tf::Task A = tf.emplace([&] (tf::Subflow& subflow) {
376377
subflow.emplace([&]() {
377378
value = 10;
378379
}).name("A1");
@@ -397,7 +398,7 @@ join to the same taskflow.
397398
int value {0};
398399

399400
// create a detached subflow
400-
tf::Task A = tf.emplace([&] (tf::SubflowBuilder& subflow) {
401+
tf::Task A = tf.emplace([&] (tf::Subflow& subflow) {
401402
subflow.emplace([&]() { value = 10; }).name("A1");
402403
subflow.detach();
403404
}).name("A");
@@ -517,7 +518,7 @@ tf::Taskflow taskflow;
517518
tf::Task A = taskflow.emplace([](){}).name("A");
518519

519520
// create a subflow of two tasks B1->B2
520-
tf::Task B = taskflow.emplace([] (tf::SubflowBuilder& subflow) {
521+
tf::Task B = taskflow.emplace([] (tf::Subflow& subflow) {
521522
tf::Task B1 = subflow.emplace([](){}).name("B1");
522523
tf::Task B2 = subflow.emplace([](){}).name("B2");
523524
B1.precede(B2);

docs/Cookbook.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ var Cookbook =
1111
[ "What is a Task?", "chapter1.html#WhatIsATask", null ],
1212
[ "Create Multiple Tasks at One Time", "chapter1.html#CreateMultipleTasksAtOneTime", null ],
1313
[ "Lifetime of A Task", "chapter1.html#C1_LifetimeOfATask", null ],
14-
[ "Example 1: Create a Task Dependency Graph", "chapter1.html#C1Example1", null ],
15-
[ "Example 2: Modify Task Attributes", "chapter1.html#C1Example2", null ],
14+
[ "Create a Task Dependency Graph", "chapter1.html#C1_CreateATaskDependencyGraph", null ],
15+
[ "Modify Task Attributes", "chapter1.html#C1_ModifyTaskAttributes", null ],
1616
[ "Taskflow Composition", "chapter1.html#C1_TaskflowComposition", null ]
1717
] ],
1818
[ "C2: Execute a Taskflow", "chapter2.html", [

docs/annotated.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1ExecutorObserver.html" target="_self">ExecutorObserver</a></td><td class="desc">A default executor observer to dump the execution timelines </td></tr>
104104
<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1ExecutorObserverInterface.html" target="_self">ExecutorObserverInterface</a></td><td class="desc">The interface class for creating an executor observer </td></tr>
105105
<tr id="row_0_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1FlowBuilder.html" target="_self">FlowBuilder</a></td><td class="desc">Building blocks of a task dependency graph </td></tr>
106-
<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1SubflowBuilder.html" target="_self">SubflowBuilder</a></td><td class="desc">The building blocks of dynamic tasking </td></tr>
106+
<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1Subflow.html" target="_self">Subflow</a></td><td class="desc">The building blocks of dynamic tasking </td></tr>
107107
<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1Task.html" target="_self">Task</a></td><td class="desc">Handle to modify and access a task </td></tr>
108108
<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1Taskflow.html" target="_self">Taskflow</a></td><td class="desc">Class to create a task dependency graph </td></tr>
109109
<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classtf_1_1WorkStealingQueue.html" target="_self">WorkStealingQueue</a></td><td class="desc">Lock-free unbounded single-producer multiple-consumer queue </td></tr>

docs/annotated_dup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var annotated_dup =
66
[ "ExecutorObserver", "classtf_1_1ExecutorObserver.html", "classtf_1_1ExecutorObserver" ],
77
[ "ExecutorObserverInterface", "classtf_1_1ExecutorObserverInterface.html", "classtf_1_1ExecutorObserverInterface" ],
88
[ "FlowBuilder", "classtf_1_1FlowBuilder.html", "classtf_1_1FlowBuilder" ],
9-
[ "SubflowBuilder", "classtf_1_1SubflowBuilder.html", "classtf_1_1SubflowBuilder" ],
9+
[ "Subflow", "classtf_1_1Subflow.html", "classtf_1_1Subflow" ],
1010
[ "Task", "classtf_1_1Task.html", "classtf_1_1Task" ],
1111
[ "Taskflow", "classtf_1_1Taskflow.html", "classtf_1_1Taskflow" ],
1212
[ "WorkStealingQueue", "classtf_1_1WorkStealingQueue.html", "classtf_1_1WorkStealingQueue" ]

docs/chapter1.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,20 +115,20 @@ <h1><a class="anchor" id="WhatIsATask"></a>
115115
<p>Cpp-Taskflow uses the general-purpose polymorphic function wrapper <a class="elRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a> to store and invoke any callable target in a task. You need to follow its contract to create a task. For instance, the callable object must be copy constructible.</p>
116116
<h1><a class="anchor" id="CreateMultipleTasksAtOneTime"></a>
117117
Create Multiple Tasks at One Time</h1>
118-
<p>Cpp-Taskflow uses C++ structured binding coupled with tuple to make the creation of tasks simple. The method <a class="el" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c" title="creates a task from a given callable object ">tf::Taskflow::emplace</a> accepts a arbitrary number of callable objects to create multiple tasks at one time.</p>
118+
<p>Cpp-Taskflow uses C++ structured binding coupled with <a class="elRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/utility/tuple.html">std::tuple</a> to make it simple to create multiple tasks at one time.</p>
119119
<div class="fragment"><div class="line"><span class="keyword">auto</span> [A, B, C] = taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>( <span class="comment">// create three tasks in one call</span></div><div class="line"> [](){ <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task A\n&quot;</span>; },</div><div class="line"> [](){ <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task B\n&quot;</span>; },</div><div class="line"> [](){ <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task C\n&quot;</span>; }</div><div class="line">);</div></div><!-- fragment --><h1><a class="anchor" id="C1_LifetimeOfATask"></a>
120120
Lifetime of A Task</h1>
121121
<p>A task lives with its graph and belongs to only a graph at a time, and is not destroyed until the graph gets cleaned up. The lifetime of a task refers to the user-given callable object, including captured values. As long as the graph is alive, all the associated tasks exist. It is your responsibility to keep tasks and graph alive during their execution.</p>
122-
<h1><a class="anchor" id="C1Example1"></a>
123-
Example 1: Create a Task Dependency Graph</h1>
124-
<p>The example below demonstrates how to create a simple task dependency graph of four dependent tasks.</p>
122+
<h1><a class="anchor" id="C1_CreateATaskDependencyGraph"></a>
123+
Create a Task Dependency Graph</h1>
124+
<p>Putting everything together, the example below creates a simple task dependency graph of four dependent tasks.</p>
125125
<div class="fragment"><div class="line"> 1: #include &lt;taskflow/taskflow.hpp&gt;</div><div class="line"> 2:</div><div class="line"> 3: <span class="keywordtype">int</span> main() {</div><div class="line"> 4: </div><div class="line"> 5: <a class="code" href="classtf_1_1Taskflow.html">tf::Taskflow</a> taskflow;</div><div class="line"> 6:</div><div class="line"> 7: <span class="comment">// create a task dependency graph</span></div><div class="line"> 8: <a class="code" href="classtf_1_1Task.html">tf::Task</a> t0 = taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([] () { <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task A\n&quot;</span>; });</div><div class="line"> 9: <a class="code" href="classtf_1_1Task.html">tf::Task</a> t1 = taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([] () { <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task B\n&quot;</span>; });</div><div class="line">10: <a class="code" href="classtf_1_1Task.html">tf::Task</a> t2 = taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([] () { <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task C\n&quot;</span>; });</div><div class="line">11: <a class="code" href="classtf_1_1Task.html">tf::Task</a> t3 = taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#a4d52a7fe2814b264846a2085e931652c">emplace</a>([] () { <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;Task D\n&quot;</span>; });</div><div class="line">12:</div><div class="line">13: <span class="comment">// add dependency links</span></div><div class="line">14: t0.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(t1); </div><div class="line">15: t0.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(t2);</div><div class="line">16: t1.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(t3);</div><div class="line">17: t2.<a class="code" href="classtf_1_1Task.html#a8c78c453295a553c1c016e4062da8588">precede</a>(t3);</div><div class="line">18:</div><div class="line">19: <span class="keywordflow">return</span> 0;</div><div class="line">20: }</div></div><!-- fragment --><p>Debrief: </p><ul>
126126
<li>Line 5 creates a taskflow object </li>
127127
<li>Line 8-11 creates four tasks </li>
128128
<li>Line 14-17 adds four task dependency links</li>
129129
</ul>
130-
<h1><a class="anchor" id="C1Example2"></a>
131-
Example 2: Modify Task Attributes</h1>
130+
<h1><a class="anchor" id="C1_ModifyTaskAttributes"></a>
131+
Modify Task Attributes</h1>
132132
<p>This example demonstrates how to modify a task's attributes using methods defined in the task handler.</p>
133133
<div class="fragment"><div class="line"> 1: #include &lt;taskflow/taskflow.hpp&gt;</div><div class="line"> 2:</div><div class="line"> 3: <span class="keywordtype">int</span> main() {</div><div class="line"> 4:</div><div class="line"> 5: <a class="code" href="classtf_1_1Taskflow.html">tf::Taskflow</a> taskflow;</div><div class="line"> 6:</div><div class="line"> 7: <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;tf::Task&gt;</a> tasks = { </div><div class="line"> 8: taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>(), <span class="comment">// create a task with no work</span></div><div class="line"> 9: taskflow.<a class="code" href="classtf_1_1FlowBuilder.html#acab0b4ac82260f47fdb36a3244ee3aaf">placeholder</a>() <span class="comment">// create a task with no work</span></div><div class="line">10: };</div><div class="line">11:</div><div class="line">12: tasks[0].name(<span class="stringliteral">&quot;This is Task 0&quot;</span>);</div><div class="line">13: tasks[1].name(<span class="stringliteral">&quot;This is Task 1&quot;</span>);</div><div class="line">14: tasks[0].precede(tasks[1]);</div><div class="line">15:</div><div class="line">16: <span class="keywordflow">for</span>(<span class="keyword">auto</span> task : tasks) { <span class="comment">// print out each task&#39;s attributes</span></div><div class="line">17: <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; task.name() &lt;&lt; <span class="stringliteral">&quot;: &quot;</span></div><div class="line">18: &lt;&lt; <span class="stringliteral">&quot;num_dependents=&quot;</span> &lt;&lt; task.num_dependents() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div><div class="line">19: &lt;&lt; <span class="stringliteral">&quot;num_successors=&quot;</span> &lt;&lt; task.num_successors() &lt;&lt; <span class="charliteral">&#39;\n&#39;</span>;</div><div class="line">20: }</div><div class="line">21:</div><div class="line">22: taskflow.<a class="code" href="classtf_1_1Taskflow.html#ac433018262e44b12c4cc9f0c4748d758">dump</a>(<a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a>); <span class="comment">// dump the taskflow graph</span></div><div class="line">23:</div><div class="line">24: tasks[0].work([](){ <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;got a new work!\n&quot;</span>; });</div><div class="line">25: tasks[1].work([](){ <a class="codeRef" doxygen="/home/twhuang/PhD/Code/cpp-taskflow/doxygen/cppreference-doxygen-web.tag.xml:http://en.cppreference.com/w/" href="http://en.cppreference.com/w/cpp/io/basic_ostream.html">std::cout</a> &lt;&lt; <span class="stringliteral">&quot;got a new work!\n&quot;</span>; });</div><div class="line">26:</div><div class="line">27: <span class="keywordflow">return</span> 0;</div><div class="line">28: }</div></div><!-- fragment --><p>The output of this program looks like the following:</p>
134134
<div class="fragment"><div class="line">This is Task 0: num_dependents=0, num_successors=1</div><div class="line">This is Task 1: num_dependents=1, num_successors=0</div><div class="line">digraph Taskflow {</div><div class="line">&quot;This is Task 1&quot;;</div><div class="line">&quot;This is Task 0&quot;;</div><div class="line">&quot;This is Task 0&quot; -&gt; &quot;This is Task 1&quot;;</div><div class="line">}</div></div><!-- fragment --><p>Debrief: </p><ul>

0 commit comments

Comments
 (0)