BLI: wrap parallel_invoke from tbb

This commit is contained in:
Jacques Lucke 2022-02-09 13:08:04 +01:00
parent 3f061ef050
commit 7c10e364b2
2 changed files with 28 additions and 0 deletions

View File

@ -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)
{

View File

@ -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);
}