File: parallel_any_of.h

package info (click to toggle)
embree 4.3.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 100,656 kB
  • sloc: cpp: 228,918; xml: 40,944; ansic: 2,685; python: 812; sh: 635; makefile: 228; csh: 42
file content (56 lines) | stat: -rw-r--r-- 1,529 bytes parent folder | download | duplicates (2)
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
56
// 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)
  {
    std::atomic_bool ret;
    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