| | #include <thrust/host_vector.h> |
| | #include <thrust/remove.h> |
| | #include <thrust/random.h> |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | template <typename T> |
| | struct is_outside_circle |
| | { |
| | template <typename Tuple> |
| | inline __host__ __device__ |
| | bool operator()(const Tuple& tuple) const |
| | { |
| | |
| | const T x = thrust::get<0>(tuple); |
| | const T y = thrust::get<1>(tuple); |
| |
|
| | if (x*x + y*y > 1) |
| | return true; |
| | else |
| | return false; |
| | } |
| | }; |
| |
|
| | int main(void) |
| | { |
| | const size_t N = 20; |
| |
|
| | |
| | thrust::default_random_engine rng; |
| | thrust::uniform_real_distribution<float> u01(0.0f, 1.0f); |
| | thrust::host_vector<float> x(N); |
| | thrust::host_vector<float> y(N); |
| | for(size_t i = 0; i < N; i++) |
| | { |
| | x[i] = u01(rng); |
| | y[i] = u01(rng); |
| | } |
| |
|
| | |
| | std::cout << std::fixed; |
| | std::cout << "Generated " << N << " points" << std::endl; |
| | for(size_t i = 0; i < N; i++) |
| | std::cout << "(" << x[i] << "," << y[i] << ")" << std::endl; |
| | std::cout << std::endl; |
| |
|
| | |
| | size_t new_size = thrust::remove_if(thrust::make_zip_iterator(thrust::make_tuple(x.begin(), y.begin())), |
| | thrust::make_zip_iterator(thrust::make_tuple(x.end(), y.end())), |
| | is_outside_circle<float>()) |
| | - thrust::make_zip_iterator(thrust::make_tuple(x.begin(), y.begin())); |
| |
|
| | |
| | x.resize(new_size); |
| | y.resize(new_size); |
| |
|
| | |
| | std::cout << "After stream compaction, " << new_size << " points remain" << std::endl; |
| | for(size_t i = 0; i < new_size; i++) |
| | std::cout << "(" << x[i] << "," << y[i] << ")" << std::endl; |
| |
|
| | return 0; |
| | } |
| |
|
| |
|