[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
This commit is contained in:
78
cccl_upstream/thrust/examples/remove_points2d.cu
Normal file
78
cccl_upstream/thrust/examples/remove_points2d.cu
Normal file
@@ -0,0 +1,78 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user