Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/common/algorithms/parallel_any_of.h
9912 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include <functional>
7
#include "parallel_reduce.h"
8
9
namespace embree
10
{
11
12
template<typename Index, class UnaryPredicate>
13
__forceinline bool parallel_any_of (Index first, Index last, UnaryPredicate pred)
14
{
15
std::atomic_bool ret;
16
ret = false;
17
18
#if defined(TASKING_TBB)
19
#if TBB_INTERFACE_VERSION >= 12002
20
tbb::task_group_context context;
21
tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred,&context](const tbb::blocked_range<size_t>& r) {
22
if (context.is_group_execution_cancelled()) return;
23
for (size_t i = r.begin(); i != r.end(); ++i) {
24
if (pred(i)) {
25
ret = true;
26
context.cancel_group_execution();
27
}
28
}
29
});
30
#else
31
tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred](const tbb::blocked_range<size_t>& r) {
32
if (tbb::task::self().is_cancelled()) return;
33
for (size_t i = r.begin(); i != r.end(); ++i) {
34
if (pred(i)) {
35
ret = true;
36
tbb::task::self().cancel_group_execution();
37
}
38
}
39
});
40
#endif
41
#else
42
ret = parallel_reduce (first, last, false, [pred](const range<size_t>& r)->bool {
43
bool localret = false;
44
for (auto i=r.begin(); i<r.end(); ++i) {
45
localret |= pred(i);
46
}
47
return localret;
48
},
49
std::bit_or<bool>()
50
);
51
#endif
52
53
return ret;
54
}
55
56
} // end namespace
57
58