[Bf-blender-cvs] [d71543bf60f] functions: new utility to process a range with multiple threads
Jacques Lucke
noreply at git.blender.org
Mon Jul 8 17:56:53 CEST 2019
Commit: d71543bf60f907d07d737ca519f358d4a6df5e77
Author: Jacques Lucke
Date: Mon Jul 8 12:42:35 2019 +0200
Branches: functions
https://developer.blender.org/rBd71543bf60f907d07d737ca519f358d4a6df5e77
new utility to process a range with multiple threads
===================================================================
M source/blender/blenlib/BLI_task.hpp
===================================================================
diff --git a/source/blender/blenlib/BLI_task.hpp b/source/blender/blenlib/BLI_task.hpp
index e872c237b7d..9854dbb1592 100644
--- a/source/blender/blenlib/BLI_task.hpp
+++ b/source/blender/blenlib/BLI_task.hpp
@@ -5,6 +5,7 @@
#include "BLI_task.h"
#include "BLI_array_ref.hpp"
#include "BLI_small_map.hpp"
+#include "BLI_range.hpp"
namespace BLI {
namespace Task {
@@ -18,7 +19,7 @@ namespace Task {
template<typename T, typename ProcessElement>
static void parallel_array_elements(ArrayRef<T> array,
ProcessElement process_element,
- bool use_threading = false)
+ bool use_threading = true)
{
if (!use_threading) {
for (T &element : array) {
@@ -54,7 +55,7 @@ static void parallel_array_elements(ArrayRef<T> array,
ProcessElement process_element,
CreateThreadLocal create_thread_local,
FreeThreadLocal free_thread_local,
- bool use_threading = false)
+ bool use_threading = true)
{
using LocalData = decltype(create_thread_local());
@@ -106,5 +107,37 @@ static void parallel_array_elements(ArrayRef<T> array,
}
}
+template<typename ProcessRange>
+static void parallel_range(Range<uint> total_range,
+ uint chunk_size,
+ ProcessRange process_range,
+ bool use_threading = true)
+{
+ if (!use_threading) {
+ process_range(total_range);
+ return;
+ }
+
+ ParallelRangeSettings settings = {0};
+ BLI_parallel_range_settings_defaults(&settings);
+
+ struct ParallelData {
+ ChunkedRange<uint> chunks;
+ ProcessRange &process_range;
+ } data = {ChunkedRange<uint>(total_range, chunk_size), process_range};
+
+ BLI_task_parallel_range(0,
+ data.chunks.chunks(),
+ (void *)&data,
+ [](void *__restrict userdata,
+ const int index,
+ const ParallelRangeTLS *__restrict UNUSED(tls)) {
+ ParallelData &data = *(ParallelData *)userdata;
+ Range<uint> range = data.chunks.chunk_range(index);
+ data.process_range(range);
+ },
+ &settings);
+}
+
} // namespace Task
} // namespace BLI
More information about the Bf-blender-cvs
mailing list