From fec403cfc065ffdb55b77d3ed7ce539282a7476c Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Thu, 30 Oct 2025 16:47:45 +0200 Subject: [PATCH 1/8] Add Tasks Aggregation RFC --- rfcs/proposed/tasks_aggregation/README.md | 140 ++++++++++++++++++ .../aggregating_group_aggregating_task.png | Bin 0 -> 24379 bytes .../assets/aggregating_group_chunking.png | Bin 0 -> 10967 bytes .../aggregating_group_consumer_thread.png | Bin 0 -> 26927 bytes .../assets/aggregating_group_first_run.png | Bin 0 -> 13819 bytes .../assets/aggregating_group_further_runs.png | Bin 0 -> 15238 bytes .../aggregating_group_process_chunks.png | Bin 0 -> 31205 bytes .../aggregating_group_producer_thread.png | Bin 0 -> 12911 bytes .../producer_consumer_consumer_threads.png | Bin 0 -> 37818 bytes .../producer_consumer_producer_thread.png | Bin 0 -> 12652 bytes 10 files changed, 140 insertions(+) create mode 100644 rfcs/proposed/tasks_aggregation/README.md create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_aggregating_task.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_chunking.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_consumer_thread.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_first_run.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_further_runs.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_process_chunks.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/aggregating_group_producer_thread.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/producer_consumer_consumer_threads.png create mode 100644 rfcs/proposed/tasks_aggregation/assets/producer_consumer_producer_thread.png diff --git a/rfcs/proposed/tasks_aggregation/README.md b/rfcs/proposed/tasks_aggregation/README.md new file mode 100644 index 0000000000..8a6b0ba787 --- /dev/null +++ b/rfcs/proposed/tasks_aggregation/README.md @@ -0,0 +1,140 @@ +# Tasks Aggregation + +This proposal describes a possible solution to the producer-consumer inefficiency that arises in the current ``task_group`` API. + +## Introduction + +Consider using a ``tbb::task_group`` in an application implementing a producer-consumer pattern where one producer thread generates work items, +and multiple consumer threads process them in parallel: + +```cpp +void producer() { + tbb::task_group tg; + + auto work_item = get_work_item(); + + while (work_item != end_of_work) { + tg.run(process{work_item}); + } + + tg.wait(); +} +``` + +The ``get_work_item()`` function generates the work item for processing, e.g., by reading an input file or stream. When there is no more work to generate, it +returns ``end_of_work``. The exact number of work items to be generated is unknown in advance, which makes using parallel algorithms like +``tbb::parallel_for`` or ``tbb::parallel_for_each`` potentially inefficient, as they require buffering work items to form an input sequence. +``tbb::task_group`` is semantically appropriate, as it immediately submits the available work for execution. + +In the current implementation, ``tbb::task_group::run`` creates a task to process the given function and spawns it by pushing it into the local task pool of +the producing thread. + + + +When consumer (worker) threads join the task arena, they must search for tasks to process. |Since the only source of tasks in the arena is the local task pool +of the producing thread, consumer threads will steal individual tasks from it. + + + +After executing the stolen tasks, consumer threads run out of work again and must steal from the same producer's local task pool. +Because the number of consumer threads can be large, stealing tasks from a single producer's task pool creates a bottleneck, resulting in significant +performance penalties and poor scalability. + +Another bottleneck is a reference counter inside the ``tbb::task_group`` that is used to register the task in the group. The reference counter is incremented when a task +is created and decremented when the task completes execution. + +To improve the scalability of the reference counter, oneTBB ADD_VERSION introduced a per-thread reference counters - each thread that creates a task registers its thread-local +counter as a leaf in the ``task_group``'s reference counter. Tasks created by a thread hold a reference in the thread-local counter, which in turn holds a single reference +in the group's reference counter. + +However, in the producer-consumer scenario, where all tasks are created by a single producer thread, this approach does not improve scalability. + +## Proposed solution + +The proposed solution combines the existing task spawning mechanism of ``task_group`` with an aggregator. For simplicity, let's refer to the API +implementing this idea as *aggregating-task-group*, which provides two methods ``run(task_body)`` and ``wait()`` - similar to the regular ``task_group``. + +Tasks in an *aggregating-task-group* are represented as nodes in a singly linked list; each task contains a pointer to the next task. + +The *aggregating-task-group* supports a thread-local singly linked list of tasks, which is initially empty(``atomic`` set to ``nullptr``). + +Each call to ``run()`` appends a task to the calling thread's list using an atomic CAS operation. + +If the inserted task is the first task in the list, ``run()`` spawns a service *aggregating-task* pointing to the list. + +The *aggregating-task* grabs the list it points to (``list_head.exchange(nullptr)``) and splits the grabbed list into chunks for processing. + +Consider the producer-consumer example from the introduction, now using *aggregating-task-group* instead of ``tbb::task_group``. + +When the *aggregating-task-group* is created, the list of the producer thread is empty. + + + +The first task submitted to the group is appended to the list, and since the list was empty, it spawns (adds to the local task pool) +the ``agg_task``, which points to the producer thread's task list. + +Aggregating tasks reserve a reference in the ``task_group``'s global counter and maintain a separate counter for tasks processing the chunks. +The lifetime of ``agg_task`` is extended until the last chunk of the grabbed list is processed. + + + +Subsequent tasks submitted to the group are appended to the head of the list without spawning additional aggregating tasks. + + + +When a consumer worker thread looks for work, the only task available for stealing is ``agg_task``. + + + +When the consumer thread executes the ``agg_task``, it grabs the task list and makes it empty again. Further calls to ``run()`` will +append the task to the empty list and spawn additional *aggregating-task*s to grab the new list. + + + +After grabbing the task list, the consumer thread splits the list into chunks of fixed size. Assume a chunk size of ``2``. +In the example above, it will create two service *chunk-task*s pointing to the sub-lists. One is spawned, while the other is bypassed. + +Chunk tasks reserve a reference in the aggregating task's reference counter and maintain another counter for individual listed tasks in the chunk. +The lifetime of a chunk task is extended until the last listed task in the chunk is executed. + + + +Another consumer thread can now steal the *chunk-task* from the first consumer thread's local task pool. + +When the consumer thread executes the *chunk-task*, it spawns all tasks except one and bypasses the last. + + + +### Alternative Approaches for Chunking + +Alternative approaches for how the *aggregating-task* should process the grabbed list can be considered. + +For example, it may follow the approach of ``tbb::parallel_for_each`` for forward iterators: it cuts a single chunk +from the list, re-spawns the *chunking-task* with the reduced list, and bypasses the *chunk-task*. + +For example, it may follow the approach of ``tbb::parallel_for_each`` for forward iterators: it cuts the single chunk +from the list, re-spawns the *chunking-task* with the reduced list and bypasses the *chunk-task*. When a worker thread +executes the stolen *chunking-task*, it cuts and bypasses the task for the next chunk and re-spawns the *chunking-task*. + +The *chunking-task* is re-spawned until the list is empty. + +## Possible APIs + +It does not make sense to completely replace ``task_group::run`` spawning mechanism with task aggregation, as this could +introduce unnecessary performance penalties in other ``task_group`` use cases (e.g., divide-and-conquer patterns), where +tasks are produced by multiple threads or generate additional tasks. + +There are several options for expressing tasks aggregation in the public API: + +1. A separate ``task_group``-like API, e.g., ``tbb::aggregating_task_group``, providing the same set + of member functions as ``tbb::task_group``. +2. Integrate it into the regular ``tbb::task_group`` API by providing an additional overload for ``task_group::run`` that + accepts a policy parameter, or a separate function in ``task_group``. +3. Introduce a separate API not connected with the task groups. One option is ``tbb::parallel_while(generator, predicate, body)``, + which executed ``body(input)`` in parallel while ``pred(input) == true``, with ``input`` generated by repeated calls to ``generator()``. + +## Open Questions + +* Which public APIshould be used to implement tasks aggregation? See the [Possible APIs section](#possible-apis) for details. +* Which chunking approach should be implemented? See the [Alternative Approaches for Chunking section](#alternative-approaches-for-chunking) for details. +* What chunk size should be chosen? diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_aggregating_task.png b/rfcs/proposed/tasks_aggregation/assets/aggregating_group_aggregating_task.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a478a3ccb4457cf86c0f7f341e8b3594b4dc62 GIT binary patch literal 24379 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 z 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 IzH`_94^zXj9smFU literal 0 HcmV?d00001 diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_first_run.png b/rfcs/proposed/tasks_aggregation/assets/aggregating_group_first_run.png new file mode 100644 index 0000000000000000000000000000000000000000..3f82d2cd7868831dd3acd0d987aa67c817e191ac GIT binary patch literal 13819 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 literal 0 HcmV?d00001 diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_further_runs.png b/rfcs/proposed/tasks_aggregation/assets/aggregating_group_further_runs.png new file mode 100644 index 0000000000000000000000000000000000000000..9186f64328e7ac2076d44ad790619ffcd88c431a GIT binary patch literal 15238 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 literal 0 HcmV?d00001 diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_process_chunks.png b/rfcs/proposed/tasks_aggregation/assets/aggregating_group_process_chunks.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cc260c3892ff1285c95a23df017a8eb337ff4a GIT binary patch literal 31205 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 literal 0 HcmV?d00001 diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_producer_thread.png b/rfcs/proposed/tasks_aggregation/assets/aggregating_group_producer_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..6d13567ec3e508599ef0a9cc6b7190fd52d2af31 GIT binary patch literal 12911 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 literal 0 HcmV?d00001 diff --git a/rfcs/proposed/tasks_aggregation/assets/producer_consumer_producer_thread.png b/rfcs/proposed/tasks_aggregation/assets/producer_consumer_producer_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..0a291f2867744ee3b3c75cde6faea81928c481e3 GIT binary patch literal 12652 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 literal 0 HcmV?d00001 From c1004b17a558317f36943cdddb251f276293a830 Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Wed, 10 Dec 2025 17:52:11 +0200 Subject: [PATCH 2/8] Save progress --- rfcs/proposed/tasks_aggregation/README.md | 173 +++++++++++++++++++--- 1 file changed, 151 insertions(+), 22 deletions(-) diff --git a/rfcs/proposed/tasks_aggregation/README.md b/rfcs/proposed/tasks_aggregation/README.md index 8a6b0ba787..5268194ea1 100644 --- a/rfcs/proposed/tasks_aggregation/README.md +++ b/rfcs/proposed/tasks_aggregation/README.md @@ -4,17 +4,18 @@ This proposal describes a possible solution to the producer-consumer inefficienc ## Introduction -Consider using a ``tbb::task_group`` in an application implementing a producer-consumer pattern where one producer thread generates work items, +Consider using a ``tbb::task_group`` in an application implementing a single producer - multiple consumers pattern, where one producer thread generates work items, and multiple consumer threads process them in parallel: ```cpp -void producer() { + +void produce() { tbb::task_group tg; auto work_item = get_work_item(); while (work_item != end_of_work) { - tg.run(process{work_item}); + tg.run(process{work_item}); // Can be executed by one of the producer threads } tg.wait(); @@ -23,7 +24,8 @@ void producer() { The ``get_work_item()`` function generates the work item for processing, e.g., by reading an input file or stream. When there is no more work to generate, it returns ``end_of_work``. The exact number of work items to be generated is unknown in advance, which makes using parallel algorithms like -``tbb::parallel_for`` or ``tbb::parallel_for_each`` potentially inefficient, as they require buffering work items to form an input sequence. +``tbb::parallel_for`` or ``tbb::parallel_for_each`` potentially inefficient, as they require buffering work items to form an input sequence +that delays computations on the first-came work items. ``tbb::task_group`` is semantically appropriate, as it immediately submits the available work for execution. In the current implementation, ``tbb::task_group::run`` creates a task to process the given function and spawns it by pushing it into the local task pool of @@ -31,12 +33,12 @@ the producing thread. -When consumer (worker) threads join the task arena, they must search for tasks to process. |Since the only source of tasks in the arena is the local task pool +When consumer (worker) threads join the task arena, they must search for tasks to process. Since the only source of tasks in the arena is the local task pool of the producing thread, consumer threads will steal individual tasks from it. -After executing the stolen tasks, consumer threads run out of work again and must steal from the same producer's local task pool. +After executing the stolen task, consumer threads run out of work again and must steal from the same producer's local task pool. Because the number of consumer threads can be large, stealing tasks from a single producer's task pool creates a bottleneck, resulting in significant performance penalties and poor scalability. @@ -44,37 +46,125 @@ Another bottleneck is a reference counter inside the ``tbb::task_group`` that is is created and decremented when the task completes execution. To improve the scalability of the reference counter, oneTBB ADD_VERSION introduced a per-thread reference counters - each thread that creates a task registers its thread-local -counter as a leaf in the ``task_group``'s reference counter. Tasks created by a thread hold a reference in the thread-local counter, which in turn holds a single reference +counter as a leaf in the ``task_group``'s reference counter. Tasks created by a thread holds a reference in the thread-local counter, which in turn holds a single reference in the group's reference counter. -However, in the producer-consumer scenario, where all tasks are created by a single producer thread, this approach does not improve scalability. +However, in the scenario above all tasks are created by a producer thread, so all of them holds references in a single producer thread's counter. + +## Proposed Design + +### Resolving the Single Task Source Bottleneck + +This document proposes a task distribution mechanism combining the existing ``task_group`` spawning mechanism with the idea of the aggregator. -## Proposed solution +For simplicity, let's refer to the API implementing this idea as *aggregating-task-group* providing two +basic methods ``run(task_body)`` and ``wait()``, similar to the regular ``task_group``. -The proposed solution combines the existing task spawning mechanism of ``task_group`` with an aggregator. For simplicity, let's refer to the API -implementing this idea as *aggregating-task-group*, which provides two methods ``run(task_body)`` and ``wait()`` - similar to the regular ``task_group``. +Tasks in an *aggregating-task-group* forms a binary task tree where the first and the second layers +contains a single task and each other N-th layer contains up to 2^N tasks. -Tasks in an *aggregating-task-group* are represented as nodes in a singly linked list; each task contains a pointer to the next task. +Each tree node contains three pointers to other nodes +* Pointer to the left node on the next layer +* Pointer to the right node on the next layer +* Pointer to the parent node on the previous layer -The *aggregating-task-group* supports a thread-local singly linked list of tasks, which is initially empty(``atomic`` set to ``nullptr``). +Additionally, each node contains the number of items in the corresponding subtree. + +```mermaid +flowchart TD + task0[task0
num_items = 6] --> task1 + task1[task1
num_items = 5] --> task2 + task1 --> task3 + task2[task2
num_items = 3] --> task4[task4
num_items = 1] + task2 --> task5[task5
num_items = 1] + task3[task3
num_items = 2] --> task6[task6
num_items = 1] + task1 --> task0 + task2 --> task1 + task3 --> task1 + task4 --> task2 + task5 --> task2 + task6 --> task3 + + + linkStyle 0,1,2,3,4,5 stroke:#e74c3c,stroke-width:2px,color:#e74c3c + linkStyle 6,7,8,9,10,11 stroke:#0000FF,stroke-width:2px,color:#0000FF +``` -Each call to ``run()`` appends a task to the calling thread's list using an atomic CAS operation. +Binary tree of tasks supports three basic actions: +* Adding a task into the tree +* Splitting the tree into halves +* Grabbing all items in the tree -If the inserted task is the first task in the list, ``run()`` spawns a service *aggregating-task* pointing to the list. +The detailed description of all of these operations will be provided in separate sections below. -The *aggregating-task* grabs the list it points to (``list_head.exchange(nullptr)``) and splits the grabbed list into chunks for processing. +The *aggregating-task-group* instance supports a thread-local atomic pointer to the binary tree which is initially empty(``atomic`` set to ``nullptr``). + +Each call to ``run()`` appends a task to the calling thread's binary tree and if the tree was empty (i.e. the inserted task is the first in the tree), +spawns a service *grab-task* pointing to the tree. + +The sequence diagram for ``run`` is shown below: + +```mermaid +flowchart TD + run["run(task_body)"] --> allocate_tree_task[t = allocate task] + allocate_tree_task --> add_task["first = thread_local_tree.add_task(t)"] + add_task --> first_check[first ?] + first_check --> |Yes| allocate_grab_task[gt = allocate grab task] + first_check --> |No| exit + allocate_grab_task --> spawn_grab_task["spawn(gt)"] + spawn_grab_task --> exit +``` + +When the worker thread executes the *grab-task* stolen from the producer's local task pool, it grabs all the items in the producer's tree. + +Since the producer's tree is left empty, further call to ``run`` would append a task to the empty tree, resulting in spawning new *grab-task*s. + +After grabbing the task tree, the *grab-task* bypasses the head task of the tree. + +The bypassed head task checks the number of items in the tree, and if it exceeds the specified grainsize - splits the tree into halves. +The head task of the second half of the tree is spawned and the currently executing task (that is now head of the first half of the tree) +is re-executed, resulting in recursive splitting until the grainsize is reached. +Once the grainsize is reached, the head of the tree spawns its left and right leaf tasks if any and executes the associated user body. + +The sequence diagram for the grab and split tasks is shown below. + +```mermaid +flowchart TD + grab["grab_task(tree)"] --> grab_all["head = tree.grab_all()"] + grab_all --> bypass_head[bypass head] + bypass_head --> head_body["head body"] + head_body --> is_divisible_check[head->is_divisible ?] + is_divisible_check --> |Yes| split_head["head2 = split(head)"] + is_divisible_check --> |No| start_execute["t = head"] + split_head --> spawn_head2["spawn(head2)"] + spawn_head2 --> |Other thread| head2_body + head2_body --> head_assign[head = head2] + head_assign --> is_divisible_check + start_execute --> left_check[t->left == nullptr ?] + left_check --> |Yes| execute_t[execute t's function] + left_check --> |No| spawn_left["spawn(t->left)"] + execute_t --> exit + spawn_left --> |Other thread| left_body + spawn_left --> |This thread| right_check[t->right == nullptr ?] + right_check --> |Yes| execute_t + right_check --> |No| spawn_right["spawn(t->right)"] + spawn_right --> |Other thread| right_body + spawn_right --> |This thread| execute_t + left_body --> assign_t_left["t = t->left"] + assign_t_left --> left_check + right_body --> assign_t_right["t = t->right"] + assign_t_right --> left_check +``` Consider the producer-consumer example from the introduction, now using *aggregating-task-group* instead of ``tbb::task_group``. -When the *aggregating-task-group* is created, the list of the producer thread is empty. +When the *aggregating-task-group* is created, the task tree of the producer thread is empty. - +The first task submitted to the group is appended to the tree, and since the tree was empty, the ``grab_task`` is spawned (added to the local task pool). -The first task submitted to the group is appended to the list, and since the list was empty, it spawns (adds to the local task pool) -the ``agg_task``, which points to the producer thread's task list. +Subsequent task submitted to the group are appended to the tree without spawning any tasks until the ``grab_task`` executes. -Aggregating tasks reserve a reference in the ``task_group``'s global counter and maintain a separate counter for tasks processing the chunks. -The lifetime of ``agg_task`` is extended until the last chunk of the grabbed list is processed. +Once a consumer worker thread steals and executes the ``grab_task``, @@ -138,3 +228,42 @@ There are several options for expressing tasks aggregation in the public API: * Which public APIshould be used to implement tasks aggregation? See the [Possible APIs section](#possible-apis) for details. * Which chunking approach should be implemented? See the [Alternative Approaches for Chunking section](#alternative-approaches-for-chunking) for details. * What chunk size should be chosen? + + + + + + + + +### Adding a task into the tree + +Consider having an empty binary task tree. +The first added task replaces the head of the tree. The second task is inserted as a left subtask of the head. The right subtask of the tree is always ``nullptr`` to support the tree structure described above. + +Starting from the third inserted task, the tasks are inserted into the left or right subtree containing less number of items. + +The sequence diagram of the insertion is shown below: + +```mermaid +flowchart TD + + I[insert new_task into the tree] --> head_check[head == nullptr?] + head_check --> |Yes| head_insert[head = new_task] + head_check --> |No| subtree_insert[subtree = head->left] + subtree_insert --> subtree_check[subtree == nullptr?] + subtree_check --> |Yes| subtree_head_insert[subtree = new_task] + subtree_check --> |No| subtree_head_left_check[subtree->left == nullptr?] + subtree_head_left_check --> |Yes| subtree_head_left_insert[subtree->left = new_task] + subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == new_task?] + subtree_head_right_check --> |Yes| subtree_head_right_insert[subtree->right = new_task] + subtree_head_right_check --> |No| subtree_head_size_check[subtree->left->num_items
<
subtree->right->num_items
?] + subtree_head_size_check --> |Yes| subtree_switch_left[subtree = subtree->left] + subtree_head_size_check --> |No| subtree_switch_right[subtree = subtree->right] + subtree_switch_left --> subtree_head_left_check + subtree_switch_right --> subtree_head_left_check + head_insert --> exit + subtree_head_insert --> exit + subtree_head_left_insert --> exit + subtree_head_right_insert --> exit +``` \ No newline at end of file From d93f52a6245136a1e7f617a19a3f226c6a24f87e Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Thu, 11 Dec 2025 13:49:50 +0200 Subject: [PATCH 3/8] Save progress --- rfcs/proposed/tasks_aggregation/README.md | 96 ++++++++++++++++++----- 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/rfcs/proposed/tasks_aggregation/README.md b/rfcs/proposed/tasks_aggregation/README.md index 5268194ea1..d5f99e41e5 100644 --- a/rfcs/proposed/tasks_aggregation/README.md +++ b/rfcs/proposed/tasks_aggregation/README.md @@ -164,38 +164,98 @@ The first task submitted to the group is appended to the tree, and since the tre Subsequent task submitted to the group are appended to the tree without spawning any tasks until the ``grab_task`` executes. -Once a consumer worker thread steals and executes the ``grab_task``, +Once a consumer worker thread steals and executes the ``grab_task``, it grabs the tree containing some amount of tasks. Let's say it contains 1000 tasks. - +Starting from this moment, the producer's task tree is empty again, hence subsequent ``run``s would spawn additional ``grab_task``s. -Subsequent tasks submitted to the group are appended to the head of the list without spawning additional aggregating tasks. +Consumer thread check if the grabbed tree is divisible and if it is - splits the tree into halves, spawns a task representing a second subtree, and re-executes +the current tree's head to keep dividing the tree until the desired grainsize is achieved. - +Let's consider a grainsize of 150 tasks. Producer thread appended 500 tasks into the task tree before the consumer thread 1 came and grabbed them. +Thread 1 splits the tree into two halves (each containing 250 tasks) and spawns a head into thread 1's local task pool. -When a consumer worker thread looks for work, the only task available for stealing is ``agg_task``. +Assume Thread 2 steals the spawned task from Thread 1 - it will also split the subtree into two halves, each containing 125 tasks, but will spawn the second half to Thread 2's +local task pool. - +Thread 3 can now steal the task spawned by Thread 2 and since it is not divisible - spawns the entire subtree to its local task pool. -When the consumer thread executes the ``agg_task``, it grabs the task list and makes it empty again. Further calls to ``run()`` will -append the task to the empty list and spawn additional *aggregating-task*s to grab the new list. +Same amount of tasks would be spawned by Thread 2 when the task would be re-executed. - +Thread 1 would split the tree once more resulting it once more stealing (let's say by Thread 4). -After grabbing the task list, the consumer thread splits the list into chunks of fixed size. Assume a chunk size of ``2``. -In the example above, it will create two service *chunk-task*s pointing to the sub-lists. One is spawned, while the other is bypassed. +Hence, for such a model, instead of spawning 500 tasks by the Producer Thread and further stealing from a single source, 4 threads have spawned 125 tasks each, resulting +in 4 different task sources for stealing that improves the stealing scalability. -Chunk tasks reserve a reference in the aggregating task's reference counter and maintain another counter for individual listed tasks in the chunk. -The lifetime of a chunk task is extended until the last listed task in the chunk is executed. +This model can be interpreted also in the following manner. Consider a producer is going to generate N input work items. As it was mentioned, N is unknown in advance. +The execution using *aggregating-task-group* would be similar to buffering some amount of inputs, execute async parallel for on top of the buffer and start buffering again. +So processing *N* input work items can result in *M* ``parallel_for`` invocations over *K0*, *K1*, ..., *KM* iterations where *K0* + *K1* + ... + *KM* == *N*. - +### Resolving the Reference Counting Bottleneck -Another consumer thread can now steal the *chunk-task* from the first consumer thread's local task pool. +As it was mentioned in the introduction, ``tbb::task_group`` in the single producer-multiple consumers case suffers from a bottleneck caused by tasks reference counting. -When the consumer thread executes the *chunk-task*, it spawns all tasks except one and bypasses the last. +Since all of the tasks are created by a single thread, it's ``thread_reference_vertex`` holds a single reference in a ``task_group``s ``wait_context``, while each +task holds reference in a producer's ``thread_reference_vertex``. Since the tasks are likely stolen and executed by consumer threads, reference counter in producer's +``thread_reference_vertex`` would be decremented by multiple threads, resulting in negative performance effects. + +In the *aggregating-task-group* task distribution approach, this can be solved by adding a reference counter to each task of the tree. A reference is held: +1. For a task itself +2. For a left task in a tree +3. For a right task in a tree + +Before spawning, the *grab-task* holds a reference in a calling thread ``thread_reference_vertex``. Once it executes and grabs the task tree, it substitutes itself +with the head of the grabbed subtree in a waiting tree. + +The lifetime of each task is extended until the reference counter is non-zero. Similar to + +```mermaid +flowchart TD + producer_vertex[producer thread vertex
ref_count = 1] --> tg_wait_context[task_group wait context
ref_count = 1] + task0[task0
ref_count = 2] --> producer_vertex + task0 --> task1[task1
ref_count = 3] + task1 --> task2[task2
ref_count = 1] + task1 --> task3[task3
ref_count = 1] + task1 --> task0 + task2 --> task1 + task3 --> task1 + + linkStyle 0,1,5,6,7 stroke:blue,stroke-width:2px,color:blue + linkStyle 2,3,4 stroke:red,stroke-width:2px,color:red +``` + +In a diagram above, red arrows denotes a left or right child in a task tree and are not involved in a reference counting. +Blue arrows denotes a parent relationship in a waiting tree. + +When a subtree is split into halves, only the red arrows are changing. The waiting tree remain unchanged. +Once a task executed it's body, it releases a self-reference held in a reference counter. Once the reference counter reaches zero, +the task is deallocated and releases a reference in it's parent in a waiting tree. + +This approach allows to distribute the reference counting across multiple tasks and avoid bottleneck on a single counter. + +### Allocator Bottleneck + +Another bottleneck that appears in a single producer- multiple consumer scenario is an allocation bottleneck. In a regular ``task_group`` (as well as +in most of TBB parallel algorithms), tasks are allocated in a per-thread small object pool. Only an owner thread can allocate from a pool, but multiple +threads can release a memory to a pool. + +Since all of the tasks are created (i.e. allocated) by a single producer's small object pool, multiple stealers would release the memory to a single pool +during the group's work. Producer's small object pool becomes another bottleneck in a system. + +Current version of the document do not propose concrete solution for this bottleneck. Possible solution may be to avoid deallocating the task tree on the +consumer's side, but create a service *free-task* pointing to the task tree and submitting it directly to the producer to guarantee that the memory would +be deallocated by the owner. But since the original tree structure is broken by the constant tree splitting, this approach is not straightforward to implement. + +## Performance Analysis + +## Alternative Approaches Considered + +## Possible APIs + +## Open Questions + +## Task Tree operations in Details - -### Alternative Approaches for Chunking Alternative approaches for how the *aggregating-task* should process the grabbed list can be considered. From b87a911265fc60dfe1f1a6faf9557a44639c54c2 Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Fri, 12 Dec 2025 14:08:57 +0200 Subject: [PATCH 4/8] Add Table of Contents --- rfcs/proposed/task_aggregation/README.md | 410 ++++++++++++++++++ .../aggregating_group_aggregating_task.png | Bin .../assets/aggregating_group_chunking.png | Bin .../aggregating_group_consumer_thread.png | Bin .../assets/aggregating_group_first_run.png | Bin .../assets/aggregating_group_further_runs.png | Bin .../aggregating_group_process_chunks.png | Bin .../aggregating_group_producer_thread.png | Bin .../assets/perf_comp_parallel_for.png | Bin 0 -> 33251 bytes .../assets/perf_scalability.png | Bin 0 -> 32536 bytes .../producer_consumer_consumer_threads.png | Bin .../producer_consumer_producer_thread.png | Bin rfcs/proposed/tasks_aggregation/README.md | 329 -------------- 13 files changed, 410 insertions(+), 329 deletions(-) create mode 100644 rfcs/proposed/task_aggregation/README.md rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_aggregating_task.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_chunking.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_consumer_thread.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_first_run.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_further_runs.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_process_chunks.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/aggregating_group_producer_thread.png (100%) create mode 100644 rfcs/proposed/task_aggregation/assets/perf_comp_parallel_for.png create mode 100644 rfcs/proposed/task_aggregation/assets/perf_scalability.png rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/producer_consumer_consumer_threads.png (100%) rename rfcs/proposed/{tasks_aggregation => task_aggregation}/assets/producer_consumer_producer_thread.png (100%) delete mode 100644 rfcs/proposed/tasks_aggregation/README.md diff --git a/rfcs/proposed/task_aggregation/README.md b/rfcs/proposed/task_aggregation/README.md new file mode 100644 index 0000000000..87c7e4de63 --- /dev/null +++ b/rfcs/proposed/task_aggregation/README.md @@ -0,0 +1,410 @@ +# Task Aggregation + +This proposal outlines a possible solution to producer-consumer inefficiencies in the current ``task_group`` API. + +## Table of Contents + +* 1 [Introduction](#introduction) +* 2 [Proposed Design](#proposed-design) + * 2.1 [Resolving the Single Task Source Bottleneck](#resolving-the-single-task-source-bottleneck) + * 2.2 [Resolving the Reference Counting Bottleneck](#resolving-the-reference-counting-bottleneck) + * 2.3 [Allocator Bottleneck](#allocator-bottleneck) + * 2.4 [Grabbing Thread Slowdown](#grabbing-thread-slowdown) +* 3 [Performance Analysis](#performance-analysis) +* 4 [Possible APIs](#possible-apis) +* 5 [Open Questions](#open-questions) +* 6 [Task Tree Operations in Detail](#task-tree-operations-in-detail) + * 6.1 [Synchronization Between Grabber and Producer](#synchronization-between-grabber-and-producer) + * 6.2 [Adding a Task to the Tree](#adding-a-task-to-the-tree) + * 6.3 [Splitting the Tree](#splitting-the-tree) +* 7 [Alternative Approaches Considered](#alternative-approaches-considered) + +## Introduction + +Consider an application that uses ``tbb::task_group`` with a single-producer/multiple-consumers pattern: one producer thread generates work items, and +multiple consumer threads process them in parallel. + +```cpp + +void produce() { + tbb::task_group tg; + + auto work_item = get_work_item(); + + while (work_item != end_of_work) { + tg.run(process(work_item)); // Can be executed by any worker + } + + tg.wait(); +} +``` + +The ``get_work_item()`` function generates work items, e.g., by reading from an input file or stream. When no more work remains, it +returns ``end_of_work``. + +Because the number of work items is unknown in advance, algorithms such as ``tbb::parallel_for`` or ``tbb::parallel_for_each`` can be inefficient: +they require buffering to create an input sequence, delaying computation of the earliest items. + +``tbb::task_group`` is semantically appropriate because it submits available work immediately for execution. + +In current implementation, ``tbb::task_group::run`` creates a task for the given callable and pushes it into the producer thread's local task pool. + +When worker (consumer) threads join the task arena, they search for tasks to process. Because the producer's local task pool is the sole task source, +worker threads steal tasks from it. + +After completing a stolen task, workers become idle and steal again from the same producer's pool. +When many consumers contend for a single producer's pool, stealing becomes a bottleneck, leading to performance +penalties and poor scalability. + +Another bottleneck is the ``tbb::task_group``'s reference counter used to register tasks in the group. The counter +increments when a task is created and decrements when the task completes. + +To improve scalability, oneTBB 2022.1.0 introduced per-thread reference counters: each thread that creates +tasks registers its thread-local counter as a leaf in the group's counter. + +Tasks created by a thread hold references in the thread-local counter, which in turn holds a single reference in the group's counter. + +However, in the scenario above, all tasks are created by the producer thread, so all reference converge into a single producer's counter. + +## Proposed Design + +### Resolving the Single Task Source Bottleneck + +This document proposes a task distribution mechanism that combines the existing ``task_group`` spawning model with an aggregator. + +For simplicity, we refer to this API as *aggregating-task-group* providing ``run(task_body)`` and ``wait()`` methods, +analogous to ``tbb::task_group``. + +Tasks in an *aggregating-task-group* form a binary task tree: the first and second layers contain a single task, and the N-th layer contains up to $2^N$ tasks. + +Each tree node contains three pointers: +* Pointer to the left child (next layer) +* Pointer to the right child (next layer) +* Pointer to the parent (previous layer) + +Additionally, each node stores the number of items in its subtree. + +```mermaid +flowchart TD + task0[task0
num_items = 7] --> task1 + task1[task1
num_items = 6] --> task2 + task1 --> task3 + task2[task2
num_items = 3] --> task4[task4
num_items = 1] + task2 --> task5[task5
num_items = 1] + task3[task3
num_items = 2] --> task6[task6
num_items = 1] + task1 --> task0 + task2 --> task1 + task3 --> task1 + task4 --> task2 + task5 --> task2 + task6 --> task3 + + + linkStyle 0,1,2,3,4,5 stroke:red,stroke-width:2px,color:red + linkStyle 6,7,8,9,10,11 stroke:blue,stroke-width:2px,color:blue +``` + +The binary task tree supports three basic actions: +* Add a task to the tree +* Split the tree into halves +* Grab all items in the tree + +Detailed description of these operations appear in [Task Tree Operations in Detail](#task-tree-operations-in-detail) section. + +Each *aggregating-task-group* instance maintains a thread-local atomic pointer to its binary tree, initially empty. + +Each ``run()`` appends a task to the calling thread's tree and if the tree was empty, it also spawns a service *grab-task* +that references the tree. + +```mermaid +flowchart TD + run["run(task_body)"] --> allocate_tree_task[t = allocate task] + allocate_tree_task --> add_task["first = thread_local_tree.add_task(t)"] + add_task --> first_check[first ?] + first_check --> |Yes| allocate_grab_task[gt = allocate grab task] + first_check --> |No| exit + allocate_grab_task --> spawn_grab_task["spawn(gt)"] + spawn_grab_task --> exit +``` + +When a worker executes the stolen *grab-task*, it grabs all items from the producer's tree. + +Because the producer's tree is left empty, subsequent ``run`` calls append tasks and spawn new *grab-task*s. + +After grabbing the tree, the *grab-task* bypasses the head node. + +The head checks the tree's item count and, if it exceeds the specified grainsize, splits the tree into halves. +It then spawns the head of the second half, while the current task (now the head of the first half) re-executes, +recursively splitting until the grainsize is reached. + +Once the grainsize is reached, the head spawns its children recursively and executes the user body. + +```mermaid +flowchart TD + grab["grab_task(tree)"] --> grab_all["head = tree.grab_all()"] + grab_all --> bypass_head[bypass head] + bypass_head --> head_body["head body"] + head_body --> is_divisible_check[head->is_divisible ?] + is_divisible_check --> |Yes| split_head["head2 = split(head)"] + is_divisible_check --> |No| spawn_children("recursive children spawn") + split_head --> spawn_head2["spawn(head2)"] + spawn_head2 --> |This thread| is_divisible_check + spawn_head2 --> |Other thread| head2_body + head2_body --> head_assign[head = head2] + head_assign --> is_divisible_check + spawn_children --> execute_body["execute head's user body"] + execute_body --> exit + +``` + +Revisit the producer-consumer example using *aggregating-task-group* instead of ``tbb::task_group``. + +When the *aggregating-task-group* is created, the producer's task tree is empty. + +The first submitted task is appended and because the tree was empty, a *grab-task* is spawned (added to the local task pool). + +Subsequent tasks are appended without spawning until the *grab-task* executes. +When a worker steals and executes the *grab-task*, it grabs the tree. + +From that moment, the producer's tree is empty again, so subsequent ``run`` call spawn additional *grab-task*. + +The consumer checks whether the grabbed tree is divisible; if so, it splits the tree into halves, spawns a task for the +second subtree, and re-executes the head to continue dividing until the desired grainsize is reached. + +Assume a grainsize of 150 tasks. The producer appended 500 tasks into the task tree before the consumer thread 1 came +and grabbed them. Thread 1 splits the tree into two halves (250 tasks each) and spawns the head of the second half into +its local pool. + +Thread 2 steals that task, splits the subtree into two halves (125 each), and spawns the second half to its own local pool. + +Thread 3 steals the task spawned by Thread 2, and since it is no longer divisible, it spawns the entire subtree into its local pool. + +Thread 2 will similarly spawn the other half when its task re-executes. + +Thread 1 splits again, enabling another steal (e.g., by Thread 4). + +Thus, instead of the producer spawning 500 tasks into a single source, four threads each spawn 125 tasks, creating four +independent work sources that improve stealing scalability. + +This model can also be interpreted as follows. Suppose the producer will generate *N* input items, where *N* is unknown in advance. +Execution with *aggregating-task-group* resembles buffering a batch of inputs, running an asynchronous parallel-for over the batch, then buffering again. + +Processing *N* items may result in *M* parallel-for invocations over $K_0$, $K_1$, ..., $K_M$ iterations, where $\sum_{i=0}^{M} K_i = N $ + +### Resolving the Reference Counting Bottleneck + +As noted earlier, ``tbb::task_group`` suffers a reference-counting bottleneck in the single-producer/multiple-consumers case. + +Because all tasks are created by a single thread, its ``thread_reference_vertex`` holds one reference in the group's +``wait_context``, while each task holds a reference in the producer's ``thread_reference_vertex``. + +As tasks are stolen and executed by consumers, the producer's ``thread_reference_vertex`` counter is decremented concurrently +by many threads, causing contention and performance loss. + +In *aggregating-task-group*, it is addressed by adding per-task reference counters. References are held for: +1. The task itself +2. Its left child (if any) +3. Its right child (if any) + +Before spawning, the *grab-task* holds a reference in a producer's ``thread_reference_vertex``. After execution and grab, +it replaces itself with the head of the grabbed tree in the waiting tree. + +Each task's lifetime extends until its reference count reaches zero. + +```mermaid +flowchart TD + producer_vertex[producer thread vertex
ref_count = 1] --> tg_wait_context[task_group wait context
ref_count = 1] + task0[task0
ref_count = 2] --> producer_vertex + task0 --> task1[task1
ref_count = 3] + task1 --> task2[task2
ref_count = 1] + task1 --> task3[task3
ref_count = 1] + task1 --> task0 + task2 --> task1 + task3 --> task1 + + linkStyle 0,1,5,6,7 stroke:blue,stroke-width:2px,color:blue + linkStyle 2,3,4 stroke:red,stroke-width:2px,color:red +``` + +In a diagram, red arrows denote left/right child links in the task tree and are not involved in a reference counting. +Blue arrows denote parent links in the waiting tree. + +When a tree is split, only the red links change; the waiting tree remains unchanged. + +After a task executes its body, it releases its self-reference. When its count reaches zero, the task is deallocated and +releases its parent's reference in the waiting tree. + +This approach distributes reference counting across tasks and avoids a single-counter bottleneck. + +### Allocator Bottleneck + +Another bottleneck that appears in a single-producer/multiple-consumer scenario is an allocation bottleneck. + +In ``tbb::task_group`` (and most TBB algorithms), tasks are allocated from per-thread small-object pools. Only the owner thread allocates from its pool, while multiple threads can release memory to it. + +Because all tasks are created by a single producer's pool, multiple stealers release memory into that same pool during execution. The producer's pool becomes another system bottleneck. + +This document does not yet propose a concrete solution for this bottleneck. + +### Grabbing Thread Slowdown + +We also consider slowing down the grabbing thread when the desired tree's item count is below the recommended threshold. +In that case, the grabbing thread can sleep intermittently and re-check the tree size. After waking, if the tree size +exceeds the threshold, does not grow further, or a fixed number of sleeps is exceeded, the thread grabs +the tree and begins division. + +## Performance Analysis + +Consider the following benchmark to evaluate the proposed approach. +The producer requests parallel computation over *N* input items. It splits the input into *NumChunks* and evaluates three approaches: +1. ``tbb::parallel_for`` over *N* inputs using ``simple_partitioner`` with grainsize *NumChunks*. Although *N* is unknown in real single-producer/multiple-consumers scenarios (making this approach impractical), it serves as an upper-bound "gold" baseline for the benchmark. +2. Submit *NumChunks* tasks to a regular ``tbb::task_group``. +3. Submit *NumChunks* tasks to *aggregating-task-group*. + +Experiments were run on a 256-CPU, dual-NUMA machine. + +The chart below compares ``tbb::task_group`` and *aggregating-task-group* against ``parallel_for``. + + + +The table and chart report slowdowns relative to ``parallel_for``. + +For small task counts, ``tbb::task_group`` matches ``parallel_for``; beyond a threshold, its slowdown grows dramatically. + +*aggregating-task-group* also slows relative to ``parallel_for``, but performs up to 10x better than a regular ``task_group``. + +The next chart shows scalability for all three approaches at the largest chunk count. + + + +*aggregating-task-group* scales significantly better than regular ``task_group``. + +## Possible APIs + +It is not advisable to replace ``tbb::task_group`` with the proposed aggregation algorithm wholesale, as that could introduce +unnecessary overhead in scenarios where tasks are submitted by multiple threads (e.g., divide-and-conquer). + +This document does not yet propose a concrete API. The following options can be considered: +1. A separate ``task_group``-like API with the same member functions. +2. Integration into ``tbb::task_group``, e.g., an additional ``run()`` overload with a policy parameter or a separate member function. +3. A separate API (e.g., ``tbb::parallel_while(generator, predicate, body))``), equivalent to +``while(input = generator(), predicate(input)) { body(input); }``, where the generator and the predicate +run on the calling thread while the loop bodies execute in parallel. + +## Open Questions + +* Should task aggregation be exposed as part of the public TBB API? +* Which public API surface is most appropriate? See [Possible APIs section](#possible-apis). +* Which configuration parameters and heuristics are appropriate (e.g., tree division grainsize, grabbing-thread slowdown, etc.)? +* Solutions for the producer's [allocator bottleneck](#allocator-bottleneck) should be considered. + +## Task Tree Operations in Detail + +### Synchronization Between Grabber and Producer + +Because the task tree is thread-local and only one *grab-task* is spawned per non-empty tree, synchronization is needed only +between the producer (which adds tasks) and the grabber (which collects tasks for distribution). + +Synchronization can be implemented with a single atomic pointer to the tree head and a spin-lock built on that atomic. +The algorithm reserves a sentinel ``locked`` value of type ``tree_task*``. + +The producer locks its thread-local tree by exchanging the atomic value to ``locked``. After inserting a new leaf into the tree, the producer +exchanges ``locked`` back to the head pointer. + +The grabber reads the atomic head; if it is ``locked``, it spins until unlocked. Once unlocked, it attempts to CAS to set the head to ``nullptr``. +If CAS fails (the producer re-locked the tree), the grabber spins and retries. + +```mermaid +flowchart TD + grab --> load_tree["tree = head.load()"] + load_tree --> check_locked["is_locked(tree) ?"] + check_locked --> |Yes| spin_while_locked["tree = spin_while_locked(head)"] + check_locked --> |No| try_grab["head.cas(tree, nullptr)"] + spin_while_locked --> try_grab + try_grab --> |Success| exit_grab["Exit to tree distribution"] + try_grab --> |Fail| spin_while_locked + + add_task[add_task
producer] --> lock_tree["tree = head.exchange(nullptr)"] + lock_tree --> insert["do insert"] + insert --> unlock_tree["head.exchange(tree)"] + unlock_tree --> exit_producer["Exit"] +``` + +### Adding a Task to the Tree + +Consider an empty binary task tree. The first added task becomes the head. The second task is inserted as the head's left child. +The right child of the head is always ``nullptr`` to maintain the structure described above. + +From the third task onward, insert into the subtree (left or right) with fewer items. + +```mermaid +flowchart TD + + I[insert new_task into the tree] --> head_check[head == nullptr?] + head_check --> |Yes| head_insert[head = new_task] + head_check --> |No| subtree_insert[subtree = head->left] + subtree_insert --> subtree_check[subtree == nullptr?] + subtree_check --> |Yes| subtree_head_insert[subtree = new_task] + subtree_check --> |No| subtree_head_left_check[subtree->left == nullptr?] + subtree_head_left_check --> |Yes| subtree_head_left_insert[subtree->left = new_task] + subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == new_task?] + subtree_head_right_check --> |Yes| subtree_head_right_insert[subtree->right = new_task] + subtree_head_right_check --> |No| subtree_head_size_check[subtree->left->num_items
<
subtree->right->num_items
?] + subtree_head_size_check --> |Yes| subtree_switch_left[subtree = subtree->left] + subtree_head_size_check --> |No| subtree_switch_right[subtree = subtree->right] + subtree_switch_left --> subtree_head_left_check + subtree_switch_right --> subtree_head_left_check + head_insert --> exit + subtree_head_insert --> exit + subtree_head_left_insert --> exit + subtree_head_right_insert --> exit +``` + +### Splitting the Tree + +As noted above, each node maintains pointer to left/right children and to its parent. + +This document proposes requiring the grainsize to be >= 4 to simplify splitting. + +Splitting occurs only after a grab; thus, the splitting thread exclusively owns the tree, and no synchronization is needed. + +Only the first two layers of the tree are needed for splitting. Let's call them ``head`` and ``next``. Splitting is done by setting +``head->left = next->right``, then ``next->right = nullptr``, and update counters accordingly. + +Parent pointers are not modified so the waiting tree remains intact for reference counting. + +Before splitting + +```mermaid +flowchart TD + head[head
num_items = 8] --> next[next
num_items = 7] + next --> t1[t1
num_items = 3] + next --> t2[t2
num_items = 3] + t1 --> t3[t3
num_items = 1] + t1 --> t4[t4
num_items = 1] + t2 --> t5[t5
num_items = 1] + t2 --> t6[t6
num_items = 1] +``` + +After splitting + +```mermaid +flowchart TD + head[head
num_items = 4] --> t2[t2
num_items = 3] + t2 --> t5[t5
num_items = 1] + t2 --> t6[t6
num_items = 1] + + next[next
num_items = 4] --> t1[t1
num_items = 3] + t1 --> t3[t3
num_items = 1] + t1 --> t4[t4
num_items = 1] +``` + +## Alternative Approaches Considered + +An alternative considered was aggregating tasks in a producer-side singly-linked list instead of a tree. +This simplifies synchronization between the grabber and producer using a single atomic: producer uses CAS; grabber uses exchange. + +However, after grabbing a list, the efficient options are limited: crop a prefix, spawn a service task to process the tail, then spawn tasks from the cropped prefix. +This requires traversing the cropped tasks twice, because the tail's service task must be spawned first to be stolen first. + +A binary task tree provides significantly better distribution (akin to ``parallel_for``'s work splitting). diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_aggregating_task.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_aggregating_task.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_aggregating_task.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_aggregating_task.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_chunking.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_chunking.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_chunking.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_chunking.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_consumer_thread.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_consumer_thread.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_consumer_thread.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_consumer_thread.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_first_run.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_first_run.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_first_run.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_first_run.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_further_runs.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_further_runs.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_further_runs.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_further_runs.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_process_chunks.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_process_chunks.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_process_chunks.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_process_chunks.png diff --git a/rfcs/proposed/tasks_aggregation/assets/aggregating_group_producer_thread.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_producer_thread.png similarity index 100% rename from rfcs/proposed/tasks_aggregation/assets/aggregating_group_producer_thread.png rename to rfcs/proposed/task_aggregation/assets/aggregating_group_producer_thread.png diff --git a/rfcs/proposed/task_aggregation/assets/perf_comp_parallel_for.png b/rfcs/proposed/task_aggregation/assets/perf_comp_parallel_for.png new file mode 100644 index 0000000000000000000000000000000000000000..889a96d16eac190e757d176e4f407c8ad8d50d54 GIT binary patch literal 33251 zcmcG$XH=70w>FF@vIUXt7C}ME-WHmGq7dn@5k-*RBoGh*krq0kg<`>i6qT|ODT;JL zq=b@CM5OnY&_WSI3xwWF-gSe|InNp6{P@oIo|iEk5xDPF=bH1H*Sr=lb+vD^v2e36 zFfg#)QNO9rz;L*Ufq{|jx1-=E6RV-G!N(yF{o8*tk^_#J0 zY)+nZwKj;Q@3i%tZM#lZP^ejH@mybDzN>`Dz^CJ9R%DD;i84k;wyQI}&j*T~9l^jD z7{2B@ten{Y-_l8;!_a?z7tn>~#UP-Zavb_p4pu%3eFigxNJ5_shZt@5KN*jJRRCW{ zev3W?eg5|Q|Mv!dzE%t4G^OwDM*5J^>*V5q&80`#si~XC&q{u8H5qxHTIf6|%_HOf zxw*aZo#1Wjunc;qXncR6-C&B!lc92jz^e1YBaM+udR^`(Mi-<-y1$#zx||O0pw z9N|DEVI%b)=9pl;=M!bU+?UrxsPl0eqN?`rzoPmG^OcVC<;xN1#agb;GZ)@zNJRMj zz=b*wm3C5gnfU{L4_Cq0BF~FH@u3J9m_>^6%$cR3=7))89(J(fqv~LZe63QR&R)0g zy1;Yw!OiHu)s_)Mq8|6L?;e2>j0+Sn3bn_qZ?WkrHaYN2OT-C>(aNI_Gn~dW&GhE5 zRd9%ya7_K|y0aUbuj*=?rqbll@R>J}|vzw0NN6 zdv8ipOtDkHvhsM5Q!6S;iyX5fk0F`LZo)d*v|`tGQ^&l>hbQ)1tdFx6GS&MxU?`L<<`X z`MtoWv-3!|uxUC4P7!)+Wm;-}EM4aFS~eJd+Kie`i^D%TpIrZEtLTolj&I89!e+{o z>@tr@eEY3PzPaI;swP;P7efYZ?ax-Z-Vq6N?Zr)>LFbbG!gfV!-L${w*UY@}Jyckn z%O1+5>+_vABl^^o`L*Q}wG*lZ_C?3HoQS!p^Ao)0zOPO8G~uWpl$R$8YCP`|$0=$; z-WBNh%Ub9al_&Tc*{?Hq?73TE#~FWMG_xr>)U}55ksNywlgUAqY<%*4=sfw}0ug%P z!V`Xu&DL*znex+p`KgGY-PLElf4KBZkx`Y)yd|@WmVZ~~y{uH~^cJ!}81B8AI6I*x zGWhXFY;Rb}T^QNZ;G4yTtmqoU^u;P{ETSr2LKHUale#T${t%N8sB|o7+=c>+*`h70 zQ&cIvlOJQncF6jz&92*`aQ>K&NHYGku-(AX%p5GSS|Y4zc)49E=w`ghE@}O`%W%26 zOowEhK5t~4(jNo~)|lH#4toP!&ul-rj8r}w)T=rkD0eZf|LBJ78D#3am#w$ygnC+G zQQpg9=6ouPO^(ARvurB&^+&&744K7Q)f_E3+!3(@Y)>3RBNjevbx(GjbXyozA*>Jk zW57VXTct>)iC^97c_&YFT-TQ4P)f#_l?*J_^Ur&q8QG|V4XISsIZh5`={qeby5pQPkID~h6qCc&y*n1A{PsNn5u(#k2gYPG2@zlIR%bg!wH2Oq)@_a1t z1vDhL7S?x)!7$k}V6j%*ZbFtUNvh46-blhXv*6n7ADo;e*?)Ao{ z%dtwzT?JG3_2mM2UpzV+6WRJ+%A@(S7fJr;@iX@`k^{k^&+!aSdBTQ%UTHRuEnj*y z*Oy=8(3@?`W#RKNL3=Ytd|ktlSBigE8h;Bx#rO(t?-mWiwdvax3*T6gey#PBsZCFo zZgm$w>iov%GkOSx#!aNT!Hc;p13JBYy90LIr%@!8^w_!F!nT4S`t}GiY0H_~ljZT< zeg6RLEj(8$we3E%-X6GiElzN2E<$GF%=%y>0!5|-T2k_3n{`rmNFj-qO6c@e5$CAf zY25Mm^*k=+R^i-I?zZqBG4!`RylkTL@>MM+2rr{IMKj^CWw#^wyu0oQmif*N;Bpq$ zf2++a!LFxeMPe(rvPD__?EOF5ug&&b2klZV-{plpo;Pexp2^?Sp{5@;7b7`hD;{pI z&!dtk}*sQ^|~;8y|H*XIcTp85x7aA!8&aPTq-xy{j;1N#p9ARV=v2mI>BiYXpl9p z7+I9qS?)Q{ObLr^bva)%{g#rpM1Lump1J?wn#1h4GR;*TsWxZ&&sD_-5CX_OIfN5KZ#G}m)7t80Kc zGk50ZKuP7Q7zu~i7OX-nG>?`T=)ZRk9+BSM5z=;2+}g^f^cEwUGj=-4i+DG;N9cjy z*93}p82Vr3ks4%V@AdSXRB+@9mv*X@!*3LwH|hA4SlQOH#mPTcT6CTTha?XqVu;#m zbZYz0EyonEqsDTl=f2cz+TWAAI2Zh2IybMfJ-OmEIACTJA_=j44c1P&*yrLc~w zd~3YO;IvjoVb7L%k!rVgPf6WVPuKMMo`9Wrs}b4JWmV>ZJ;F{oI_K{@OD)~iQ78V` z^|K#_^JAW9TRhs8s`Q>4pru)j{K40yQgWhr7v-oZD|F|U@5fk{PC|0Y@Wr+DZodsm zk7iX_YDhRx~u<)WTI#w+$^~p63s~({=Mb zYcVOZHCMFz%A^E$S7d%5@P&3@=DDdLqv2@IRibWXt(myklcpkmq9_NgIe@oA_QE?5 zSTt>K+Ec>1nv{AGy#&J;8=feU*7Gg5F$p7f(?{O6vsX|r#04h1#v6z!DN76J-fHWN z(3ZPG?@|dHIkuIU-4^;>Vr~Ox%`)BM?si>?i7DUn3$Oo`k55{BexM`0-Nz24DfRWl zyXuGuvN-h^X<%qR<1$g=JL8+fX?zuUK2Q6TTEvb z-&l#>9wKl}q$)-AH2$+d?_oTZAlSG>e>6R6fCi);tr@1_c{Oe|3+GeX;y(6$J>OrDZL3`!MfBKM7|W|yE%;g+ zS7Wn$`HrcU;Yf|wa!u`ST|Pw+gwC`r|4RwlRKcxqwdz<#avy#!iwE1z?##|{!!alq zm3aK*YF)>?0r$%#>3GkHtfrWzIJ%Ovs%G|u!Qj-fb<@B>%4R|4$i--f%|nvBA(Fq} zKBK-JSLH2w>QP4S6E5B_Q{30Y2ypQ(;qK+jCn;9tUfumGKQhhC%IRY4vR@4raz>4- zD)8TD)?X;3kV3NIcR3iS*La7f>EAfjjuFnrKEUV%D9U$CwGgt!i`FTR&y-Nl&|Sw z`4Gk*zv>Kf;x3E2a)QI6Y=((TV~cJc==_-_eoVit>!lP9PNnylrC#rfAp>=##WvFE_XHi^7O!M-0Kb6NUhf!1DVbcQl?(& z5Pf=}A_^Y4(xSzCeMaDl5xzS5gyd-f>Zta7rJ0T7#Vk1%@4xe>Z(a|I`S?nIXg#iY zCrw08p=W0`u&BvTj)Txv=~ZxDrGoLHSlr`>Uj0U85w}MYGnqO?@0f~dT5Ss3qa|1! z?0bueBZ_y#ac#3`f%0dl0LHy;w*=eUT+ACh38=wD%UF()eZPJDWTI$a*=v+37&sL4PrPFK;mV^RRfb1l}|<)(pmcCnj%G ze@{e5iXB}A&;OR^aa)zdQnwd4qmdE&xX+PKRW_wds;`N;Vy9sGq3~YB(8aV7gXKHk zt{mE_2>~xp5Kpg61>dHg4#yg1;?zm@TjEdr z(v}`&8d4*cOv%1zMaTCy$^J3xfwJhTrWD4qr4-pu1=G|QL`~`>cAJCg7~C5z4h~#a z*P#F>g>x|E2i5=$RpyoV09uGQdaF|m={yq3BbvvvoethsB#iHp@}<9Yk21=h3IwnZPqQBIwYU46_{{rf+VsTd#4!Ab!}BcP z>9oY$2@3lkT`I8Aj_PFmH{lxw9R}}%zfL~Kzkjy*(RWiEm)3YKoPfp;UI$fe;NbKD;VgB|$Zb?n$?k7n&vB-Q&(UK1& z!CY1{ONeW$W#_auHJ=5J_xWWW4v2Yq6Z80`kc--K$N19=F>_Hw)y+>!DRd)Ii_2oo ziKt;y8=lm|zA;Y>{RE#zqu@t(Pr$_!JC>>EBI#@#4V&^^UZrC$aSo;m@Wv(=k=2Ua zX=L-K@{TP>)1p=bn8WIYm$%8-n7DzXPd&eBj<5Pk4$Mylp=EBsr<)9%;|wi~Dtpjo ztIC6IQ4<*CgvfRv!2)2MnddY4#kfjZOz4_c{`Td>zK(E0uz9Tq;4$n!64`i#W|SqQ zzZm2coM_rnv6r1rfitJhaKlgbyuFOqJ}H#-O1$c2=IT8`-Urk#@aSF^czm0gazx$|mHa@qYI8fwDlBDe`*4Mqx zaL@Q>v?xnH1+|Ey;4OWXe^E7gB#4RmpHVUb)~oX)RSPn;W$M&CdGNMv7+`#YStR|} zoOtBCouU~T7-EPM&uHS+E`; z$_zP;jIkEzOy|L3y+0U&TRsxoj4|;3sm|2YtGD$Xr&{8#IRoNDoLuT=P3_HzTb=Fi zo@h<5dnc$<9CDZ$Uv$~Ba)?$%-#b6yzfMLGP)sF*#m|#Ys9=LRt7Sue{HfZTVO_ zeGo}#P1jDGA?h`Mnx7_NEw9J)zn5~Hoz6%uMh*Mcr`5>o?%n<8N_F^p5$%)jb7bY_ zL)g5{@+l=9%5$P^e}U~Y>Te9nmolY2r#kdN&oACGFxW)cCHdCPkgzTw!LquZF2q#9 zuDFqs=r@zKpM9n*r$#Ck#98B$w9F3Wo*Nb>9lk2c{C zaqBZV*nzf0xw-6|Jojm(oiTRtFXc2mbtqsE=V;fiu>JwPNr@w783@9(8t8N)#*ADr z9R%{FaiR(}gVKc`0-3M)-12DYc!WntUY*x$UnjiS$({#>^qf9)_-J3eU6MVNTTX9` zR;&*fisqGm6R+HOP$Cb{uvzX#A^W~mC*JIE=MCCf^xoT?Bm^905HRRiSZ}$ zon-{a5ZHL6U)Np8NZEC?+=h<@^!~w9e4^f?S*(OZy!ne&jd@OiWh}|Uzm=)mitkY% z%Ok1qSj}+)euzQf8bn+c#4_Rm z?RG1xhU4odvX&)UDv|L%t}=Vu9k4O4j&!_Vdws3VHRKcgjv6AYw_>1*<8BVYQ$57) zj=5_!Q{J;3ld7#4sxbyR2G9HP{pi^H=a!t9gs08faYSKnUjx0jo5EAf3<9Shmeu{e zi-NIc0bH|pU9EJfxTx&3dzj1_Z!sv9 zo`-0P`6PH?^UPHZmY&{3(~t~C6w~6xk6y+L5>1C+I>#HAxR2nSD$*^C}!s>hweUL0a1Naph{3mJzP0BXL%pfJx2u9SSMtCHVxf#lC2}!1h z(vi7oqlU2IuJXOLlB%-2R{SN?qV}Gh>lTW88`g1q%gOXv7Bfgp z!sBT|ue0ysk6N1FBc=@eQQ6o%%h=1N51?F~T$gb-{s(cnpjq4l*eH5;l|;rHX6e^z zr3SCPxy|PW8T5|-O@YX)wv%=kNd6}LuzrGAs{~ff` zlCh8Va9i0IZv@zXVC>-(gO_sNXL4sba=M&X*0Uk6a?62488A@JU@!{Y>Q2U^I#(MU z?1{LVF+_&f?I|6l-5v{H%4x1EqPoWS1G}|gr-%FT*Fy>_#{p3g*P19tvhW#u_HA>f zQ$HWo!ns@Z*o15ZCl`9@D<3MOs?*C? ziDt$A>qwp}_k+Cv8?@jx5pRe83SS8VoFCR1xT4DC#Q8qpA)Wl!X7eG(Te-8O2^gw( z3F5JjiN{V|Dz%p=9c5e(5;H6IT<)|3i&3&RH%PF@oud*l``%3}!?t4*Ff{ofTO4HC zSZcY}es6bcb?zIhgy(cr^7FkCP|4`L$G|Y!33<8hq@X?D^}u>wRH?CLMGs4k@c<|W z;M;GiIDru&Se-UzhRQsyKkE;ZsC;Br?3AzaG2 zT?kIz_wUKndq$s(Q^hptD6B@aPN_n>U>;iigqdLMh(>*y2ep^1^Ppt&vnWvx1qX~h zE8(&~H`hS9uZI=Y{V&Zpaj!$z$E2vol*RG-+gYD10yk|*y>PMW{AK~LBw5?T5|tZ& zai6jTGfw@Jfx)#1s^`dPVTu>?#>qwY?;MRz*bgFp z0-PVGmXWKqI9aHfIgw02l>nNyztnB~lW~bxIOphra%en$&9)@cqTf zPCb)b^?3tQ}Hz$+l@fzC+?$h+^+SP@8hfZsf2{m+` zn8yqD-RWhd&v)Jpd37x2xoOvyO(s#1H_}u5As*n_`-I1b7~Ic7U}}@&oQS${+)ST< zjM2>B7=m^E5=m@+0M}gceC3Rgo~EZfH&%S;rJ~MF@|RwOe7vmJOeu<~kEMt|U_ph% znCGS2kt;q9M)?;M4%!TqGil8%Z+p{ZW8v>l=hhV$IFy5u&i4vx*>^lrW=&69)Hv65 zem@-islaNAY4VtC3-{+OjMaQah&Q=R#+gNiy&}EB_|C{#Pi6(1Qb8V%8J&?l!JsUj z{qHd6CnuS_2{`UzP4Tkt+Al`xK*SfX(Y^q&w0pz~PpU{Z|9Uv}Luo+7k- zB6y2FimVuhFB@qVR$0JDFm^ZMiZ1dn1Uvml1=aC?ULoDb@&7j^*8kc-cCJOmmM-wv zsTXw1Da~<%s_Y6jPmZz`l$XoHkN{e)b!keNf<4Ry1xjxKtL_1RL@tU{So^0Jxa{}R z&JN%Q9^FuhSlL!BOj5(<$M=`gUNeTEDrs@O&Iwc>K%L+(P>kGm+SyoyqC~<~>(K4H z-D^}*d)@1^){qYd65}xnx+sF^ia&H z5Xq+KJR_o46R533)ImQ}emM5fLMZ0V`P*=;MFk7NsJSoSn(XgWlef3KJy>MlJ@h3{ z$CyMtdHzsI4eEcR01vgp@V{qX|34%E|IbHo>!lcgGXO@|gmH?!s^fUgBWd%34eVcC1TRmx zmOLLc0ufP0+vtYxFHbpxtPA*^ibr=3g@bZ?a`@S6bx<7%L>+C}|9n&(PJR z4$ME^$h5+5^<%N~;H^6XQs-|+6j@aGl@T8>eFv}MI#X{G+5_Op^*r<4S$&mgf%PtST9Qm`^VG6Ir^iBK=z0{p$mGgto_^MN|=pMXb*@9}qU>EZOH=Ca!tsz7aFb|q zV34&7?8D1n7IE8lNwj&E%V3YhW|H+_tq!eJXu!jX{_J$=BUK6-Zc2~$+;$f&2x%29 zNx+~YU!QpU>_Bj$>#*Mb-epj6_ZwS@li|o-AqoZi(D)h(EjR__Xy4bZw>NCL>vQg$3 zp%~s@qY@?r5g7;9djnws6ZYYAf(ljBp@qi|bTa}MgUl+b(_4bBY1p=prvOdJzT8IN zJ*b0%N0Cktms_OuLr@mooh|o?{gyo7VoL&(!p?Q<_(=_7=!RUpP?rT;T97YjX^G zzuGJZ#v=g%9k3MU%flAdg>iYW^!w3=vA_T7HSdem<`$pbV95aPg?|69b#{HK)Z$Mb z4h#z8$#c8wMZoBQ-C_OJuiEU+1D!X-pO!1rRv91e!8B}@e)Vv&s+Ik%(qLgbTZxNb z0b9k2IqZYzueY8Jn^!gNZ3JniM#JBEWHjS$AJAGtpNTf}gv7yq3PL+lzwF7uevZl) z+N4z!JU~P@wGwUqJebyvF}8B#9uh|F`w=Y^WA>}zH9|kD(=L%0Svq#C9x|8GG4q=T zZOhO`2E7M%3)xF9jjUBHW3wr*x}bNyJvC(Ps#jKV)7V^zPob zgCY)ghtW@_c^<|N&AHDV?5FYxR(@u$IbX{XKD(mV`ehK62EN>TewxJYpApv>k%uL# zZLRexwSXiBzY0EA=`fp%u-m?!ft(4VR zypj2@r=LIlH_LzgYqe#5e3ZfV6A~2NYwAhaDvs{IqD0hT#hsrX+jF^_dfB5#Emk9P zPN)6;uPM0FbD4_gb9Rv%E#2IMI(~uOY~wWi4PvRCZ)L@S>DF#3m^Ztbt7y^Q*I zvu9a6uw!M;gvu#rvlZI5-YeoyL&N{{ktv?B5|&7V3~d}h3xg57a$4z};)wz8UW>~9mKZiEnjascRZ zwfNta~;N{?z zjhb>2>yw|{^@b&bTb`&Ih~XAG#S*~}1rp1uN`Lui{QdRW{&)4N`}_51lFL7rD#2IK zzBcPI{f1<2qbi|5Vmt5k%aAV8K5TJqkJH7xYUUD>oLFgFFL`b?LgXU&D)^c}g`Gay zxWtM#kK;b@Ts9#iMmF5w{wlL`nAO-uFXatQ^=2#2bsC2ZPV= zBG(>&Lz38ZZnO=Ty1eMka?90B^=#VVru2O^ss3UC@$c(PzrBUlCS_%>!a0Miw7r09 zEJ4o)JpL&ewU*!uvbiQ{cj1H9809=O@0U7KA4)HL z6K6VhE~e;c697X6;QZjJ(Oz0hIzd|oK=k+hBy0nkJ41BKf4H@k8<~8azegCu4^u$u z*$0$;<|HZr7OE%RwRDbRQ`)@`2%?Ac(3S%-C6Oi0$$?{CGw!>| zN1AL!=3vWjeU~Rr56{UeT|t4W16abhAl&YJ6DYGy-8#}}AGN0J3+$PuO~S{=wS15% zY&ic3dW<2QA8CXC z&K8g8%ZfqtVyvV8Hq~%UDR(4^=NRP}M~f^p3MSuFg_;dEtoSmUycS1!E@4Y?)17`t zRF(lO7ocMuAq8sW^Y?%=Q&{+Vc<8`FHH4hB_Bz!NbF;BpsT@u40j!>}3H6kYd?(&} zZl(*6DWU;}`>UGb!`|xKI!s=9!=qSf%m#ngojb(8pFJ?BlbazTa?10ZWHB(HZOZnohHwR~vLEnRdHgM`B%oE0j5psR0 zFiT448w>j?>MAe{C*XuT&p@3ii=<2V5w56n!rwLPfC=)+dFKL@d|Bi4qu%V8a6ScD z4al4s{IX(pLst8z78PS#wuMF_LzMn4&c+zt>JEKf3w!3pJhvW5FC>JpyO8_jB zx4%7Obq3{wXV{CHv8DUSJ-B9~qN47h1mbjBX^4s1o$c0gXhIBGn{8PB!jh4ZAEDTJ zx8m@#KJh%aHZ?R;a_d#Hq)ZXm>%&BGX%djCg!~h z^+xCsJhy5^mN{(|xHTjIU#11rQz6%(Cx3n#X|>Qja{(qlb^{mshgQRT$tw;)>2B8Srwe4tzgNGEbSi94?G=3A&x~S+d`S@^l0&3?4Ai{yc|DeO6dx+xKBskAZF!u21X z3hE-|%@D6@d@Q)*PjaLS2{CEysYQK2r{9f#04gM3u3Fdig~NuY{QhVFYWZB?6_MqN zL7>=2hEhs_xc`Kpzr7VL0}+Si#p-ceoXB4U;0aoAe}x6E116earEr@7mElSOLtX4n z(SSjx_U9|E*xl~Ef&i~*$!)b{5P(E-e#I=PEE@=_M`qyG0IMa)m|v$W7iR*SfGFZn zc7CL4=6)hPKD20HlRe}Pl-y-R zn^l31#y5bt?x@g7kQRHNeII`X@nLSTgun&fje41MZz)eJVAUBGU>?+6~%}ACz!)s{VNZRdns=d#QgvnPc*W2})oMtd2)AnmJC)zkbTs(atYa550`b^*z zRVJoBo_YleG7JI<2;UJ72$myDL8iJk)oM~^WfKZE22WjmdhC>W$q=A#hq&K2~pdki^j={=1dQ z{a1Ut{McbU zrE*B#0k4o7sASX#4wQYmdm$vLY`ner)Xr(G%LsV`y9>0$b0mV5O;XX?AzjxYaCkr= zJx(i0zF&b)1JeSv9i;^#Li!c;*ukxp7okxvyM|2zp{)Z^Y_QNS(*I`9VRrdZ_WU{V%oe%0dgFr`N&bka#AfJSx_5})et%j*< zYujc+uHn|%gU)C?7*HN~ZN{Ap;+s=VeJN-#$WGTA)o%2-MB;LxV7_h5zmSmKrXD&|&|Ce&w1*e8m!#->jZ91FQ(X zNQut@5U9o0^$|k0#Sdy(1}pqgkPHPVNlp!arGhYWUcF7ye$Ed=q}1~V4T0Mlyx~_- zsuE1ie&z=*@;!(oqsSi@{|mf6F9(o~FYpg}30^?)cdHm+fdkGse*C}i0LR`I>JGR} zNZB;}zJ4QfYn4h^0lE_mxc)P=xo;$O|4oQ^gXjtjUjpssx{cTAHRW1X1s-XH)y zgO0`k3jut{Nwz-+for$*s%mR)4m;qcCwv#@=LguT=*b|YK&0I|d+Buz@LYwOFF+sC zk2(Z^5GS`aNdd}sISa$7)96aOWW-)V<63(-f7uF&ySIdE&oMK#KyJD|#H&_ENvWo8lc_Fa=Zsp%@w|^>$=L-F}FsECz`Z;Z^zF zVD{_na@~CRMSne(G69f(CU@7BK=36+ zw4(@~CBO1%4cysW#y}T2WGR5kznKgTO_{RP8*|p0yAXUvxEAUVW#4`A`*+)E8$Vh_tx?s zi-X-8tP?D|?rv5_KEOsIVL(wY14y1ZU?!`RAn+9W{LRkt8AtV!2ew@Z>NB_YU4xLN zb+XyL3+k1GAc@B|9C`o+`dKW2So6s+z{K3`86gV_&kWHSc9uc)fm;iOV2J7SAFNRn z<|gGA2QoPKZ-5f$r&Pr|ZL^>AoVKvT;e?gwAP@bULR|IRT%zRR050F3sk}2ipoGoW z)7vU)D6jF(+BW~Xca3sx(UB&6^D3}jz%qjx!Q98^d>;^#f)8eO_9yEd|q$*#c zEmd)d7V3D;fLu4yL(}1VU2jUjkSL1l`fA|j;MRURRhy3hB&sUKUJN8_`n#56TT5`5jl{&6%Ldf=KFL@ zmsKyb8QH7RV*MI?U_Q{tG@9|P=HU28Adys5j|F!&&48B;d#&oNC&5VmqD9K2qKy3j zO_wJaqMdU5%$2VLMPpVpFckG5BI>vxkC$xOBQ z_=FPQ<%gs&WxVI~15uMa&l>Q!vg~WWE!%|U2?DU0b=X?5OR@9GwBR04R8;|rLF|1~ggTcUxXeX^vds(2bybQ*Ryu9a5tL1Ocpkg)F#2zC z$BvW`|Cl2ok`eEbL*RIS{w7XJkajKrnwoz0z=gy9plr_iWCBXr71oEw)1juCnzk@< zL#+hGJ*PNLlry=-;+)$Po}(I1@<=xvSRS9=iQrQhsNlG=J~v3hiNk;x0FsKO1Jy}9 zr0d%!7;VSCRzIO#)m2ni+01(xjdP^g9EH4EcZ!R}|awX%q94`(fu? zMY4kI;9e!tAX=ofW;KgV=e54_^Z^H_d<*X~Vd>lgG1>jQO65I)8*?rcv@gBQk}s|0769NQb1mKeQG5qHqX^E_rQ90T?sHKi zp6s(Iv-U1&1Wd9Y64`)YYA;47Jwzc2P>Uq9L6^N$lW4}SgOY@DTG4VCSzLY3oqi|| z*}ZWAwJa_`{?(&~>e7>+Qf7+YHTA~WhgI$DZ>hW{gJ~h22Nb&Q^bYBi#~dXnH(VcI zFsGz6|q6i$So`hF-7wqM(3a;z@LL;vlBVLJtxFucW%`;+ zpbD89O>-p=!lkqM(}G|98q5$t-IcrTj`SD$536`xvk)EmM$wES%)h$(0aE=h+jbJ* zw=l~kF&>|47+62w14~jTkVXdYEBVhZv=YP>2o>S@wI5)p;s+Dya-e2da+KAqo^9nR zqrMGkI;amR!-ds{7ZwGP8>R2-@d9PqdvcKC0rI`-3G|)iu;S6gRXq(Bw=}^dHV--#x|U2Ec2wnyx8JTDnD4@9+mGgH9+f;OO$JLY z7v8oToN47JjLr0B`5hr98@_{OPg@&~jhwTK zYy)U#vRJN{Z>Mt|7oqWsM~h^X7qt` zX)MU$-rVYAdMpj*2dktpn|Bu5Hw!Zc9)#y<`f(%@>~$T!3S;}t^)B4RCB0n|L1BA9OqyQC5hm2XCJsqJzodx zNucmJdbSMkocjP>vVaq4U!LykXn;n+X|gR5=>woW5y(+sLur~^W@YYa5D~9Du|b|? zTI=~y0>-OAUqlcx4XUs5MTG->%>*P71aKpj#{&Gd1PX;xX602jOeh((S^)!ZIDXB- z%&IC;3i7N)ld!qlT&Qq;W$z!{w$WKYSwujRP(yCdA#vx{ufmif?%xViDLa^UMuqnfl3r(2NR0myYA1soLgLgU2DjQfBn3y3oY zf#rZg5zg_P<9N`}bAhumPdII(k9lPw!CxrwKN5`sQ5+6#ko(93Y^@yXW8KOuO;221 zo2;s|=SOd;T_?`!C=u$!w{L9&V?HQs3*1J7(=HvWaCm~|S>c%V~c5C{t>aEx>mGj7gj zv;p$W&wjnx#8hidY7+lBQDs_3x!%gLsKNcy6?}Zs$AtXG^v@jKH4(kpUR&(a``2KVZFsNjI=39HD^yOzvnuee7 z-JG8^?ZvZw(vbveGw@;*wn3|OX=I&$^pbglmZft5OzDb+jpYP$o#n2-+VwScBORw` z{xiw*jMhvI#%T^KcP91$g|haKOXgp#Eb}b%``iOY$G?-v{N1?~jxxrs0WJ2Hk#!Fb zBK6OwVsc6-*f1RLo$4P%-EHj@Ty#4nZd0i0uNa9p;5t&zyxjfr++d!WRmqHlAf+yi zY2T0}LS?mikod;0?3;$6p9Ak2BGa-xC~LL!2HOnLTP6RoHB&A3(SkQgcILmI z;quHOE=P=K>-Qq;X3ZkJNDklkLw&HuZPKajulMG2U@l>bcV>&;QPnWDVoOiPCy15y zHB+YqwrA&VZOXGO29Rp%$6UjNv){FHAMyL+*Z^LkiblbnkH_5`iu zT8G`zy7pZ`_=GAmo*;mTR&x{8M`*f zvswMcMU1#T>Hml4>2O1=F)jsH>ZQWvz*G;;?OCu4f?gljB3-&P5xJ-I4%(~h+}B4a z!{@-A8rD!R=Y00pVIB|W-s?Foj(shK_lk68D6e(3mIS!w60OM}MEO7y?b6@?ixY+9 z_BUL}fIeK@%~Z1&(L*2F&|A6lU`854eZ~6t#{@CIRu~L^t=l?bs4(2CVzJ5uZ2#v3 zmrXk!K=-zm{er+ZL_}c$Q;ZLAoH@Nd`)BwMxr+WqCb2rb`vE|o0@^@sxUatb7CU~J zUyx?|v0gfha<6*vY6eAhF88kxfj zyjJLcZ@E&Db)V$-_d?*Kj`y6xxieU?M^eK<0((;LEXZ&vmc!O0hoS6vUjMtRQw9R4 z%(OnG!Fys2FAXt9uo-Pc2L`VZ$bI@ic=N2s89zGkgDnr|LkY!n3ci%e3M%(%We-K@ zexS=P7uA8O&^G^Dqt-Ls$A3S+pkU4(q|@8R{3Fq_PGOS2t6jx#Rw02J5@fSuqz&iRbv?{sd6 zZyjmS@=J14xevYHE*FubVT4M|cab3?a^9TXcd7+FTp&AE$+uv6b^2UT8C`kBJ^%zR z|BZnkQx(Mg`kTp&r>8~_$raHx3wJI1RhZH@Yo4D7pbSfCCkx+S9X~;d6!jr(?AV`p zI=+;F>gLr)ru zap)n3Pw4n{emct&J*J}k>YN1axCiGK}$Y|M3B z6mdoTxa(?Z+R|t0OElMv2OL%c6%Z6vh&MbNPS6HzpRdiVs#W_3ZjJIOovWCv8Y&e) zER@v+CDAPcN_NcCgZof9#wo97_hG2yz{j1G6!nEoTaJ`Edjwl|elm6U1p`cJm$J9p z3A0Tv)OK{gaiuND#XPdU%@BU1w9zPQ27lEgD=^n|)%rx0iJWv$dFb-UllGmQ`#V=@ z>y}`JH8!>vfGg92D5x*SYNKN9GC=oJJ%+*eSM;8 zX+&ud?NfSxCvJ0m4ZkwBxJi#w%3Z{tfW6~2tHAdvO4E(T`*uiIX%)tI2P*h;#%k;l zuygCn)?tAbX&Nz82~pCf=SD*hJurgh3KZP`;Lpz3ekJAdZx)fqI(e&jn*LEck*A2@Y+|C`3=IK&{^KK9zuo> z7=s|Nvo33#_HZHF&3tcT{MF}GTHR@Fp73TJ9zl3iDrAohC;QKhUUEW&ceyE{#-p|Q zMu`pVq1XC9K4H#%MdSQHFL=VdJhDESv6_^u7)=knA9P)-+K#FFX9hck-hN0)>n^8R`peCv$Mi6Z>h_>QvEtkKj*t~3dc9Ij>e0KoJMV;__`_G7Z{W#SKe0sbkqlqKssvGn(Zr+(P+QqHP13g3rKP;9M85^lQ%c z%d(bsiCmb9`F888=zD?VUqsZtcA=<^f_tZbdo5KR4z7B` zt;-x$RE-T=p+D!I7lB3F!!G-FU;XCiFp+KJms`|s&aA`4xV1>)+$` zB(c%1$jqX7E8pIgW6cg>x5{vcHf(!#XIL`Fcj|WG?jElU?%p}hevpMPh*FE$AckA@ z9`|)sH~ggXXbH)gYHcw(l)q>CrM*yY&=yC2GviTr+$MtS8JNzvUc5J{1q?jN`;K4! zQed3v1x2qQ?@#94qX!1x=>gdbVR?x!vAz5(0jx`4Lfyg2N&#;!-Muy9$Z{H(Es1xh(duGo=u|C`ScrL z2G;WlnGLIMZyu9aTkK(1vH}Q^JGdTz$ECK7uxD01NCb|6pZHtndWAs{3Bc`eUN0Z` zmtB!KyE011l4@?~X>GQc4qHrn9Qyj7FW_%jm}A79uH?KMhk#4HR0#3!(>{>g$a;<= zFlLK^Lj!pU%=T>YZb^2)j|kiAkm^c-j_U%HmMS3h*K8P|p8nD`=G!ik(0!!2 z;Fy0)kN6InGw=OdM#N^5<*drb$WKA|c1L1?#c#~FQ+DymgKCfrNjvLst#)**PKE9a z)X`sx|0v!aE(9XkLcn@a1#)fORO1vmJ4iS4s#gr6-x*B1Dxs^@-Dj!D0znRf+-A5M z4VE!DHxtYPL)u#Br!fQYtpXNpq`FK74#@{VcY{13V+!H*o3!gww^u4ll61z=`wi2T z`au@hQ`vvM9FjGa0v6}h%n?x78Dyagn^abiMr(S2oAu2Ii!s8C2Tg?bh^KGm5?1=m zjroVPHyL8mI^iLQl4Hup55qHW&)Hk+>#(1!Y0mXmIvdZ8)m7IuwoJvVFOt51UuE<% zF_8z%>EqZVqtnCM7?qY{<2RgB@hX!Ad#3FNdMx~JujtI>AT^yGr z3$|F1;=!_Tu{4C=nQ|a-HF@e)Y^Q!SvKJs#%!?I?wk&w##zA&5#9?dqoS{cpbTvm` zAk#tmQr>s`NjkWr2 zs<|Rjjz$udts`mF#6BCtZY~(U=E-r0mBFgHUM@k=Uc|9Xt$$KAg0hh>z6MWKtG){* z-hgE)@HG+#HvK#cdoBE%LU&cmkS^GFUyEvG`ieOmjVX1eNvk`hszseaw2OunH1Lh&bgi{hRU&AQCpaUL zkUb)Cy*YSeu0$p7pT9scD{4$40x5ZTAnGgyCdUda&CE2G9A8~-P*iDEv&rueB_K{s z1B=XON27k@@Ze>IlHV#;~^!Q7b zfUb&s^f}!DrZ$r=aCWT3(60&!a=rdz$iZ6NaWJ02a*M$VjnZ8tD`_R@F0}vBxau)S zY?6M^Nw&eeg5IGu0Ar}bbt?k+7#0B6BBm@_d&sZM$NjXeWDjL@9oGk{E~E}&_eLbD zt2M$lLdVR)Hzc6r3-W)Cd zbwlpYBvI4wt%V{w8f0Ip?oDZ@toJdp8F}Dvs<{e@mZ{w3Elug>>E|g;5v=3TCu8BM zyteF6HL)U8l6B5@bq01~E&==_nu#fQP@+JcXRFCbr)7rHql5(1IV3St@Yhv8XhQSwK)u)!$@@Dq_{9hcOY-T#lgYsl`iFO z;pvZbWK;DgW~liU-i`a=YKR7lh1g$axBj3d=eLrdF3H-@^c@5vy|?$DBL*Ee(pD$7Z}`&|9wxu)!|L4%%^*gP9lIr9hbJ0svVT$ zr8|56aL@khb2CyXz%HZuKLa7pheCxMkiRvbu$zFFSWS2Z7qU#NYdo@q(X$bReD$sG z3H}RsU;~ood#7w<%AR@hXvU7`Xi-ddihX!(d6!d;78Sv>ld-*K7LExGBxxq?5muPt zB>egV^rBhC?v7seLK&a-vA zdfr;xzC_2lCobus;nIy-E2bOnNs3_wa%@CBO>^R$|8>wH>)mh`K(?AF8(4%2qiJ%K zA-z&6p+J6U{}+2l4DH%*mK#rzr4|u4vD$mL0x&~r4)I__4&Mx><;%(A98JRAB&N~> zC!?_Wn$G4)@Szv#gmJ?)P3JF2)xl;y_2Xd&GYk4J>XR}-=(8X1@&tFvLbZ;~n9Dsk zq^S`Vjv^lZv)Chulu|w}R%9GCYhOTK8vyRKLgi=s_=^0#6u7hf4DH)Rzdehz{Lo#|8<9(oi2|G8MB*9Df8_S$crEBw0Ub)l@+RDciqf)gsGU$368kdI? z;-zJjeiJ9%=e`R36S9?Ch356a2_C2fbViF_m3rszE&cIdw_}Z>-5FZ9=gjXh8?~ln zcJ>Q%qldd@Hev^3WJ(U@Y`?%t3CBGKXu4(DWdHwf7I2Z z&op^%P7GZ@Dh>>p8!KW=;Ib6FmYswJ4e7YY6ZWyuS!qE5dD=wCu(hEZoikr4W*6dUk)8 z4$tY~bDMGt4b-6kheK40OW)&3&*U#)R&if&YA9GW?*2NbFtk5z6<8vkjT}p-HDN=S z!%?M`vstYYzYg>1o(>6W6oD&xzYX$B0d}sz;!}+3t%Sg}8&q<&k~_O7B%GbvR8|)r z;OX4gZ?V=IKUn9z&rm@vkHK%0iDo;UM+zBMsmgkxL_PC54q7J=+1Xb>}=jM4%`Dz z-+P;^9^_Ad$eM+iVLxCa(-iDxXMkaI8+ZjnHzoB;lJ+7TAlm@*^ntZ?3JLcM521p zq42PzNC^6?Uu=uFxA#OP$ww8W1VSfun`X9INZE7IQwQRu(f)Z#GbY>vM@@xq7VU5^ z%ofhN6kUWHerfdj?8LL3yF4#zZZkK!quVqw#X0^*Y*5A;S#+JPg7iGPj?kyC?zlv_ z8*Mo#cW1cpgJ*Q(vD6;n)kK}GonLT~3n6(`L*(8-7Z~4XOq{?5r3kQ#~wFWhk zlIZP1_K|)+tmcXnb}8MTU(uM-$}E11R>6FFhJCjdA7K*K^Ux!3tQ7T8i;yRST2*Ea z81{n;n5u7;38RDtsN3D2Hzqt;E2v={w&jp)l;~|KdpMh?(gV#@P4>i*qDfKHD~3E4 zHk_YY86S&{m8|xNmVN)bxNM>d;&Y1CXw{at=H^lje6Ce7Pxk5Xq90=HTsZ2Zwt^c z!l}n7hFO0%{=2YA+KwGCUNdH{X{||-+4AI7r|dH;I!N8Y3U^z~Asu#}dydipY}uxY zxrj_z7yzv%1@_J%VSQ2 zedv}iuwkVFW$Wy*1j0YL@tnib*MgFBqYg<7gZxb?z={t5cu^e`)Q5mYX<#@ue!*m zx@yvd?45?1EE)TM5-YXKAeCGNB0n_~kW&X>vCWDWEN&!iT(X(l0v(I^XaPw04D_qh z03Zv3LGP1MPqH6}=v&#VMFvQj(e-(dFax$mxK*neCWU5#*vj?20KCR9c)Em(kT?K3mA{iR2X6Ar$mFkAAqs~#m;~Zg9C=nI?f0HjwmG6 zb|=Ntio9uEnSsnA*sPvax5DRtO*rmC*&{$*$y=+rG8P1$XXc}72Gl#CYQ)a_fu^uL zL;P6ge%hx@A9b;Y{o=<&feaU`3T9E*#To7HB6zTP(S4fP8&(HHfa;tXHURS4!udVk zfL?$-f1+~cs)2G7aF&liewhvB);9o_28H+__5h?vrfDaQ_I`N!=)FhYc~!SQNf1E` zSNNeDRX~nwZNxd2S`-f)5F#5C3QzQ5%u7K@N`8HccAxvQwED2==E9S4iwuPZAU>{7 z#>f+vhwea8qpKZ5l+ouFL zJfk56H*jTo`B+Kafpwi;mylJ~O1Dnt;onV{=?cBz?s~YI&%Db6*;bnJdp8B#{11_)AVA43MG>PzU=o-pcU}?8gKp(E|cO->v^g-dyVUYxvVu$+&k;{8*V2d6nU1aVam} zKTBy>0!U%jZG2T39HK#8gG0J&|0-MTc|pH64p4#Q(minxd$rG~^d6H*a>c#tJKF5g zTWYIVojqv1u7&gbDY47Xa;W;}%*PKBnW2+U^R;7-kxkaWJj8fYV{}G70U(2x)O{W| z2w~OSL01sUGxJWCwf(U}gS>u&N9Yxab61Hwz@gK!p7F91so!=`skIh#ra9-Xix=Cr zY#xO3Nc!xU`v^fzu#&_Ji8QqQi zGk43?`Fp^Z9N||Sk%f5_gqy-8-*7gK?gc4LMdFSaP=Q_qii*h#AvIe=J61%h2kL5#97Vl2T{IFt zjq&V-jAKT57!{}H585S@bcsCQoCOy!a2f5mf$X45?CnoKKayuwjayij@Jr%jKk<_0 zr0qNW#bpe%ANRDj+t&#B18>1~k?(g+s>Igp73cHeBEIFgezT#r;(C`xEZvv6P~E2b zFl&nV^)HnKv0;Hi8#qoj&htHaU3V*$rrPpq!8>{+67z{Bmd-YoPrA5m{Lkr{vmAvU zbrC8J)y?m+!1?Y@ER+qEIVLUI(O}F&D&t~bc7e-$Tx{UMK;P;5aOcv z7F^5z_SL)I!W44tJxy4qU@Uj0ztd#6D;lWl6hkw?`1DbtZ+w`Vu9!;@gy)SyR`9i!t@1LDT7%fQkR4>TWzI#ei>@W4;aC z?^B6;3SQOnL9W~=sDf2$z~C(xbKcf-p_{>k_IW?Jli2 z+a%x8UrWlmxr54{&g9>h6n}?O_^3$kG-3B+&bj`Bp}?Ln3_*?!O|L;#V&D+b!JMLH z*{fG{Jw?B8nR@ssS0L)=-q)Azz8iD&D=&yGyp+=*lV%ir=4Q>81<6$=Wb`G5#_;jF zOrb+-=PNpM&edL5ru<}_MuzoSTOo~m{M$1fEZOLoTXJSc$^I~B%Cu82X1c=$YM$-C|lnbB9^WLy3zegHdxhcoE6C-bb~zndN5RK8tkRa4M})f*(!P&tkpLl9|s{k3CbJ(jYIgtvmdXaRE)x9ElVS zpLuj_+l4p7Vp+3DfwyEE-~7(+ho*D7-=&Y4PBHmG?h<+FN$5#*l2xBEB~z8GaDq~L zUBhZVR?wuXulT*F$5!azQUT=?50Owcnz_4A;SGYvm9R4>JcNil&?f^odMzo+vR=Q_ z7o*7|9WIe314D#v58P19gwL|kj|af*tM>8UMo*J60nc3Dh}q-;JNfjydGLsQNyx3- zDhkM`dRbc`yLT=*xMVYVUy=k>vkLFllB;6!VA|DwW{wA0{7pNG{Z%vNHSPU41$6v` zqBZz%F30=zMO@qXlBbUjWt>ivX z)7TAK5mC$$iodeC-4YX`FU3CIKfac$2IdWm7r3uDr(1kExeX|2UoGHv)GnWyV|~&V zMKv@{8=ZxEq_)utY@-KYeF*Qba^_r>xM2)0?t#IZ_hV)Df>cwg>h@}H)t!!m#bCM( zF(Mb4Yh(RI7L_1&-u0Oosm^l9Z||mCBB<@vUuK>>BecwIxRP@slx>SB*LaRF?2y{l zjoGbpS=V@6P9*)d>?Aoxl0o5K_Bx8f;C`22)HQ%*!&z6}9ReJpx&2KC4NnChzJ5J% zf=&`$*qaeJxw~33l(W5ICx6&eKT$O20tq~GDneA6WXkF%yFO8Tn)i7P;XD~rqMVu5 zxx3O7=J-aOB%EfFG2()Ux!M-!>%w%@IIR2CVZCuH06i5@YFmT?I~yX3?SrLCReIJf z?C=mk4{VMoQWmlkkp?#vwV4P(gb!1Ys*|Y}HhM|MI$gh--Y(j|Grc~1m8=tw7VRs| zx#aQn8|h&VitvSc3 ze!bR*7jCgqttj+RT=(GA(JpS^{NqUiTM5Uv5{?8xU;p#PO;@@^u_&L#fZu7Ohd!G< zse0+wy+;j*e#vt1vgY4Gr4Be*G3TW(l1zQS8-vf=-wpr!3osD10U9Lu_>WCPFRI)V zk)1(fUJ$DR#2j+kSWqSuXeVhw*=D)N#s8~T@_*H4{JKV9fRvSUX9!{|>`rMQGCy&aK;#Q-oKUMYN>{2~rdfib9N7p^h6{jTh=cYe z0V7}hCL*a3jNUsTIwn|o;WnXgj8jM1?%Jk+1r?4Ei2;a)H z2nURso?zmm&nUO_SNf<64ph=%2euO2h!}KO5W0Rvhq=MB`pYX_54Qxa2!bjg-9|8( z-RhkBn^l_prv5My*xgCbcrdA)oV~4-sKfranAvpxV2HKdLJAWIRC-Lc z#aBZkYOn3vL>9dhBpkwo0Pq8XDP#oCN+}|?vi9Y%;ZyhvWbG4aAZ`O0FR24|5=d~# zZOtS!LnNd+P~Us5&X6I7NC<1WZ7k5!Bxzt1YK45?c;YJGLYt+)_m15c3mXTq!IVhA zKa(m^4~Ey01F7%)FAd!V9Yht_Oe2XDTW|?eldM@r>S~ZdLuWUR4tKT6bdo7u0wD|# zcqs}gdQ6H3z_D&>8eLv6&#YT(>wvdV#sWCr6AgMu5UjGWw#&SR=}S9{szBO{bVGE* z>{H^y8vy;ex8gd)~bs!DebQ8h(aoE+?P3iP*iO)4LV@CpNcW zP+tMjnN3?G7CqzF(5R3m_$`hO5!>YSAx`FlDTq2pgm`Koz&i0%=#t0GrQgMg+o4W{ zEY~ptUTCo=Kjs&6E7E^))cSP*h{<^IoCHbs=rr%4JkYy(No1dY^=$Sz{W{={TD^`` zGA;0(>PMTNIz|#v+EVcNS`H3;`ZxDs9Hx_p2otm@1Cz(g5TZ-L;vwC|vrH01cPszZ zI(&MW7_T&Ok|e_oiY@>{_DIoFP0$eu$~znHd*j}k!H7%$1>+Il^iUEv_%q!6n$p&D zFTJYTp>~(}$c7-C??QTK`mX1{zR~_Waqvx0ewm?RzdpH zJLSkbo!?fp{k}k=U0*(4#VtZMj;_@Um@K`>3Cymdym05g+^&oRnKn^6E4063SNg7+ z?e&ou4;4s}XqEZOXPk9s4>g{T4!d;wv7jl}ys_Mj-I^wKFSf0%mYW#k=CYI^8c}xW9P1R%2<746k6w3?>c0PM` z{B`jt`nc2mj3;K+#-8r5aMrqX%Hb4srQL#6!!C6ho}~zkuBCTHn7xRZ8k%2WukUSe z#?NVO0y4`Up)0I&cQ2)a8Nl4Wl$j@2D;SBfBi|?2jf>=!E*Tvj33S*t_sB*(-TBAf zXKJOPpnn@*3EuK2?`vEdz26OhJRzU)w-^H09+N){Md3W0*@B$d$I?%_B*o3&EN$?g z8MjV_i8Bz~cpHE2@;9gRVjp!qOIqd93_3*;NGOvC^l6nEr4;qmke{ea!QC|F#WPUqU5xLl^mBz**^N&fGHc{2$jb zUB#>!MuCU=WtrW=p%^ucatdNNnR9%WuUYSDH0FUz*DE;|RDQ~-JjojvIx(OTT7PfZ<(TJ@ z)t;xY6~pz$<%Y(*$OMW&-|ko!IQ#M0l5dV)>7n1i#fo$t`_^P$p1Y_wq_s8GeZ+m|kuoNZ^knwQ>{G(f zOkSkXBS}hVP)CcU$nw@V+S7x}^q-)R=_FJn@b>4QMZq|JRS2Zn+KmxWqTi{qo1ZeR zhSl7K$`-?hzWSQl%s$Mom@>W_gVOo%?nzZQ@9%5ath4hSFBi-(ibD)yC;d*HdmYb zUO*3`_2e(|%NJmD!BsoB&E`}lw6Te!2!>V2cE0f-T5zp3@@64F-_f;GySMgLO2>Fdobh&Z-QbxG55lS02->^iJ$|W%1A$0&_}S7*hn4B>fT`>Jc4O0( zQS`P<-7iadi{&}>bY)Y#KqRtx>1?96n(-PUHDq7n#m2Bd)1T3U@+)#xVBs_06AJ5N z1+O~G^vfot0zs1BOL^7I4n{N^+FdPJWIGhNFW_FHM7VO^`6=(Wg`S7^4_;UpWOXPJ zKQ>OEx9`T;t@AMT+(QyQnMGO$`_sz3s7(!{y&bmr9ZW*bH|>-~DepvhxP1~h(A&g< zLqvGrJ6nRJF>4u1zrK|#V4khUpU*t7B@jq`yiQTNw13VrhoK0mALr4BCW2dHlXbaJbd0d7v~9;-*x3G$KhavsmM1*8l{Ze&E<*Ou2`Iy z=`D;`-g#76eY>ndVtm8BId}07w!rKJtJz^Y{-z)K`n_pU<}=~X#w)6{yoAw;7F+Mw zUSy7q9KS9~$e%-W8zLWV1s%`fD;EmZ;;Q$~jth@75WSdhb0LSV?C*cRh;5oVw+GN~ zaUqEhL>!QyG^kq|*sv_N{5)ocSYc1_p{(*o6X92S2(wJ&tE*!z_|ag4M>dkU=S4N7 zG_X0~LunlWE5nhi{eEymX!aghKB9W^>Q>1zHM^cZjq5e4Y-Ca8y~cn5dPTc-uV$wjphm2#m~_xZTl2Qzs;5#S*bE+a=q&53n8EjI)GFbCfye* zeZ0H>Ub+~0T{HfmDG^?K8MJeII-5l~n>uhKzuwbhFfbJ%gb?T^JhJbIsy*2`>kdkl z*f}wEutTrInQQbqnXk(R)pEUrV&zq=R6dP@q|-vTR1mQ5_^ zk01X{26mc;b{hD7sy;Jw6%jF>DcqxNs$PHT;KXI}(b>t5X_5E+% zzmThZQD9rgclk%kET`b)*oyIW zCo3pn$R){lWhm$QCygt5ajYBQ^Lah=^*>)=6}A!*!1@p9L+tOw)&JSndUY7UFIMg% zWqf{pUpiXE7}Ri`l1XoH+<*Vbos)lKg#Ir#zM8l}(|a%>sM~nanuLd3U=S3%e(e}Q z697}AECV;+Xinj;LvTG9{Y5^G(*qS0gikV+Rs|=iBhWHlKpQ|IYANEp*XZR9z?QcD z6%5hI2OOZqFaXqBR2BZ;@gv}~18gpABb(u}3#4zaLz%L;;UqZ16*NLJJ^aHl3r)xU zUk*3}$PsR$ITG3pd$YWB6%@^*`m!ArAo>f*Ekf)67~0~@xKA5r%>Tdyxdv%bO7CS9 zkURM(fKk4fzqF@tk88d9fh-Q0KAX?k$#v&f>cXcFa*FL3g6MES@&RqY(Cc%KzZN)x zTMP-zIqrgHB0#nsR9SHa=Rt^9Lm|-$%)0D;j)FoG5Q<$Dssh0p%>-r_gidqM)+7iJ zzzEeVBZuo|XK_k0nP&wcVSYvFNKXjYWG>6PenWq=gcetf^ZUi@nE3*{Jh|B)LkB&$ z`@uLJ+1z3}cn@!+4{%|g0QBHx<+tz)!S%J=fqVo4$kzzuG{Dt|2YR#kSf4A6xgi?P}#m8k)2VSOYrw~0M?=SmKX02 zm5__X4a7!cup!7|gX>PF%4lyW;1`hlK*#_0FPzwzJZKK5f*DK?5-umpT>#7uNW1Lq z`-#+KTd#Xd9XR*FF312ySiLMo=~uR}5k+=e-oje07^`jN{cN>&^R)bvkE>no-*R}+ z+5TWu`xjW|{~J{D)hK{i`wR$}BKdlE0pf2lV!nW$?K=s~NA2LsI+U*`@82L!ZbWgQ zE9F;`Meh!{)Yic`K^wDb{s0MNARVd1R*+Bh1Q(fU(bf8U80kfng&NGL9*A1jp!3Ut zE&r=o-pSP-YC#XU3@wTl690`$*9&S^?@t>+?GnJafn^Jz4eAPmsGE=_7E1epn4%lt z68TSg*HQ%(yQ)v~0k7?8qqj3p0rX>jToZsFA&M8gECXV5coEkuZR-QyK|4wFnQL>- zpnz&_@ZVB=nCTd;lS>cqy=NmG8`;!HyE)bXMtSpU?q5#h^+D_SvarwG;%X1RIP)H7soa+ON>))Y z-Zlm$jt8Y7OwMXqqx#Vs;03I?rTu{cU^5VH{l-ow(fM|8-<$kHKYwk@oZ}gSkk1ro zx1r2?A{#lJ(eg)a;CddUc7R*9UDgQJ4k&ixArMN$>liYu0d)9rM+%b>rXo^}i4>9` zHUCH9p#$JZalj#4Vp{yMicL6r@Q;_r8WyTXZkD4d*1ypp>x>WkggWZ8;`oMJeX>3E zs?#Lsn`913s&9UKychy7>9#c<83pmxdmY9%mw`jd*&)bss4ptbN4WVsdKr``_b1L5 z?`_QhQ$Uy+klr8cwLoZ8h%x23_wrgEK3)$-EM7OEyXk|HtGcq@4rhx5ZsC8I{w6EM z?a7b>Ycq)HfI#DAH3fDqE$vvlv&zYM3OFyv^5YOe+#LtQQyyLCenLXwt&)>>XxQy6 zu?$%I)8r>6%ZSMHO6v0lQ^10|BR^>-q@Ne-gaUh!#uT!p%nND+mcIT~ds$5vC?FCM z^4-$YZV%<+I1M0mdpIo&07`HJeI3H#ThaTgrLTCk`wcBL zDhnR~Qza3&8e3gHy@WXTHk89ZCCeK&Cu4GrrRDMTUH zNt*bgRw2RoC9|>=o4Xe&cc7!MFFnrUPjs`APl~XLY6t+!DSmM#M0UBI*bm`L({H`} zx>fi_9gu{xA@E6_+eA}DB;>c%#%M+YEflK>L7bX{2c1ExRcUoRWU2NZq&1Gp91mal z4C>?1mCupTmSaV=0q}SmRmk>HI}fUDO|a41r}<6%4+)0XcB6|3c;wt~X4uOXZ_>8U z-<2+--B_Y4|}4VW0)Xo z+up4>6g;=FF&S1y(zc4L*XsPUOS6eZ4o%cKm@M(R4He0zq&OMQb)M$R@-6yXc1&0RVIq}>YEw{~c7U)IPbq=P9R zv`k_{)vW~qt*ihG%&P$9wQjbkcr*Ya-9gI|hB)jcjtzJOFXY6?`L2*)ZYL~6im%(x zfnAcPHp~X^Qd8;1Q)?m6`Y$ZM`ro}sJhUN<`cjeujSv;>?W#w>zG?UI`mF;iy`0&Q z$*@L(I+XO@ZeKB%JA#C;Wac_THUGByIRUsyQvJpO( zkKCAtIucrR+20+>LJC|V9eaIX1D(dWIC#?$IotOR*vCI*gfm>>i$(A{!-{{q*v4+#JO literal 0 HcmV?d00001 diff --git a/rfcs/proposed/task_aggregation/assets/perf_scalability.png b/rfcs/proposed/task_aggregation/assets/perf_scalability.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0c53f7ef7957e380de908ac7b0024c222d2034 GIT binary patch literal 32536 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

%QOJPSjE8{#LS=l9NdQ!x2}dU!j0Em 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 Ga6S6NOHU$rS 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 literal 32536 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 Date: Wed, 17 Dec 2025 15:51:38 +0200 Subject: [PATCH 7/8] Update rfcs/proposed/task_aggregation/README.md Co-authored-by: Mike Voss --- rfcs/proposed/task_aggregation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/proposed/task_aggregation/README.md b/rfcs/proposed/task_aggregation/README.md index ea3ef144fe..4df11a3bfd 100644 --- a/rfcs/proposed/task_aggregation/README.md +++ b/rfcs/proposed/task_aggregation/README.md @@ -337,7 +337,7 @@ flowchart TD subtree_check --> |Yes| subtree_head_insert[head->left = new_task] subtree_check --> |No| subtree_head_left_check[subtree->left == nullptr?] subtree_head_left_check --> |Yes| subtree_head_left_insert[subtree->left = new_task] - subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == new_task?] + subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == nullptr?] subtree_head_right_check --> |Yes| subtree_head_right_insert[subtree->right = new_task] subtree_head_right_check --> |No| subtree_head_size_check[subtree->left->num_items
<
subtree->right->num_items
?] subtree_head_size_check --> |Yes| subtree_switch_left[subtree = subtree->left] From 40ed0dcd0625a0be0df9f7c6a9b71e565f50cab0 Mon Sep 17 00:00:00 2001 From: Konstantin Boyarinov Date: Wed, 17 Dec 2025 15:52:02 +0200 Subject: [PATCH 8/8] Update rfcs/proposed/task_aggregation/README.md Co-authored-by: Mike Voss --- rfcs/proposed/task_aggregation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/proposed/task_aggregation/README.md b/rfcs/proposed/task_aggregation/README.md index 4df11a3bfd..0723786683 100644 --- a/rfcs/proposed/task_aggregation/README.md +++ b/rfcs/proposed/task_aggregation/README.md @@ -157,7 +157,7 @@ flowchart TD ``` -Revisit the producer-consumer example using *aggregating-task-group* instead of ``tbb::task_group``. +Let's revisit the producer-consumer example using *aggregating-task-group* instead of ``tbb::task_group``. When the *aggregating-task-group* is created, the producer's task tree is empty.

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 - -When consumer (worker) threads join the task arena, they must search for tasks to process. Since the only source of tasks in the arena is the local task pool -of the producing thread, consumer threads will steal individual tasks from it. - - - -After executing the stolen task, consumer threads run out of work again and must steal from the same producer's local task pool. -Because the number of consumer threads can be large, stealing tasks from a single producer's task pool creates a bottleneck, resulting in significant -performance penalties and poor scalability. - -Another bottleneck is a reference counter inside the ``tbb::task_group`` that is used to register the task in the group. The reference counter is incremented when a task -is created and decremented when the task completes execution. - -To improve the scalability of the reference counter, oneTBB ADD_VERSION introduced a per-thread reference counters - each thread that creates a task registers its thread-local -counter as a leaf in the ``task_group``'s reference counter. Tasks created by a thread holds a reference in the thread-local counter, which in turn holds a single reference -in the group's reference counter. - -However, in the scenario above all tasks are created by a producer thread, so all of them holds references in a single producer thread's counter. - -## Proposed Design - -### Resolving the Single Task Source Bottleneck - -This document proposes a task distribution mechanism combining the existing ``task_group`` spawning mechanism with the idea of the aggregator. - -For simplicity, let's refer to the API implementing this idea as *aggregating-task-group* providing two -basic methods ``run(task_body)`` and ``wait()``, similar to the regular ``task_group``. - -Tasks in an *aggregating-task-group* forms a binary task tree where the first and the second layers -contains a single task and each other N-th layer contains up to 2^N tasks. - -Each tree node contains three pointers to other nodes -* Pointer to the left node on the next layer -* Pointer to the right node on the next layer -* Pointer to the parent node on the previous layer - -Additionally, each node contains the number of items in the corresponding subtree. - -```mermaid -flowchart TD - task0[task0
num_items = 6] --> task1 - task1[task1
num_items = 5] --> task2 - task1 --> task3 - task2[task2
num_items = 3] --> task4[task4
num_items = 1] - task2 --> task5[task5
num_items = 1] - task3[task3
num_items = 2] --> task6[task6
num_items = 1] - task1 --> task0 - task2 --> task1 - task3 --> task1 - task4 --> task2 - task5 --> task2 - task6 --> task3 - - - linkStyle 0,1,2,3,4,5 stroke:#e74c3c,stroke-width:2px,color:#e74c3c - linkStyle 6,7,8,9,10,11 stroke:#0000FF,stroke-width:2px,color:#0000FF -``` - -Binary tree of tasks supports three basic actions: -* Adding a task into the tree -* Splitting the tree into halves -* Grabbing all items in the tree - -The detailed description of all of these operations will be provided in separate sections below. - -The *aggregating-task-group* instance supports a thread-local atomic pointer to the binary tree which is initially empty(``atomic`` set to ``nullptr``). - -Each call to ``run()`` appends a task to the calling thread's binary tree and if the tree was empty (i.e. the inserted task is the first in the tree), -spawns a service *grab-task* pointing to the tree. - -The sequence diagram for ``run`` is shown below: - -```mermaid -flowchart TD - run["run(task_body)"] --> allocate_tree_task[t = allocate task] - allocate_tree_task --> add_task["first = thread_local_tree.add_task(t)"] - add_task --> first_check[first ?] - first_check --> |Yes| allocate_grab_task[gt = allocate grab task] - first_check --> |No| exit - allocate_grab_task --> spawn_grab_task["spawn(gt)"] - spawn_grab_task --> exit -``` - -When the worker thread executes the *grab-task* stolen from the producer's local task pool, it grabs all the items in the producer's tree. - -Since the producer's tree is left empty, further call to ``run`` would append a task to the empty tree, resulting in spawning new *grab-task*s. - -After grabbing the task tree, the *grab-task* bypasses the head task of the tree. - -The bypassed head task checks the number of items in the tree, and if it exceeds the specified grainsize - splits the tree into halves. -The head task of the second half of the tree is spawned and the currently executing task (that is now head of the first half of the tree) -is re-executed, resulting in recursive splitting until the grainsize is reached. -Once the grainsize is reached, the head of the tree spawns its left and right leaf tasks if any and executes the associated user body. - -The sequence diagram for the grab and split tasks is shown below. - -```mermaid -flowchart TD - grab["grab_task(tree)"] --> grab_all["head = tree.grab_all()"] - grab_all --> bypass_head[bypass head] - bypass_head --> head_body["head body"] - head_body --> is_divisible_check[head->is_divisible ?] - is_divisible_check --> |Yes| split_head["head2 = split(head)"] - is_divisible_check --> |No| start_execute["t = head"] - split_head --> spawn_head2["spawn(head2)"] - spawn_head2 --> |Other thread| head2_body - head2_body --> head_assign[head = head2] - head_assign --> is_divisible_check - start_execute --> left_check[t->left == nullptr ?] - left_check --> |Yes| execute_t[execute t's function] - left_check --> |No| spawn_left["spawn(t->left)"] - execute_t --> exit - spawn_left --> |Other thread| left_body - spawn_left --> |This thread| right_check[t->right == nullptr ?] - right_check --> |Yes| execute_t - right_check --> |No| spawn_right["spawn(t->right)"] - spawn_right --> |Other thread| right_body - spawn_right --> |This thread| execute_t - left_body --> assign_t_left["t = t->left"] - assign_t_left --> left_check - right_body --> assign_t_right["t = t->right"] - assign_t_right --> left_check -``` - -Consider the producer-consumer example from the introduction, now using *aggregating-task-group* instead of ``tbb::task_group``. - -When the *aggregating-task-group* is created, the task tree of the producer thread is empty. - -The first task submitted to the group is appended to the tree, and since the tree was empty, the ``grab_task`` is spawned (added to the local task pool). - -Subsequent task submitted to the group are appended to the tree without spawning any tasks until the ``grab_task`` executes. - -Once a consumer worker thread steals and executes the ``grab_task``, it grabs the tree containing some amount of tasks. Let's say it contains 1000 tasks. - -Starting from this moment, the producer's task tree is empty again, hence subsequent ``run``s would spawn additional ``grab_task``s. - -Consumer thread check if the grabbed tree is divisible and if it is - splits the tree into halves, spawns a task representing a second subtree, and re-executes -the current tree's head to keep dividing the tree until the desired grainsize is achieved. - -Let's consider a grainsize of 150 tasks. Producer thread appended 500 tasks into the task tree before the consumer thread 1 came and grabbed them. -Thread 1 splits the tree into two halves (each containing 250 tasks) and spawns a head into thread 1's local task pool. - -Assume Thread 2 steals the spawned task from Thread 1 - it will also split the subtree into two halves, each containing 125 tasks, but will spawn the second half to Thread 2's -local task pool. - -Thread 3 can now steal the task spawned by Thread 2 and since it is not divisible - spawns the entire subtree to its local task pool. - -Same amount of tasks would be spawned by Thread 2 when the task would be re-executed. - -Thread 1 would split the tree once more resulting it once more stealing (let's say by Thread 4). - -Hence, for such a model, instead of spawning 500 tasks by the Producer Thread and further stealing from a single source, 4 threads have spawned 125 tasks each, resulting -in 4 different task sources for stealing that improves the stealing scalability. - -This model can be interpreted also in the following manner. Consider a producer is going to generate N input work items. As it was mentioned, N is unknown in advance. -The execution using *aggregating-task-group* would be similar to buffering some amount of inputs, execute async parallel for on top of the buffer and start buffering again. -So processing *N* input work items can result in *M* ``parallel_for`` invocations over *K0*, *K1*, ..., *KM* iterations where *K0* + *K1* + ... + *KM* == *N*. - -### Resolving the Reference Counting Bottleneck - -As it was mentioned in the introduction, ``tbb::task_group`` in the single producer-multiple consumers case suffers from a bottleneck caused by tasks reference counting. - -Since all of the tasks are created by a single thread, it's ``thread_reference_vertex`` holds a single reference in a ``task_group``s ``wait_context``, while each -task holds reference in a producer's ``thread_reference_vertex``. Since the tasks are likely stolen and executed by consumer threads, reference counter in producer's -``thread_reference_vertex`` would be decremented by multiple threads, resulting in negative performance effects. - -In the *aggregating-task-group* task distribution approach, this can be solved by adding a reference counter to each task of the tree. A reference is held: -1. For a task itself -2. For a left task in a tree -3. For a right task in a tree - -Before spawning, the *grab-task* holds a reference in a calling thread ``thread_reference_vertex``. Once it executes and grabs the task tree, it substitutes itself -with the head of the grabbed subtree in a waiting tree. - -The lifetime of each task is extended until the reference counter is non-zero. Similar to - -```mermaid -flowchart TD - producer_vertex[producer thread vertex
ref_count = 1] --> tg_wait_context[task_group wait context
ref_count = 1] - task0[task0
ref_count = 2] --> producer_vertex - task0 --> task1[task1
ref_count = 3] - task1 --> task2[task2
ref_count = 1] - task1 --> task3[task3
ref_count = 1] - task1 --> task0 - task2 --> task1 - task3 --> task1 - - linkStyle 0,1,5,6,7 stroke:blue,stroke-width:2px,color:blue - linkStyle 2,3,4 stroke:red,stroke-width:2px,color:red -``` - -In a diagram above, red arrows denotes a left or right child in a task tree and are not involved in a reference counting. -Blue arrows denotes a parent relationship in a waiting tree. - -When a subtree is split into halves, only the red arrows are changing. The waiting tree remain unchanged. -Once a task executed it's body, it releases a self-reference held in a reference counter. Once the reference counter reaches zero, -the task is deallocated and releases a reference in it's parent in a waiting tree. - -This approach allows to distribute the reference counting across multiple tasks and avoid bottleneck on a single counter. - -### Allocator Bottleneck - -Another bottleneck that appears in a single producer- multiple consumer scenario is an allocation bottleneck. In a regular ``task_group`` (as well as -in most of TBB parallel algorithms), tasks are allocated in a per-thread small object pool. Only an owner thread can allocate from a pool, but multiple -threads can release a memory to a pool. - -Since all of the tasks are created (i.e. allocated) by a single producer's small object pool, multiple stealers would release the memory to a single pool -during the group's work. Producer's small object pool becomes another bottleneck in a system. - -Current version of the document do not propose concrete solution for this bottleneck. Possible solution may be to avoid deallocating the task tree on the -consumer's side, but create a service *free-task* pointing to the task tree and submitting it directly to the producer to guarantee that the memory would -be deallocated by the owner. But since the original tree structure is broken by the constant tree splitting, this approach is not straightforward to implement. - -## Performance Analysis - -## Alternative Approaches Considered - -## Possible APIs - -## Open Questions - -## Task Tree operations in Details - - - -Alternative approaches for how the *aggregating-task* should process the grabbed list can be considered. - -For example, it may follow the approach of ``tbb::parallel_for_each`` for forward iterators: it cuts a single chunk -from the list, re-spawns the *chunking-task* with the reduced list, and bypasses the *chunk-task*. - -For example, it may follow the approach of ``tbb::parallel_for_each`` for forward iterators: it cuts the single chunk -from the list, re-spawns the *chunking-task* with the reduced list and bypasses the *chunk-task*. When a worker thread -executes the stolen *chunking-task*, it cuts and bypasses the task for the next chunk and re-spawns the *chunking-task*. - -The *chunking-task* is re-spawned until the list is empty. - -## Possible APIs - -It does not make sense to completely replace ``task_group::run`` spawning mechanism with task aggregation, as this could -introduce unnecessary performance penalties in other ``task_group`` use cases (e.g., divide-and-conquer patterns), where -tasks are produced by multiple threads or generate additional tasks. - -There are several options for expressing tasks aggregation in the public API: - -1. A separate ``task_group``-like API, e.g., ``tbb::aggregating_task_group``, providing the same set - of member functions as ``tbb::task_group``. -2. Integrate it into the regular ``tbb::task_group`` API by providing an additional overload for ``task_group::run`` that - accepts a policy parameter, or a separate function in ``task_group``. -3. Introduce a separate API not connected with the task groups. One option is ``tbb::parallel_while(generator, predicate, body)``, - which executed ``body(input)`` in parallel while ``pred(input) == true``, with ``input`` generated by repeated calls to ``generator()``. - -## Open Questions - -* Which public APIshould be used to implement tasks aggregation? See the [Possible APIs section](#possible-apis) for details. -* Which chunking approach should be implemented? See the [Alternative Approaches for Chunking section](#alternative-approaches-for-chunking) for details. -* What chunk size should be chosen? - - - - - - - - -### Adding a task into the tree - -Consider having an empty binary task tree. -The first added task replaces the head of the tree. The second task is inserted as a left subtask of the head. The right subtask of the tree is always ``nullptr`` to support the tree structure described above. - -Starting from the third inserted task, the tasks are inserted into the left or right subtree containing less number of items. - -The sequence diagram of the insertion is shown below: - -```mermaid -flowchart TD - - I[insert new_task into the tree] --> head_check[head == nullptr?] - head_check --> |Yes| head_insert[head = new_task] - head_check --> |No| subtree_insert[subtree = head->left] - subtree_insert --> subtree_check[subtree == nullptr?] - subtree_check --> |Yes| subtree_head_insert[subtree = new_task] - subtree_check --> |No| subtree_head_left_check[subtree->left == nullptr?] - subtree_head_left_check --> |Yes| subtree_head_left_insert[subtree->left = new_task] - subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == new_task?] - subtree_head_right_check --> |Yes| subtree_head_right_insert[subtree->right = new_task] - subtree_head_right_check --> |No| subtree_head_size_check[subtree->left->num_items
<
subtree->right->num_items
?] - subtree_head_size_check --> |Yes| subtree_switch_left[subtree = subtree->left] - subtree_head_size_check --> |No| subtree_switch_right[subtree = subtree->right] - subtree_switch_left --> subtree_head_left_check - subtree_switch_right --> subtree_head_left_check - head_insert --> exit - subtree_head_insert --> exit - subtree_head_left_insert --> exit - subtree_head_right_insert --> exit -``` \ No newline at end of file From 42a5cfcc4ef87f3fa8a054004a214877fc6b0136 Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Fri, 12 Dec 2025 14:11:30 +0200 Subject: [PATCH 5/8] Remove unnecessary assets --- .../aggregating_group_aggregating_task.png | Bin 24379 -> 0 bytes .../assets/aggregating_group_chunking.png | Bin 10967 -> 0 bytes .../aggregating_group_consumer_thread.png | Bin 26927 -> 0 bytes .../assets/aggregating_group_first_run.png | Bin 13819 -> 0 bytes .../assets/aggregating_group_further_runs.png | Bin 15238 -> 0 bytes .../assets/aggregating_group_process_chunks.png | Bin 31205 -> 0 bytes .../aggregating_group_producer_thread.png | Bin 12911 -> 0 bytes .../producer_consumer_consumer_threads.png | Bin 37818 -> 0 bytes .../producer_consumer_producer_thread.png | Bin 12652 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_aggregating_task.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_chunking.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_consumer_thread.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_first_run.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_further_runs.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_process_chunks.png delete mode 100644 rfcs/proposed/task_aggregation/assets/aggregating_group_producer_thread.png delete mode 100644 rfcs/proposed/task_aggregation/assets/producer_consumer_consumer_threads.png delete mode 100644 rfcs/proposed/task_aggregation/assets/producer_consumer_producer_thread.png diff --git a/rfcs/proposed/task_aggregation/assets/aggregating_group_aggregating_task.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_aggregating_task.png deleted file mode 100644 index e0a478a3ccb4457cf86c0f7f341e8b3594b4dc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24379 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 z 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 IzH`_94^zXj9smFU diff --git a/rfcs/proposed/task_aggregation/assets/aggregating_group_first_run.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_first_run.png deleted file mode 100644 index 3f82d2cd7868831dd3acd0d987aa67c817e191ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13819 zcmeHuc|4Tu|L?Ra9<-23XcG}VC4}rrk$sS5NJ5seGqyoW3P}kujV;@ZeVJhhC8g}! z*v623EHlb76Jt2n^gPe^_dUP!JFnO8ob&JbqgUph`&#b%b6ub7y?o}Gp}saZ=W$L5 z1j2pm=5=ETWG4aw+2Ou#FSs(vR4D}i?eHY^Y@3H+<6%XMZO9$Ud}q&K2SK(A4|knMRGX zoB{iXgboW|)PVXQy7_eZL)r218(NW%C_6cd(>S**-uM`PYK&;DxUF$g(Q`Te&%L*I z4?Ot3sp^ai^;3O)?y2=!8M^P^&WLZ z>Zgi7z!Z(gRRit8|Je{x1mqqDi(MAp0a0vx!Y%k-`=dBv7X)(ipbibvG@(Pw+Dh0B zX-ZgFk^;9vAm=rze}CI31c9hUAE2>2d+f;pfyAGFtOS9C^PL*m0s7rH&I5s*)Y|vo zXmZGLwga7u#kRyf3_19({`Rd7yOwAroxu3s(o|6Lns`j^)QsW@^a)?S0Vc2;TTmcl zaP8+~`9vEIo)e`^f_*cO2an+>7%)5nK3MvZ2lDFCzfWt9K5j8;5BZ96y={Aw`1W|2 z$5=gC?!KzeOe|X7^Shdfg@to*9o-lsNO#W@s`9W~t>;x_1C-ct}MHVxV-I( zcx$@o0|n&X4W0)IMQ0L7C8eFd@NKjrag|0U1)o#hqDrideHg6^wu&Q+ z>W-;XHM>-Fq{EtDts`5f(o3i#b-{>Mxv3Szo85%1(X^F@j%DFpYNLG=n{#@p_nQe_ zysVxa-F8O9Hqz(g9)UMy_RYfy-%9O1wV^!foeg#dwSRqircQL&vi$zDbsD09i$uFtC6^sOI7VUKKkNl}sP#rj`a$Nsz!<35-v}!Qy)g(~PN2(b$DJrE>3wF}d%U=Mf^+5P zi?ESkTp8)2?dF64buf^%Hb9k|3#jgm9knHutV!;^j_go8s7fESr{ZC!uD8}q7Ee-C zX@oAPjLzGq7G_nq2{49v{c>UwQs`PhDJDO^wB-2;nizVGwc1Nf>YXiK>V6TrdS>M# zhsYaMR(gUVY>*nn>VFQ)*Y^3U*;raRbBzT*-((d8>5Ag4r)lC4XA* zR9KiQLved49#w*5_E*&tmlbN4UeOJUF^-_CL5wSQp-tLSGS@&j+FzOk~9{N_64Eg$>+_hWAMVh^-stDQ$ zuSWxm&ig_{m8RUAG~=plSJHh=Id6cX%$jh|v)Zm|V8PkVN|LyOZJ2qp72U2^emSEp z&6Y|!Wu7wMKBB|MxRnL)g(Uf^B|Bz37bDQoDhgi~zqI)A5yu&ZW_m?fojdCCK=L|r zKU04SE3>uN_d-N9e81w>KToMDZ%YcKr^kMv`Zk-EaBWDRdxpRCK$Z2tha=sXH9ti)Ec8L*;5@N_ z`fKsonIE#LdDGMDv*}g#c}Gc@wSuOzg*CmS?3`^&nbgDObXtG~l0N8l zF7bpjsWHi~xx>^e$ue_nsA@E*HO^Fr?>aNHr>b;KQG!(iHs9jbD3U?W9D8Q%yE+z* zw`kT*cRE0A(79|Hkq4LDlepFKRzb#7iHx|Fo-TPz5&^Q~vv(q-P}atf%g5VRRqnXS z&akZ&{}VUhKECDqjAQ+-D%wS%`=IUFhwHHSKIyw;O|Km{wQ!J_@ppU&@7-@rvf{+* zbH78HC+6?eI7h9;-=fZ!cQ12_-#S1?*G;|BUA#jb=A6dnnLgkA{)l(@JHNK}HaA7q zh;%J*`M#1r$;@r?%X2QWez(uCeq^ihp0>E_)w{YdBd`OTkG6XKpH~P)LeSsKBSpm) zv!P%B564tBVkj^XGt&f>Ml1%X;S-BaB`6Vu{6H4WMDTYcNGuVRS zWno-SjOYkiX7dqUDK4bGVq=r1`=M*h#R|FzB(c$v zOPoOS0n^NX?!Z^1O`1|+-iwhq#$R=@xDxjk90$HvS=uFsNA%>$_k{z#?+7NM!+xZn zMcdQ`1->Y+rDVmt*QWB@3mxLSy$L1qfthOF!9BQyH_1`qu%(PN)Wk@TRU5-OoTX@;tHps<$06T`ooqlR0NCUW4V+FyR$>+gfrWFv--!UYV_2j zjg-?{>tAy<3Wf6^Kvp5isY)0b3LLK~98-Oat~5xyHmBS|LnB6i3ggUU{if#otvt9# z8ZthP5j97s(DN^KkWg>mF(hM8eV+d2twi0mJAUg3j12ch93@C4?fkSTHI^!%WcnQoL<^Sk(0)%x;UMMEthQ4#f zIdB%ZU-+WvojHFKXKpNFX(VP;m%QC1j8KvxZANzQzi9QVkN60!&Mc;yegAf&`F4(t zm)6>0fmtOK7vtFa#V=o{G&1PstlrPv;NgcIi!>KnZlEv6kmQ=z;K|g%2SfSxCHR;j zN^Le3O5x#Jng$poLzA%G_9?V*O|wYE!c=R0PTSnvc0OCgOe-hhY4L?WT=&_47`4E5 zREMlDe=t7Qz29tUZN#TD&?ogXS>N2{kXcsdT}GdYfdg5aVKHqyZ{#+A`%aF7o%)St z6VsfnS7{p6#_gpCglClsI^{{|KPyExIMjAroS!%>@MG1+Yp0F&7I(Guy}oX*J0E&~ z_NpFpIsKj2O!1szF(*zvOw%$iZRO%@Ugw|lwPz)!^>@(>cbrVBxwd4O`DA=vb}J{@ zrd$=RwL}dr zfI(Fd`A;`&9!r%heG8mLJ27A--SzL8v|4&VzJXfe>p9Mzf|B~0oF-9;6AtgzBw)im3ngs0`#@+T* z*_kJT?xl#KeH-YP0Ed}q;!;RK9+i2As`Z$#~nMy_^}M+3P$#NPfLw@DS*AB7xcSEik*ozfB+dLa~yA}Jmzhm_}oT*-f}E2_?p74^GHO!c__DGUblZLe(I zi+;>frqa2{P$ya2^lfdG<%3p-FwE4NwSpbn@uxJ~lo=!Tw#ny7h}+D$h?2O9Ed}wj z-~Fb>!Zm&=%)Yf(ZOCZYL4I{1Hff+}i0|v>*e(_|Rzy{0m6@bq%X}ARZ0($mS5MDW z5n&uV2Puy3!#om8+yzfjHY`xZ$27tV=micHAthV3A4gp|Uu+NG~ zte@{=@1YK3L%+o{FRtAaF?f5mJI?4DXpp$KlCbN5t`m;X%a3$bBT4SR zL3{o$n9~1m@_))L{~zAi%_`o`Wnm61n;YY*9NUkZ7#WT09qaAty6fWN@*ZP$Mmz3` z&uqt9ZmQIs(hrMc4Pz)5+=K4ZG5`;Gw7mK9<%Uc!-OU4Qny!Mp4Tl%W6Wxed)7<*{ zQIw0U*Ti)h=bp13Sc}2X&qHGHJp91L4wbn&9Cv7MuAahVLULs9e?6eo)D1L~_sx*_DlAq)X|&Ytkx=rx zB;#U|ocxPcaRkAG&op#W{M#zGwrSlAHKGCpp~eXdaEUUn(d}r5=T!!AkhWc z7j1Svn^#h* zAm&^jURuD#BhO{XqQWudlKqzeA5yV4H>1j9%$-gnyQZ%+n8~@1JV-a+wJqb+F&OC5 zn`hVfc)!1*pj1OJgOPwiZP8K%7`!uf17wwc+3`qX(*pp~itc>2*z+QiI4L;;&+bt*xc^ z1UPHCk7I_u)=s>LfZ90L|5=@k9GTsG@uqv1^p#F3k~Ct-G*P;Ean*<8b&*>G1}vN# zPiom{{AX9DCiSYw`eP+@>{1=WM(|4-l5XMQE>k7ky?+$_V0tBeJEZlQ#z_^5Z~CL8(~bfvU5taK>JEjlZkK=OalFrPfK7@ogrIyjHDDxr{ zFGZq1(GEfg(#RCtuXl01=oOH6iRSUT|-KM!Z;5lqMVgG zvk`37qXexsOwx63UY>4+?{5Wsv5%HruqOUmNIB@rmBFVP2{tS39-$R5=QQz6wm9=p zRN1>(2r;O3fG%8oUAMAm>ye=R$obdTetg&^r`DFP+5m%?{(8T?#iYv3b56F+!UBxn zq{ukM$yX)zvj**740TP|R#}-fYpF|8>MFciotT9(RR*UdDayVf{EKUWfE^B@NNthQ zaQhOQx}6Lo-&h(D4nDA6x7ky+-;#aoM19?v5%gYURbyO(Rn^Y)2;p&Q3jlmxO(dGz zluc$ZH)g?;Ez2P|l@u>UadRpjZ;U{{TNAI0+@pjJSUZls@+bmr4FW;`K=BJgp3`#` zEU$~g>xqS$x0}1+aJbCO>sOZOB#$algNt>mujH$SQe|D;#Q)$@9u}jb@GxScI$!Jx zxBt5Fd9%S_$}blYzR>dhByFQ-Xv)<{A|F^$OFr}& zSsohI^qnxrS(Ra?v~zB8=BZ~k8HL{|yQhV+pH3orwcTLmB7Ld+Ea?1eYF*5!d1WX( zMe3RpNjov_e8Bneg{zU>%mrDy=2L=2=FOH%)76uzE`8!2`hV7ysMtavI^gK|Ol`U& zCc`iCgqzckNF-Vqe91}(mE+uPRN@t}^SVl_Hr(|T)a4wZ622OBrmAq51G^zZ%D9XD zAe7C=oEBIUHu|Vg2sO19P~YAzKpoOA`%oA7cn|&JS>l@@c2lWg2tv0Aw;asHC z(K_2*Khp+BAMD*U-F1prZ31J?#qE`SZUm#3Rx|K5(k5@fsl_i4hw~F6f zPw4D|4alr}wr*T3r?^-rI-P>gtrD>0oCx%=>666LJxKa`h(94z+vxb?YY>>aOC$RD zaKRKDD9xj9?*`eFtjM{oFc{QI>H=i;CO&vHQ{Kq8^8Tf2VT6H6WU>F z4s$SAo}aqF|Lwj%g%^u|Yam4_AWkGi9$-1Q(u@0QbKW8fQik} zCVGFy7)u{P;3_xt{^0ty5t`qrN}g`?YL+R4nl;}Z_CdCNw zrd=UBy4`B}a~$&{bi(@UuJ9|*7Mli%Oe`-xWbSdEoQ{{0YrCJaVhRV@?(_=JzEpXi znYIsLcpIU1iL(yUOEkmG!wrh{+_jpK;vX>Nq@8bdI4;&uPBXWHJfz;$&-e=L+dqGE zNUG$}S*fLl)`#~O?kha7KsfD0;z@czPUa@BUg%Ej+^zVhUl1 zkV@Cpt)tqr;9iJ)&-8c9&|l1KpQX%BSZ8hL){pT|{$sw2zJIKxX0V=aELI9xmc(gZ z+LC^CI^RSuvQ`Vli+WO9j^OP*=&P=E=L2&^y{>K2cKtPB!a$|}+9Ung9lqrmV^A@Y zPs(Xs8s9wUet)#Oy2is>Vs?8Z5NrAF-*TMWZL2-)DE!H(C2@{^6Q(D^NA5dHnw1FOaLJlD@M{R~=+bSfE z5MC*UWlYlTAua0N0Hd5zoH2vTZN|6hHyvzJHoP;%|SIfLA+ z|LQ3px)}g0HAqI~IsLZ}qOSf0XP@3mI0yRvcmEBvGc`3GVq?~C1HaMgL+er!8>#M6 z%gq>j%3hl>aw2&7#fuzZpRNe!=mO9hzB~1@L$pwdMa7pmnd#JTe|HZE!tcp-O=BKQ zKHn8y{OsRtv}b=HT)G7M@_E@~9X>{rkdRmee}?y9i;8fXC!no6!JD`a7|-GXj=wCx z)1P3PnvZ~62#F7QIbNKb`-S~{;zjrPutri`;Oc?T;?OhyB{m26gv#!GD&`LaNagkybS+p3iuZo_1}%hoA;|x%E5S{77Kt2j~+eR!2=0j1?`_dfBsi{Hd*8G z@@4+Gu;i8T?~wiwP#5K2JS=wnd{rs>m(RtUT^>y_90sX>t^XT=z|tjrO{(>7zYnAa zwn6%@5S&yuE4CgoUNd$PTDO5H>ff)ns(kSBpGS75bY=QO!YdVgDe*%DpF9O%X3BF+ z=&W9mJ|bi<C0Q7eJ{^8+FtL>I||Cso;ch)p;fE~ZY3AqL_Xw-Ii zZp=}<+t8tE?hTf8T@Y>v=bB88`j#LT+{t%tvCen=(Qq@+-C6?5TQV=@CYc3IG8QPuSVQQf4$ zHD$gfiLScQ`TV79O2mIRJe^Tj7!v~?d_nn8K+gfxWkAEGUj#e^Eb+V+|HdXTAN zssBhO;Kz6W9Rie=mdhi4dmCYw$wq-GLKgwNjEi~ZIjdRCHPxtx?>UobEPLh38;nUF zUNY0<)-a1P=CNyF@`dW?x$Fl7r*vfhh;Of+BVaS5BW9eg3;jhEIUW*g-Vr;KclOx7 zP{(y4&u*JZ3065!#RXPP?@j*=e)J?unU>6KZ?_NJ|s0@HA{>UUS7B5(qN?tFc z?^kmM>{SK1F__u6Dw4e=xY>cIw_kdi>3@8~gCFv$Ezu1#ESG>4(-O6a#9}aIq7K+E zA%I~i)@_s@W$w;cJze0S6cIrN1hI`;H8#2|k{)^u3j1C%FTR^t{-qEtHxlA})1$Xw z;+jwSoNfDyu%CiHnpA^2CzM0|%xc5d=;rqiN{*e~jP`-z&FW*7KeR^+QVUFGV_A>q z7}_GZ-rD11vfC@c9BpyIH)gH*u`VX6Rf{>wwWvgSUK#VS360*#_dadiVO%T1 z1Z-s>ZH|Nm#;2@1h4qvd1;0R(J3JcPx7PcPG2b^>`u7YWf2rCE-aF!O2H(|Rek&Q(xizbLIWKjqNOa`w5O7nJ?o4q|#&q zCHcC%Uz#&%4aekKnum>JiEXxb9E#BC^J+*p&-)!3?~s zd)64wpGPZAI;6p_!d^^m-<(BFC$yWpyquT@E;`Yc}L0 z4Kzg~`mC(cvkC)<;*AOEe6^qCKR56BOnr29b50W6a-5hRt@vWyy}i?Ck<4q^2+hqQ z9k0`FhjJf>7GVOhG^r;I^>*=rPICezx23gD()2VqPl0l0S{u&b;&$h@i!Q`eZvo-i zot}~##zOe4ol)ICB7ZVkBU(DiFyUb0jXkmlzsUz+`1FZ|oZ2p*@PR&_&m(N|9M1fX{F>bOk}yeX{}s)j&L)rh}&_X$rSmd z+auw=t8S7(13I)WXw8MNQ}$`&)aLpM{I2n{H^p!DYD$sDQLEq$0T8pTe_ZF5-`DxK zy)2GGIUyG=?;qdQNhAf%S)J+21x5}VPF6~8NY>Zj+@(kn9CdNi+BE-NkHUZ|>|DDE z#-?7PgSl(Ts6usa-DqX_MXho9-{rF|#Xi`b?lV?$_=--{<}wejT+Q zKB*|(@1b`<_Snme9tD;@2IhH3&3F6gf}eV&exx?+b^LR#0GG~ONhc+l??8eaaQ~Ac z5(p_WE3$Nmx_Zb+s$gOh2&KUePa{U*Rbz zi{Pb4VIC&Kxzuj|xhx)SDy5P)<)I#_i#6gi{8+;%-}HP&@oUlV9}Q$VB=~z(OE;p7 zpKr-tO*p4lKCVa1s)-m=E*TgF4ijE#v@J!Z&b%sTy3z*rXYPS~7gMQ%vYoH`F$}ZW zuSV7%O!S`Yv~lv&I)q5?i?bZpZ>_OEc7*R?F&2o%JYJqr(b8%kXBW(o@Ac%xIn9V+ zq0T62{Y`St<`_$?O|^cVX)-5ZvfFL-Frr#V+fs=P>krD^`UA&LOxr^*-Pa!!ve zcf%(Pr7@M+;zA-GyJ1E;InO!$QGloFu@bJgb>zsN+J?HoH|wPI6L5k?weH;G0*BVf z#wU%&GoP(em{~tENiQ(Iou=~GRR6wwBPrNx%F*30sRBRAU%yak6db3Ey7G?4u#fZN zM+u}baDFwTtlnr8CrRB;KOxk*wlF}Vnp@rYh7&xVQSg}=xO^t&z<6FeH^O9F= zA93*JD$B$h3LT>9=&9$6ZK>2CXQ_nm(|Cl3E<&SDqx{)W?RTvt=ps%z;2We>`%eQ*pY4ZllbFMj8xeZ;m z8Y`3wP&e;p&*#p4u`k7=RavJuZ~X8Qe~)RBrpVdX+@piVn_E*ej52wXq#xT&D1PhK zRN-`3K;xx{K{7w*_hYW%Yvf-I3Ku< zOFBM5S#=rGl_oU3RY4A;Ty$50*XF17`1N!6|3It$u<+dq_a&`XRJEhTIs;4~Ek?f? zg?8SUmDx-?%IV8v;r5H=PvQzrz3 zcW1s@OFVn~|r<)2N5N1>HK+dlZKg-;ZrHV0LyC%q5&k&V2zHXrIpNFA&M7orcoUFKZ8VcM3r=Ji~f_%i%(PUq|LD4<+^VC-m{v&(3`UqVx27 zBeq8%5s`_*3a>|Zz)bQOK6wQW2P(W<(7BCj{KzSj3VFG(swjW7!YEFh#OEl)SXmPYH^*=J3LiQs!;fjR2DN$vqQYg`5z8gM$`QN|`8Om3lRVg+1R ztGU?geM@nZhac-*#I~b`*_3^bSdc95aJwOtb=%JmCm-qk1w5HE8AxU%E{Wd|k3)@M zQF`~G&_!Ta#c_3ykJG@kXFfdK1wt1c&53m~iSXojeFVfM?DJRHh}99HC;xoL5UL8L zvphlGyzlYtmFP?^%KfsetgJuSEfDX7r=C^b(>hBpFOl$YnLLAZIW7U|D}a)~2e#Q1 zuTjgal?EKSxF{YWm*&s8#G>I4wi1gryXWU@YFZw}E5h@B=>nL~@WLw4FfvUV{MlSY!1xbA zxwhahZ^*TXsuZA8sQJGf*N4-rYio@OvuVL?pn7w060nTnGM!bnCqNoyM@=5s6KrbE zX3f{`s*MZW5Y3Wg+iZNZX1sqW-&jaXmdfHq{%2 zT1gN{wTKdVuoA+>Uyi%a_2l@ACjx(gbf^a8`$1>2dA|`w36$=#Z;5wDZmgDRo?*RU8)h@ow~Br(X2cdcm81uj&7wW%tg_c{A3ODsUMO(-)>wV+FS2SM#<{|u z!N%&5zn3TkxL<0OO>9L0(j;IZWd-WiqKu86!3H-fl))I=xCX@&PPO_toeF+ zQGwmH1|PF@|o3V6V2erLSZMK`7w83oZwB^GbqmZeU$qSQ=6e=tg*r# zCD^Hj1_?7ELCL}ALP|+o;GL)?8^(?h=NL(*=g~Tp>UKc&Df7la1@OCf4fw_$?8eM2bB8ja&}r-zTO~Ol!eWakXPW@arUvw6-}1Nq+a~o5La`r*&mby!1QS+UQ={l1 zky>*TQ(R2X1=r*Cq7ac;wfZNndVWAfn;98_qF!)WVSY7~?ag*w;Q!rmM!+E>@7dvT zA+{0Ot5bDylEx2&2g#dy-(bMqJ|^q(nq48y?IUSc_$T1)a*2tF?DHx7nr~3G2?hpg zs@s2uza3HZ2G}UT(1g_vnO#(oti$zZ|RM_mPnD2CHa)VILAM9%(8>?L-gwJEL~ z$@C{Z1Gci7dBzq}w&~@Y;8uw)OvOZzRaGj^bzt~VZ9S5iy1p_?g6sp6eE=jX5TUr{ z7a|_bVCb90UtNaSYF=g^)O!|d?*Q~ODe4dKO-%$l;Wu^9!D-jY=xd-tnBHQcO)O`O zg*E(MmZ9tv^7PEXaeY`3n@G_kIGr|D=W@fgxA42!`Wazv)swwag0%{zbAR;0Bq*~$ z8as&q`wMItH4tK@HT66YVg3UBSY9E;DNx1hIv^cf0(Kl^>KqXL%*{!euR(=E8{72a zFRB1}3Yf{lKEKOlz)d}HcD{Ie<`VkoLi7;Z^HqXA)ma2`;?cn)>?wRabeJ9E1GZU> zXvIsRpq(CYp4(?t7z*x6AX~)e0T~ihF(}#8_+o^TBWTxuQr^8tO%O9k9sd+XDw8fX zw0gh)@VS5z036g_0~bGBbpAm#H0grHy=EY9m)RSgPor6ud5&uozX5v{*2wmv1Ab0? zW@oXbS$$F88VUdTKFsJ_$C`KzSg9MihRC+L7vkCvY7|k8N|kd36~46}E{y%1%#N?6tPGz|LpBcNeb!;l}RMlfd6==un{gXAtVe z0Ja=w%~=zWg~#{f%NBs-BvocoYJx#a=Yt+7oY7vVT<>iVOg=EjdBYymsvk@o)B{$Y z3V0phOQZaxe4u!PcV>`RMQFW2{Q&^UtR8z(I)FR<%#b|IP9f!5Pn2L?AGFwVaL&Ns zAdqhl!PuH*S0W{Ci&noCdHTPQJcl~b1q>MbRX68!L@&(GzsD^4=0&rs*Q11ke*6FN zHV%PN(I5-{RtZhI*#a!f2@K!k{w4O9e<7*-NVF0ZjGDa<&JOKAKhF3M>6I-l4}dBb zkj)^k`?014K&mB{gAeb^Y65M=pJih&HoxGVNsIa{g==S z3bjGpPJ@9!oGzX5P{eWWCK)anC&-I&=9&R(@>Ffq264*EH{Ud;lDQcVK{ebCFnAxB6cf_*fF zKh6hA*Z-^$|NY~Xe*hIbt;cDKeF44f|M}w+FX`t9!H4>vM*8cQE6-%sa> zV7qjnSw`h=81s)p4@!Ujcly2*tfud;*6(SCWgcTH6<}+4V2R;7b`9_OkeYfN)E9l% z!(oey-F-@i|D#xkTTm|GMJjP%00oj!ph;1sN|Ag*jmQ3)7IPAY>bE>3Mm{tJT;rd) zmY@m;&@2=?&0~qbeonSmI`_WEIC?Rhzs8?(1Y2(uTHy^!j^5RZ>gHZ$W;3|wXY#VL z8Vi9D04jZAkwD6q1xM=7+!ojL)u9EY?*dNgM=spCOJ5pW(!=#gAwbQ{oF2bZI@^{2 zzX_T8t2)UeEtI)Av6v8wS`(z^!B@wY#c3*Y$hEDM7Kik{d}Rvub2SrcYC5g#qMKe< zzYEj|Id^AiIfDH-3Js(t;AJR{5m%XfNqVcOys`S*UJOt|G*xb(7^OR-G86MxFb(r# r4lh0qX4?$e`~Gi#kc6>o+vW(76~Wl)>vVzeL2ha3UoY0U8}UB?t=a0+ diff --git a/rfcs/proposed/task_aggregation/assets/aggregating_group_further_runs.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_further_runs.png deleted file mode 100644 index 9186f64328e7ac2076d44ad790619ffcd88c431a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15238 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 diff --git a/rfcs/proposed/task_aggregation/assets/aggregating_group_process_chunks.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_process_chunks.png deleted file mode 100644 index f8cc260c3892ff1285c95a23df017a8eb337ff4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31205 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
uR?Z@_0dY#jh}O(o&; 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 diff --git a/rfcs/proposed/task_aggregation/assets/aggregating_group_producer_thread.png b/rfcs/proposed/task_aggregation/assets/aggregating_group_producer_thread.png deleted file mode 100644 index 6d13567ec3e508599ef0a9cc6b7190fd52d2af31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12911 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 diff --git a/rfcs/proposed/task_aggregation/assets/producer_consumer_producer_thread.png b/rfcs/proposed/task_aggregation/assets/producer_consumer_producer_thread.png deleted file mode 100644 index 0a291f2867744ee3b3c75cde6faea81928c481e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12652 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 From 3d6ba6e2572cd40eafc5109c57a236cb07bcb41a Mon Sep 17 00:00:00 2001 From: "Boyarinov, Konstantin" Date: Fri, 12 Dec 2025 14:55:45 +0200 Subject: [PATCH 6/8] Minor improvements --- rfcs/proposed/task_aggregation/README.md | 28 ++++++------------ .../assets/perf_scalability.png | Bin 32536 -> 32685 bytes 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/rfcs/proposed/task_aggregation/README.md b/rfcs/proposed/task_aggregation/README.md index 87c7e4de63..ea3ef144fe 100644 --- a/rfcs/proposed/task_aggregation/README.md +++ b/rfcs/proposed/task_aggregation/README.md @@ -161,18 +161,8 @@ Revisit the producer-consumer example using *aggregating-task-group* instead of When the *aggregating-task-group* is created, the producer's task tree is empty. -The first submitted task is appended and because the tree was empty, a *grab-task* is spawned (added to the local task pool). - -Subsequent tasks are appended without spawning until the *grab-task* executes. -When a worker steals and executes the *grab-task*, it grabs the tree. - -From that moment, the producer's tree is empty again, so subsequent ``run`` call spawn additional *grab-task*. - -The consumer checks whether the grabbed tree is divisible; if so, it splits the tree into halves, spawns a task for the -second subtree, and re-executes the head to continue dividing until the desired grainsize is reached. - -Assume a grainsize of 150 tasks. The producer appended 500 tasks into the task tree before the consumer thread 1 came -and grabbed them. Thread 1 splits the tree into two halves (250 tasks each) and spawns the head of the second half into +The producer appended 500 tasks into the task tree before the consumer thread 1 came and grabbed them. +Thread 1 splits the tree into two halves (250 tasks each) and spawns the head of the second half into its local pool. Thread 2 steals that task, splits the subtree into two halves (125 each), and spawns the second half to its own local pool. @@ -207,7 +197,7 @@ In *aggregating-task-group*, it is addressed by adding per-task reference counte 3. Its right child (if any) Before spawning, the *grab-task* holds a reference in a producer's ``thread_reference_vertex``. After execution and grab, -it replaces itself with the head of the grabbed tree in the waiting tree. +it replaces itself in the waiting tree with the head of the grabbed tree. Each task's lifetime extends until its reference count reaches zero. @@ -324,7 +314,7 @@ flowchart TD try_grab --> |Success| exit_grab["Exit to tree distribution"] try_grab --> |Fail| spin_while_locked - add_task[add_task
producer] --> lock_tree["tree = head.exchange(nullptr)"] + add_task[add_task
producer] --> lock_tree["tree = head.exchange(locked)"] lock_tree --> insert["do insert"] insert --> unlock_tree["head.exchange(tree)"] unlock_tree --> exit_producer["Exit"] @@ -335,7 +325,7 @@ flowchart TD Consider an empty binary task tree. The first added task becomes the head. The second task is inserted as the head's left child. The right child of the head is always ``nullptr`` to maintain the structure described above. -From the third task onward, insert into the subtree (left or right) with fewer items. +From the third task onward, the algorithm inserts into the subtree (left or right) with fewer items. ```mermaid flowchart TD @@ -344,7 +334,7 @@ flowchart TD head_check --> |Yes| head_insert[head = new_task] head_check --> |No| subtree_insert[subtree = head->left] subtree_insert --> subtree_check[subtree == nullptr?] - subtree_check --> |Yes| subtree_head_insert[subtree = new_task] + subtree_check --> |Yes| subtree_head_insert[head->left = new_task] subtree_check --> |No| subtree_head_left_check[subtree->left == nullptr?] subtree_head_left_check --> |Yes| subtree_head_left_insert[subtree->left = new_task] subtree_head_left_check --> |No| subtree_head_right_check[subtree->right == new_task?] @@ -364,13 +354,13 @@ flowchart TD As noted above, each node maintains pointer to left/right children and to its parent. -This document proposes requiring the grainsize to be >= 4 to simplify splitting. +This document proposes requiring the grainsize to be $>= 4$ to simplify splitting. Splitting occurs only after a grab; thus, the splitting thread exclusively owns the tree, and no synchronization is needed. -Only the first two layers of the tree are needed for splitting. Let's call them ``head`` and ``next``. Splitting is done by setting -``head->left = next->right``, then ``next->right = nullptr``, and update counters accordingly. +Only the first two layers of the tree are needed for splitting. Let's call them ``head`` and ``next``. +Splitting is done by setting ``head->left = next->right``, then ``next->right = nullptr``, and update counters accordingly. Parent pointers are not modified so the waiting tree remains intact for reference counting. Before splitting diff --git a/rfcs/proposed/task_aggregation/assets/perf_scalability.png b/rfcs/proposed/task_aggregation/assets/perf_scalability.png index 7f0c53f7ef7957e380de908ac7b0024c222d2034..34ae34baf6fec03b0316230498313ccf4c060ab6 100644 GIT binary patch literal 32685 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