|
#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; |
|
} |
|
|
|
|