Spaces:
Runtime error
Runtime error
| // compute minimum and maximum values in a single reduction | |
| // minmax_pair stores the minimum and maximum | |
| // values that have been encountered so far | |
| template <typename T> | |
| struct minmax_pair | |
| { | |
| T min_val; | |
| T max_val; | |
| }; | |
| // minmax_unary_op is a functor that takes in a value x and | |
| // returns a minmax_pair whose minimum and maximum values | |
| // are initialized to x. | |
| template <typename T> | |
| struct minmax_unary_op | |
| : public thrust::unary_function< T, minmax_pair<T> > | |
| { | |
| __host__ __device__ | |
| minmax_pair<T> operator()(const T& x) const | |
| { | |
| minmax_pair<T> result; | |
| result.min_val = x; | |
| result.max_val = x; | |
| return result; | |
| } | |
| }; | |
| // minmax_binary_op is a functor that accepts two minmax_pair | |
| // structs and returns a new minmax_pair whose minimum and | |
| // maximum values are the min() and max() respectively of | |
| // the minimums and maximums of the input pairs | |
| template <typename T> | |
| struct minmax_binary_op | |
| : public thrust::binary_function< minmax_pair<T>, minmax_pair<T>, minmax_pair<T> > | |
| { | |
| __host__ __device__ | |
| minmax_pair<T> operator()(const minmax_pair<T>& x, const minmax_pair<T>& y) const | |
| { | |
| minmax_pair<T> result; | |
| result.min_val = thrust::min(x.min_val, y.min_val); | |
| result.max_val = thrust::max(x.max_val, y.max_val); | |
| return result; | |
| } | |
| }; | |
| int main(void) | |
| { | |
| // input size | |
| size_t N = 10; | |
| // initialize random number generator | |
| thrust::default_random_engine rng; | |
| thrust::uniform_int_distribution<int> dist(10, 99); | |
| // initialize data on host | |
| thrust::device_vector<int> data(N); | |
| for (size_t i = 0; i < data.size(); i++) | |
| data[i] = dist(rng); | |
| // setup arguments | |
| minmax_unary_op<int> unary_op; | |
| minmax_binary_op<int> binary_op; | |
| // initialize reduction with the first value | |
| minmax_pair<int> init = unary_op(data[0]); | |
| // compute minimum and maximum values | |
| minmax_pair<int> result = thrust::transform_reduce(data.begin(), data.end(), unary_op, init, binary_op); | |
| // print results | |
| std::cout << "[ "; | |
| for(size_t i = 0; i < N; i++) | |
| std::cout << data[i] << " "; | |
| std::cout << "]" << std::endl; | |
| std::cout << "minimum = " << result.min_val << std::endl; | |
| std::cout << "maximum = " << result.max_val << std::endl; | |
| return 0; | |
| } | |