diff options
Diffstat (limited to 'boost/compute/algorithm/detail/find_extrema.hpp')
-rw-r--r-- | boost/compute/algorithm/detail/find_extrema.hpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/boost/compute/algorithm/detail/find_extrema.hpp b/boost/compute/algorithm/detail/find_extrema.hpp new file mode 100644 index 0000000000..6e756c3904 --- /dev/null +++ b/boost/compute/algorithm/detail/find_extrema.hpp @@ -0,0 +1,64 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com> +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// +// See http://boostorg.github.com/compute for more information. +//---------------------------------------------------------------------------// + +#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_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); + + // handle trivial cases + if(count == 0 || count == 1){ + return first; + } + + const device &device = queue.get_device(); + + // use serial method for small inputs + // and when device is a CPU + if(count < 512 || (device.type() & device::cpu)){ + return serial_find_extrema(first, last, compare, find_minimum, queue); + } + + // find_extrema_with_reduce() is used only if requirements are met + if(find_extrema_with_reduce_requirements_met(first, last, queue)) + { + return find_extrema_with_reduce(first, last, compare, find_minimum, queue); + } + + // use serial method for OpenCL version 1.0 due to + // problems with atomic_cmpxchg() + #ifndef 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); +} + +} // end detail namespace +} // end compute namespace +} // end boost namespace + +#endif // BOOST_COMPUTE_ALGORITHM_DETAIL_FIND_EXTREMA_HPP |