Files
project_6/cccl_upstream/thrust/examples/remove_points2d.cu
EngineX CI 56fd68e7dd [INFRA] Import NVIDIA/CCCL upstream as optimization reference library
CCCL (CUDA C++ Core Libraries) provides:
- CUB: device/block/warp-level GPU primitives (reduce, scan, sort, topk)
- Thrust: high-level parallel algorithms (transform_reduce, sort, scan)
- libcudacxx: CUDA C++ standard library (atomics, barriers, memory)
- cudax: experimental features (memory resources, allocators)
- Tuning policies: per-SM hardware-specific algorithm parameters

Competition optimization vectors mapped to CCCL:
- Output TPS (83% weight): warp_reduce, block_reduce, device_topk
- Input TPS (14% weight): device_scan, block_load, prefetch
- Cache TPS (3% weight): prefix caching strategy patterns
- Memory (0.9 util): pooled/cached/buddy allocators

Source: https://github.com/NVIDIA/cccl (shallow clone, HEAD only)
License: Apache-2.0
2026-07-30 09:35:51 +00:00

79 lines
2.0 KiB
Plaintext

#include <thrust/host_vector.h>
#include <thrust/random.h>
#include <thrust/remove.h>
#include <iostream>
// This example generates random points in the
// unit square [0,1)x[0,1) and then removes all
// points where x^2 + y^2 > 1
//
// The x and y coordinates are stored in separate arrays
// and a zip_iterator is used to combine them together
template <typename T>
struct is_outside_circle
{
template <typename Tuple>
inline __host__ __device__ bool operator()(const Tuple& tuple) const
{
// unpack the tuple into x and y coordinates
const T x = cuda::std::get<0>(tuple);
const T y = cuda::std::get<1>(tuple);
if (x * x + y * y > 1)
{
return true;
}
else
{
return false;
}
}
};
int main()
{
const size_t N = 20;
// generate random points in the unit square on the host
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);
}
// print the initial points
std::cout << std::fixed;
std::cout << "Generated " << N << " points" << '\n';
for (size_t i = 0; i < x.size(); i++)
{
std::cout << "(" << x[i] << "," << y[i] << ")" << '\n';
}
std::cout << '\n';
// remove points where x^2 + y^2 > 1 and determine new array sizes
size_t new_size =
thrust::remove_if(thrust::make_zip_iterator(x.begin(), y.begin()),
thrust::make_zip_iterator(x.end(), y.end()),
is_outside_circle<float>())
- thrust::make_zip_iterator(x.begin(), y.begin());
// resize the vectors (note: this does not free any memory)
x.resize(new_size);
y.resize(new_size);
// print the filtered points
std::cout << "After stream compaction, " << new_size << " points remain" << '\n';
for (size_t i = 0; i < x.size(); i++)
{
std::cout << "(" << x[i] << "," << y[i] << ")" << '\n';
}
return 0;
}