diff options
Diffstat (limited to 'boost/compute/algorithm/random_shuffle.hpp')
-rw-r--r-- | boost/compute/algorithm/random_shuffle.hpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/boost/compute/algorithm/random_shuffle.hpp b/boost/compute/algorithm/random_shuffle.hpp index 8e020830a5..7405c17374 100644 --- a/boost/compute/algorithm/random_shuffle.hpp +++ b/boost/compute/algorithm/random_shuffle.hpp @@ -14,6 +14,11 @@ #include <vector> #include <algorithm> +#ifdef BOOST_COMPUTE_USE_CPP11 +#include <random> +#endif + +#include <boost/static_assert.hpp> #include <boost/range/algorithm_ext/iota.hpp> #include <boost/compute/system.hpp> @@ -22,6 +27,7 @@ #include <boost/compute/container/vector.hpp> #include <boost/compute/algorithm/scatter.hpp> #include <boost/compute/detail/iterator_range_size.hpp> +#include <boost/compute/type_traits/is_device_iterator.hpp> namespace boost { namespace compute { @@ -36,6 +42,7 @@ inline void random_shuffle(Iterator first, Iterator last, command_queue &queue = system::default_queue()) { + BOOST_STATIC_ASSERT(is_device_iterator<Iterator>::value); typedef typename std::iterator_traits<Iterator>::value_type value_type; size_t count = detail::iterator_range_size(first, last); @@ -46,7 +53,13 @@ inline void random_shuffle(Iterator first, // generate shuffled indices on the host std::vector<cl_uint> random_indices(count); boost::iota(random_indices, 0); +#ifdef BOOST_COMPUTE_USE_CPP11 + std::random_device nondeterministic_randomness; + std::default_random_engine random_engine(nondeterministic_randomness()); + std::shuffle(random_indices.begin(), random_indices.end(), random_engine); +#else std::random_shuffle(random_indices.begin(), random_indices.end()); +#endif // copy random indices to the device const context &context = queue.get_context(); |