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
48 lines
1.6 KiB
Plaintext
48 lines
1.6 KiB
Plaintext
#include <thrust/detail/trivial_sequence.h>
|
|
#include <thrust/iterator/zip_iterator.h>
|
|
#include <thrust/type_traits/is_contiguous_iterator.h>
|
|
|
|
#include <unittest/unittest.h>
|
|
|
|
template <typename Iterator>
|
|
void test(Iterator first, Iterator last)
|
|
{
|
|
using System = typename thrust::iterator_system<Iterator>::type;
|
|
System system;
|
|
thrust::detail::trivial_sequence<Iterator, System> ts(system, first, last);
|
|
using ValueType = typename ::cuda::std::iterator_traits<Iterator>::value_type;
|
|
|
|
ASSERT_EQUAL_QUIET((ValueType) ts.begin()[0], ValueType(0, 11));
|
|
ASSERT_EQUAL_QUIET((ValueType) ts.begin()[1], ValueType(2, 11));
|
|
ASSERT_EQUAL_QUIET((ValueType) ts.begin()[2], ValueType(1, 13));
|
|
ASSERT_EQUAL_QUIET((ValueType) ts.begin()[3], ValueType(0, 10));
|
|
ASSERT_EQUAL_QUIET((ValueType) ts.begin()[4], ValueType(1, 12));
|
|
|
|
ts.begin()[0] = ValueType(0, 0);
|
|
ts.begin()[1] = ValueType(0, 0);
|
|
ts.begin()[2] = ValueType(0, 0);
|
|
ts.begin()[3] = ValueType(0, 0);
|
|
ts.begin()[4] = ValueType(0, 0);
|
|
|
|
using TrivialIterator = typename thrust::detail::trivial_sequence<Iterator, System>::iterator_type;
|
|
|
|
ASSERT_EQUAL(thrust::is_contiguous_iterator_v<Iterator>, false);
|
|
ASSERT_EQUAL(thrust::is_contiguous_iterator_v<TrivialIterator>, true);
|
|
}
|
|
|
|
template <class Vector>
|
|
void TestTrivialSequence()
|
|
{
|
|
Vector A{0, 2, 1, 0, 1};
|
|
Vector B{11, 11, 13, 10, 12};
|
|
|
|
test(thrust::make_zip_iterator(A.begin(), B.begin()), thrust::make_zip_iterator(A.end(), B.end()));
|
|
|
|
Vector refA{0, 2, 1, 0, 1};
|
|
ASSERT_EQUAL(A, refA);
|
|
// ensure that values weren't modified
|
|
Vector refB{11, 11, 13, 10, 12};
|
|
ASSERT_EQUAL(B, refB);
|
|
}
|
|
DECLARE_VECTOR_UNITTEST(TestTrivialSequence);
|