[Bf-blender-cvs] [2409a9f0af4] master: BLI_tasks: simplify/generalize heuristic computing default chunk size.

Bastien Montagne noreply at git.blender.org
Wed Sep 18 17:38:19 CEST 2019


Commit: 2409a9f0af42b999aed5ecb3118767551d8a04e0
Author: Bastien Montagne
Date:   Wed Sep 18 17:35:00 2019 +0200
Branches: master
https://developer.blender.org/rB2409a9f0af42b999aed5ecb3118767551d8a04e0

BLI_tasks: simplify/generalize heuristic computing default chunk size.

That code is simpler and more general (not limited to some specific
values of thread numbers). It still gives similar default chunk size as
what we had before, but handles smoother increase steps, and higher
number of threads, by keeping increasing the chunk size.

No functional change expected from that commit.

===================================================================

M	source/blender/blenlib/intern/task.c

===================================================================

diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index 2f6c88c128a..6cdaec97d9a 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -1064,22 +1064,28 @@ BLI_INLINE void task_parallel_range_calc_chunk_size(const TaskParallelSettings *
     chunk_size = settings->min_iter_per_thread;
   }
   else {
-    /* Basic heuristic to avoid threading on low amount of items. We could make that limit
-     * configurable in settings too... */
-    if (tot_items > 0 && tot_items < 256) {
-      chunk_size = tot_items;
-    }
-    /* NOTE: The idea here is to compensate for rather measurable threading
+    /* Multiplier used in heuristics below to define "optimal" chunk size.
+     * The idea here is to increase the chunk size to compensate for a rather measurable threading
      * overhead caused by fetching tasks. With too many CPU threads we are starting
-     * to spend too much time in those overheads. */
-    else if (num_tasks > 32) {
-      chunk_size = 128;
-    }
-    else if (num_tasks > 16) {
-      chunk_size = 64;
-    }
-    else {
-      chunk_size = 32;
+     * to spend too much time in those overheads.
+     * First values are: 1 if num_tasks < 16;
+     *              else 2 if num_tasks < 32;
+     *              else 3 if num_tasks < 48;
+     *              else 4 if num_tasks < 64;
+     *                   etc.
+     * Note: If we wanted to keep the 'power of two' multiplier, we'd need something like:
+     *     1 << max_ii(0, (int)(sizeof(int) * 8) - 1 - bitscan_reverse_i(num_tasks) - 3)
+     */
+    const int num_tasks_factor = max_ii(1, num_tasks >> 3);
+
+    /* We could make that 'base' 32 number configurable in TaskParallelSettings too, or maybe just
+     * always use that heuristic using TaskParallelSettings.min_iter_per_thread as basis? */
+    chunk_size = 32 * num_tasks_factor;
+
+    /* Basic heuristic to avoid threading on low amount of items.
+     * We could make that limit configurable in settings too. */
+    if (tot_items > 0 && tot_items < max_ii(256, chunk_size * 2)) {
+      chunk_size = tot_items;
     }
   }



More information about the Bf-blender-cvs mailing list