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
47 lines
1.3 KiB
Plaintext
47 lines
1.3 KiB
Plaintext
#include <thrust/device_vector.h>
|
|
#include <thrust/functional.h>
|
|
#include <thrust/host_vector.h>
|
|
#include <thrust/transform_reduce.h>
|
|
|
|
#include <cmath>
|
|
#include <iostream>
|
|
|
|
// This example computes the norm [1] of a vector. The norm is
|
|
// computed by squaring all numbers in the vector, summing the
|
|
// squares, and taking the square root of the sum of squares. In
|
|
// Thrust this operation is efficiently implemented with the
|
|
// transform_reduce() algorithm. Specifically, we first transform
|
|
// x -> x^2 and the compute a standard plus reduction. Since there
|
|
// is no built-in functor for squaring numbers, we define our own
|
|
// square functor.
|
|
//
|
|
// [1] http://en.wikipedia.org/wiki/Norm_(mathematics)#Euclidean_norm
|
|
|
|
// square<T> computes the square of a number f(x) -> x*x
|
|
template <typename T>
|
|
struct square
|
|
{
|
|
__host__ __device__ T operator()(const T& x) const
|
|
{
|
|
return x * x;
|
|
}
|
|
};
|
|
|
|
int main()
|
|
{
|
|
// initialize device vector directly
|
|
thrust::device_vector<float> d_x = {1.0, 2.0, 3.0, 4.0};
|
|
|
|
// setup arguments
|
|
square<float> unary_op;
|
|
cuda::std::plus<float> binary_op;
|
|
float init = 0;
|
|
|
|
// compute norm
|
|
float norm = std::sqrt(thrust::transform_reduce(d_x.begin(), d_x.end(), unary_op, init, binary_op));
|
|
|
|
std::cout << "norm is " << norm << '\n';
|
|
|
|
return 0;
|
|
}
|