Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2022-02-09 15:08:04 +0300
committerJacques Lucke <jacques@blender.org>2022-02-09 15:08:04 +0300
commit7c10e364b2358f08fa49ce35fc98d4de1431e615 (patch)
tree0e5cf3a6845ad8229dc3ce9988e16b0caa29b460 /source/blender/blenlib
parent3f061ef050ccb671f9c4c9b65a17f0d097e24344 (diff)
BLI: wrap parallel_invoke from tbb
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_task.hh14
-rw-r--r--source/blender/blenlib/tests/BLI_task_test.cc14
2 files changed, 28 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_task.hh b/source/blender/blenlib/BLI_task.hh
index 84d5cd39bb4..8f75aa19cfe 100644
--- a/source/blender/blenlib/BLI_task.hh
+++ b/source/blender/blenlib/BLI_task.hh
@@ -31,6 +31,7 @@
# include <tbb/blocked_range.h>
# include <tbb/parallel_for.h>
# include <tbb/parallel_for_each.h>
+# include <tbb/parallel_invoke.h>
# include <tbb/parallel_reduce.h>
# include <tbb/task_arena.h>
# ifdef WIN32
@@ -103,6 +104,19 @@ Value parallel_reduce(IndexRange range,
#endif
}
+/**
+ * Execute all of the provided functions. The functions might be executed in parallel or in serial
+ * or some combination of both.
+ */
+template<typename... Functions> void parallel_invoke(Functions &&...functions)
+{
+#ifdef WITH_TBB
+ tbb::parallel_invoke(std::forward<Functions>(functions)...);
+#else
+ (functions(), ...);
+#endif
+}
+
/** See #BLI_task_isolate for a description of what isolating a task means. */
template<typename Function> void isolate_task(const Function &function)
{
diff --git a/source/blender/blenlib/tests/BLI_task_test.cc b/source/blender/blenlib/tests/BLI_task_test.cc
index 3bb6f6f753c..1ed732c1f18 100644
--- a/source/blender/blenlib/tests/BLI_task_test.cc
+++ b/source/blender/blenlib/tests/BLI_task_test.cc
@@ -1,6 +1,7 @@
/* Apache License, Version 2.0 */
#include "testing/testing.h"
+#include <atomic>
#include <cstring>
#include "atomic_ops.h"
@@ -12,6 +13,7 @@
#include "BLI_listbase.h"
#include "BLI_mempool.h"
#include "BLI_task.h"
+#include "BLI_task.hh"
#define NUM_ITEMS 10000
@@ -280,3 +282,15 @@ TEST(task, ListBaseIter)
MEM_freeN(items_buffer);
BLI_threadapi_exit();
}
+
+TEST(task, ParallelInvoke)
+{
+ std::atomic<int> counter = 0;
+ blender::threading::parallel_invoke([&]() { counter++; },
+ [&]() { counter++; },
+ [&]() { counter++; },
+ [&]() { counter++; },
+ [&]() { counter++; },
+ [&]() { counter++; });
+ EXPECT_EQ(counter, 6);
+}