diff options
Diffstat (limited to 'src/boost/libs/compute/test/test_inplace_reduce.cpp')
-rw-r--r-- | src/boost/libs/compute/test/test_inplace_reduce.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/boost/libs/compute/test/test_inplace_reduce.cpp b/src/boost/libs/compute/test/test_inplace_reduce.cpp new file mode 100644 index 00000000..a0706e3a --- /dev/null +++ b/src/boost/libs/compute/test/test_inplace_reduce.cpp @@ -0,0 +1,138 @@ +//---------------------------------------------------------------------------// +// 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. +//---------------------------------------------------------------------------// + +#define BOOST_TEST_MODULE TestInplaceReduce +#include <boost/test/unit_test.hpp> + +#include <iostream> + +#include <boost/compute/system.hpp> +#include <boost/compute/functional.hpp> +#include <boost/compute/algorithm/iota.hpp> +#include <boost/compute/algorithm/detail/inplace_reduce.hpp> +#include <boost/compute/container/vector.hpp> + +#include "quirks.hpp" +#include "context_setup.hpp" + +BOOST_AUTO_TEST_CASE(sum_int) +{ + if(is_apple_cpu_device(device)) { + std::cerr + << "skipping all inplace_reduce tests due to Apple platform" + << " behavior when local memory is used on a CPU device" + << std::endl; + return; + } + + int data[] = { 1, 5, 3, 4, 9, 3, 5, 3 }; + boost::compute::vector<int> vector(data, data + 8, queue); + + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(33)); + + vector.assign(data, data + 8); + vector.push_back(3); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(36)); +} + +BOOST_AUTO_TEST_CASE(multiply_int) +{ + if(is_apple_cpu_device(device)) { + return; + } + + int data[] = { 1, 5, 3, 4, 9, 3, 5, 3 }; + boost::compute::vector<int> vector(data, data + 8, queue); + + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::multiplies<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(24300)); + + vector.assign(data, data + 8); + vector.push_back(3); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::multiplies<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(72900)); +} + +BOOST_AUTO_TEST_CASE(reduce_iota) +{ + if(is_apple_cpu_device(device)) { + return; + } + + // 1 value + boost::compute::vector<int> vector(1, context); + boost::compute::iota(vector.begin(), vector.end(), int(0), queue); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(0)); + + // 1000 values + vector.resize(1000); + boost::compute::iota(vector.begin(), vector.end(), int(0), queue); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(499500)); + + // 2499 values + vector.resize(2499); + boost::compute::iota(vector.begin(), vector.end(), int(0), queue); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(3121251)); + + // 4096 values + vector.resize(4096); + boost::compute::iota(vector.begin(), vector.end(), int(0), queue); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(8386560)); + + // 5000 values + vector.resize(5000); + boost::compute::iota(vector.begin(), vector.end(), int(0), queue); + boost::compute::detail::inplace_reduce(vector.begin(), + vector.end(), + boost::compute::plus<int>(), + queue); + queue.finish(); + BOOST_CHECK_EQUAL(int(vector[0]), int(12497500)); +} + +BOOST_AUTO_TEST_SUITE_END() |