MCPcopy Create free account
hub / github.com/boostorg/compute / find_end_helper

Function find_end_helper

include/boost/compute/algorithm/find_end.hpp:36–79  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

34///
35template<class InputIterator, class UnaryPredicate>
36inline InputIterator find_end_helper(InputIterator first,
37 InputIterator last,
38 UnaryPredicate predicate,
39 command_queue &queue)
40{
41 typedef typename std::iterator_traits<InputIterator>::value_type value_type;
42 typedef typename std::iterator_traits<InputIterator>::difference_type difference_type;
43
44 size_t count = detail::iterator_range_size(first, last);
45 if(count == 0){
46 return last;
47 }
48
49 const context &context = queue.get_context();
50
51 detail::meta_kernel k("find_end");
52 size_t index_arg = k.add_arg<int *>(memory_object::global_memory, "index");
53 atomic_max<int_> atomic_max_int;
54
55 k << k.decl<const int_>("i") << " = get_global_id(0);\n"
56 << k.decl<const value_type>("value") << "="
57 << first[k.var<const int_>("i")] << ";\n"
58 << "if(" << predicate(k.var<const value_type>("value")) << "){\n"
59 << " " << atomic_max_int(k.var<int_ *>("index"), k.var<int_>("i")) << ";\n"
60 << "}\n";
61
62 kernel kernel = k.compile(context);
63
64 scalar<int_> index(context);
65 kernel.set_arg(index_arg, index.get_buffer());
66
67 index.write(static_cast<int_>(-1), queue);
68
69 queue.enqueue_1d_range_kernel(kernel, 0, count, 0);
70
71 int result = static_cast<int>(index.read(queue));
72
73 if(result == -1){
74 return last;
75 }
76 else {
77 return first + static_cast<difference_type>(result);
78 }
79}
80
81} // end detail namespace
82

Callers 1

find_endFunction · 0.85

Calls 7

iterator_range_sizeFunction · 0.85
get_contextMethod · 0.45
compileMethod · 0.45
set_argMethod · 0.45
writeMethod · 0.45
readMethod · 0.45

Tested by

no test coverage detected