| | #include <thrust/device_vector.h> |
| | #include <thrust/sequence.h> |
| | #include <thrust/copy.h> |
| | #include <thrust/count.h> |
| | #include <thrust/remove.h> |
| | #include <iostream> |
| | #include <iterator> |
| | #include <string> |
| |
|
| | |
| | template <typename T> |
| | struct is_odd : public thrust::unary_function<T,bool> |
| | { |
| | __host__ __device__ |
| | bool operator()(T x) |
| | { |
| | return x % 2; |
| | } |
| | }; |
| |
|
| |
|
| | template <typename Iterator> |
| | void print_range(const std::string& name, Iterator first, Iterator last) |
| | { |
| | typedef typename std::iterator_traits<Iterator>::value_type T; |
| |
|
| | std::cout << name << ": "; |
| | thrust::copy(first, last, std::ostream_iterator<T>(std::cout, " ")); |
| | std::cout << "\n"; |
| | } |
| |
|
| | int main(void) |
| | { |
| | |
| | size_t N = 10; |
| |
|
| | |
| | typedef thrust::device_vector<int> Vector; |
| | typedef Vector::iterator Iterator; |
| |
|
| | |
| | Vector values(N); |
| |
|
| | |
| | thrust::sequence(values.begin(), values.end()); |
| | |
| | print_range("values", values.begin(), values.end()); |
| |
|
| | |
| | Vector output(values.size()); |
| |
|
| | |
| | Iterator output_end = thrust::copy_if(values.begin(), values.end(), output.begin(), is_odd<int>()); |
| |
|
| | print_range("output", output.begin(), output_end); |
| |
|
| | |
| | |
| | size_t N_odd = thrust::count_if(values.begin(), values.end(), is_odd<int>()); |
| | |
| | Vector small_output(N_odd); |
| | |
| | thrust::copy_if(values.begin(), values.end(), small_output.begin(), is_odd<int>()); |
| | |
| | print_range("small_output", small_output.begin(), small_output.end()); |
| |
|
| | |
| | Iterator values_end = thrust::remove_if(values.begin(), values.end(), is_odd<int>()); |
| |
|
| | |
| | values.resize(values_end - values.begin()); |
| |
|
| | print_range("values", values.begin(), values.end()); |
| |
|
| | return 0; |
| | } |
| |
|
| |
|