BLI: wrap parallel_invoke from tbb
This commit is contained in:
parent
3f061ef050
commit
7c10e364b2
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue