Files
project_6/cccl_upstream/thrust/testing/is_contiguous_iterator.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

128 lines
6.7 KiB
Plaintext

#include <thrust/detail/static_assert.h>
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/type_traits/is_contiguous_iterator.h>
#include <thrust/type_traits/unwrap_contiguous_iterator.h>
#include <array>
#include <deque>
#include <iterator>
#include <list>
#include <map>
#include <set>
#include <string>
#include <string_view>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <unittest/unittest.h>
static_assert(thrust::is_contiguous_iterator_v<std::string::iterator>);
static_assert(thrust::is_contiguous_iterator_v<std::wstring::iterator>);
static_assert(thrust::is_contiguous_iterator_v<std::string_view::iterator>);
static_assert(thrust::is_contiguous_iterator_v<std::wstring_view::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator>);
template <typename T>
_CCCL_HOST void test_is_contiguous_iterator()
{
static_assert(thrust::is_contiguous_iterator_v<T*>);
static_assert(thrust::is_contiguous_iterator_v<T const*>);
static_assert(thrust::is_contiguous_iterator_v<thrust::device_ptr<T>>);
static_assert(thrust::is_contiguous_iterator_v<typename std::vector<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::vector<T>::reverse_iterator>);
static_assert(thrust::is_contiguous_iterator_v<typename std::array<T, 1>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::list<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::deque<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::set<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::multiset<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::map<T, T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::multimap<T, T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::unordered_set<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::unordered_multiset<T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::unordered_map<T, T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<typename std::unordered_multimap<T, T>::iterator>);
static_assert(!thrust::is_contiguous_iterator_v<std::istream_iterator<T>>);
static_assert(!thrust::is_contiguous_iterator_v<std::ostream_iterator<T>>);
}
DECLARE_GENERIC_UNITTEST(test_is_contiguous_iterator);
template <typename T>
_CCCL_HOST void test_is_contiguous_iterator_cvref()
{
static_assert(thrust::is_contiguous_iterator_v<T* const>);
static_assert(thrust::is_contiguous_iterator_v<T* volatile>);
static_assert(thrust::is_contiguous_iterator_v<T*&>);
static_assert(thrust::is_contiguous_iterator_v<T* const&>);
static_assert(thrust::is_contiguous_iterator_v<T* volatile&>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator const>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator volatile>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator&>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator const&>);
static_assert(!thrust::is_contiguous_iterator_v<std::vector<bool>::iterator volatile&>);
}
DECLARE_GENERIC_UNITTEST(test_is_contiguous_iterator_cvref);
template <typename Vector>
_CCCL_HOST void test_is_contiguous_iterator_vectors()
{
static_assert(thrust::is_contiguous_iterator_v<typename Vector::iterator>);
}
DECLARE_VECTOR_UNITTEST(test_is_contiguous_iterator_vectors);
struct expect_pointer
{};
struct expect_passthrough
{};
template <typename IteratorT, typename PointerT, typename expected_unwrapped_type /* = expect_[pointer|passthrough] */>
struct check_unwrapped_iterator
{
using unwrapped_t =
::cuda::std::remove_reference_t<decltype(thrust::try_unwrap_contiguous_iterator(cuda::std::declval<IteratorT>()))>;
static constexpr bool value =
std::is_same_v<expected_unwrapped_type, expect_pointer>
? std::is_same_v<unwrapped_t, PointerT>
: std::is_same_v<unwrapped_t, IteratorT>;
};
template <typename T>
void test_try_unwrap_contiguous_iterator()
{
// Raw pointers should pass whether expecting pointers or passthrough.
static_assert(check_unwrapped_iterator<T*, T*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<T*, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<T const*, T const*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<T const*, T const*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<thrust::device_ptr<T>, T*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<thrust::device_ptr<T const>, T const*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<typename std::vector<T>::iterator, T*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<typename std::vector<T>::reverse_iterator, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::array<T, 1>::iterator, T*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<typename std::array<T const, 1>::iterator, T const*, expect_pointer>::value);
static_assert(check_unwrapped_iterator<typename std::list<T>::iterator, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::deque<T>::iterator, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::set<T>::iterator, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::multiset<T>::iterator, T*, expect_passthrough>::value);
static_assert(
check_unwrapped_iterator<typename std::map<T, T>::iterator, std::pair<T const, T>*, expect_passthrough>::value);
static_assert(
check_unwrapped_iterator<typename std::multimap<T, T>::iterator, std::pair<T const, T>*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::unordered_set<T>::iterator, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<typename std::unordered_multiset<T>::iterator, T*, expect_passthrough>::value);
static_assert(
check_unwrapped_iterator<typename std::unordered_map<T, T>::iterator, std::pair<T const, T>*, expect_passthrough>::
value);
static_assert(check_unwrapped_iterator<typename std::unordered_multimap<T, T>::iterator,
std::pair<T const, T>*,
expect_passthrough>::value);
static_assert(check_unwrapped_iterator<std::istream_iterator<T>, T*, expect_passthrough>::value);
static_assert(check_unwrapped_iterator<std::ostream_iterator<T>, void, expect_passthrough>::value);
}
DECLARE_GENERIC_UNITTEST(test_try_unwrap_contiguous_iterator);