12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #ifndef BOOST_COMPUTE_ALGORITHM_DETAIL_FIND_EXTREMA_HPP
- #define BOOST_COMPUTE_ALGORITHM_DETAIL_FIND_EXTREMA_HPP
- #include <boost/compute/detail/iterator_range_size.hpp>
- #include <boost/compute/algorithm/detail/find_extrema_on_cpu.hpp>
- #include <boost/compute/algorithm/detail/find_extrema_with_reduce.hpp>
- #include <boost/compute/algorithm/detail/find_extrema_with_atomics.hpp>
- #include <boost/compute/algorithm/detail/serial_find_extrema.hpp>
- namespace boost {
- namespace compute {
- namespace detail {
- template<class InputIterator, class Compare>
- inline InputIterator find_extrema(InputIterator first,
- InputIterator last,
- Compare compare,
- const bool find_minimum,
- command_queue &queue)
- {
- size_t count = iterator_range_size(first, last);
-
- if(count == 0 || count == 1){
- return first;
- }
- const device &device = queue.get_device();
-
- if(device.type() & device::cpu) {
- return find_extrema_on_cpu(first, last, compare, find_minimum, queue);
- }
-
-
- if(count < 512)
- {
- return serial_find_extrema(first, last, compare, find_minimum, queue);
- }
-
- if(find_extrema_with_reduce_requirements_met(first, last, queue))
- {
- return find_extrema_with_reduce(first, last, compare, find_minimum, queue);
- }
-
-
- #ifndef BOOST_COMPUTE_CL_VERSION_1_1
- return serial_find_extrema(first, last, compare, find_minimum, queue);
- #endif
- return find_extrema_with_atomics(first, last, compare, find_minimum, queue);
- }
- }
- }
- }
- #endif
|