summaryrefslogtreecommitdiff
path: root/thirdparty/embree/common/algorithms/parallel_any_of.h
blob: a64e4a18895e2edf9e60711533759362ce9aa4d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include <functional>
#include "parallel_reduce.h"

namespace embree
{
  
  template<typename Index, class UnaryPredicate>
    __forceinline bool parallel_any_of (Index first, Index last, UnaryPredicate pred)
  {
    bool ret = false;
    
#if defined(TASKING_TBB)
#if TBB_INTERFACE_VERSION >= 12002
    tbb::task_group_context context;
    tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred,&context](const tbb::blocked_range<size_t>& r) {
        if (context.is_group_execution_cancelled()) return;
        for (size_t i = r.begin(); i != r.end(); ++i) {
          if (pred(i)) {
            ret = true;
            context.cancel_group_execution();
          }
        }
      });
#else
    tbb::parallel_for(tbb::blocked_range<size_t>{first, last}, [&ret,pred](const tbb::blocked_range<size_t>& r) {
        if (tbb::task::self().is_cancelled()) return;
        for (size_t i = r.begin(); i != r.end(); ++i) {
          if (pred(i)) {
            ret = true;
            tbb::task::self().cancel_group_execution();
          }
        }
      });
#endif
#else
    ret = parallel_reduce (first, last, false, [pred](const range<size_t>& r)->bool {
        bool localret = false;
        for (auto i=r.begin(); i<r.end(); ++i) {
          localret |= pred(i);
        }
        return localret;
      },
      std::bit_or<bool>()
      );
#endif
    
    return ret;
  }
  
} // end namespace