1 //---------------------------------------------------------------------------// 2 // Copyright (c) 2015 Jakub Pola <jakub.pola@gmail.com> 3 // 4 // Distributed under the Boost Software License, Version 1.0 5 // See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt 7 // 8 // See http://boostorg.github.com/compute for more information. 9 //---------------------------------------------------------------------------// 10 11 #define BOOST_TEST_MODULE TestScatterIf 12 #include <boost/test/unit_test.hpp> 13 14 #include <boost/compute/system.hpp> 15 #include <boost/compute/algorithm/scatter_if.hpp> 16 #include <boost/compute/container/vector.hpp> 17 #include <boost/compute/iterator/constant_buffer_iterator.hpp> 18 #include <boost/compute/iterator/counting_iterator.hpp> 19 #include <boost/compute/functional.hpp> 20 #include "check_macros.hpp" 21 #include "context_setup.hpp" 22 23 namespace bc = boost::compute; 24 BOOST_AUTO_TEST_CASE(scatter_if_int)25 BOOST_AUTO_TEST_CASE(scatter_if_int) 26 { 27 int input_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 28 bc::vector<int> input(input_data, input_data + 10, queue); 29 30 int map_data[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 31 32 bc::vector<int> map(map_data, map_data + 10, queue); 33 34 int stencil_data[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; 35 36 bc::vector<bc::uint_> stencil(stencil_data, stencil_data + 10, queue); 37 38 bc::vector<int> output(input.size(), -1, queue); 39 40 bc::scatter_if(input.begin(), input.end(), 41 map.begin(), stencil.begin(), 42 output.begin(), 43 queue); 44 45 CHECK_RANGE_EQUAL(int, 10, output, (9, -1, 7, -1, 5, -1, 3, -1, 1, -1) ); 46 } 47 BOOST_AUTO_TEST_CASE(scatter_if_constant_indices)48 BOOST_AUTO_TEST_CASE(scatter_if_constant_indices) 49 { 50 int input_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 51 bc::vector<int> input(input_data, input_data + 10, queue); 52 53 int map_data[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 54 bc::buffer map_buffer(context, 55 10 * sizeof(int), 56 bc::buffer::read_only | bc::buffer::use_host_ptr, 57 map_data); 58 59 int stencil_data[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; 60 bc::buffer stencil_buffer(context, 61 10 * sizeof(bc::uint_), 62 bc::buffer::read_only | bc::buffer::use_host_ptr, 63 stencil_data); 64 65 bc::vector<int> output(input.size(), -1, queue); 66 67 bc::scatter_if(input.begin(), 68 input.end(), 69 bc::make_constant_buffer_iterator<int>(map_buffer, 0), 70 bc::make_constant_buffer_iterator<int>(stencil_buffer, 0), 71 output.begin(), 72 queue); 73 74 CHECK_RANGE_EQUAL(int, 10, output, (9, -1, 7, -1, 5, -1, 3, -1, 1, -1) ); 75 } 76 77 BOOST_AUTO_TEST_CASE(scatter_if_function)78 BOOST_AUTO_TEST_CASE(scatter_if_function) 79 { 80 int input_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 81 bc::vector<int> input(input_data, input_data + 10, queue); 82 83 int map_data[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 84 bc::vector<int> map(map_data, map_data + 10, queue); 85 86 int stencil_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 87 bc::vector<bc::uint_> stencil(stencil_data, stencil_data + 10, queue); 88 89 bc::vector<int> output(input.size(), -1, queue); 90 91 BOOST_COMPUTE_FUNCTION(int, gt_than_5, (int x), 92 { 93 if (x > 5) 94 return true; 95 else 96 return false; 97 }); 98 99 bc::scatter_if(input.begin(), 100 input.end(), 101 map.begin(), 102 stencil.begin(), 103 output.begin(), 104 gt_than_5, 105 queue); 106 107 CHECK_RANGE_EQUAL(int, 10, output, (9, 8, 7, 6, -1, -1, -1, -1, -1, -1) ); 108 } 109 110 BOOST_AUTO_TEST_CASE(scatter_if_counting_iterator)111 BOOST_AUTO_TEST_CASE(scatter_if_counting_iterator) 112 { 113 int input_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 114 bc::vector<int> input(input_data, input_data + 10, queue); 115 116 int map_data[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 117 bc::vector<int> map(map_data, map_data + 10, queue); 118 119 bc::vector<int> output(input.size(), -1, queue); 120 121 BOOST_COMPUTE_FUNCTION(int, gt_than_5, (int x), 122 { 123 if (x > 5) 124 return true; 125 else 126 return false; 127 }); 128 129 bc::scatter_if(input.begin(), 130 input.end(), 131 map.begin(), 132 bc::make_counting_iterator<int>(0), 133 output.begin(), 134 gt_than_5, 135 queue); 136 137 CHECK_RANGE_EQUAL(int, 10, output, (9, 8, 7, 6, -1, -1, -1, -1, -1, -1) ); 138 139 } 140 141 BOOST_AUTO_TEST_SUITE_END() 142