Skip to content

Commit e62f191

Browse files
committed
Static assert on numeric_limits specialization
1 parent 1fbc895 commit e62f191

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

cub/cub/device/device_segmented_reduce.cuh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,8 @@ public:
10791079
using OffsetT = detail::common_iterator_value_t<BeginOffsetIteratorT, EndOffsetIteratorT>;
10801080
using InputT = detail::it_value_t<InputIteratorT>;
10811081
using init_t = InputT;
1082+
static_assert(::cuda::std::numeric_limits<init_t>::is_specialized,
1083+
"numeric_limits must be specialized for the input value type");
10821084
static_assert(::cuda::std::is_integral_v<OffsetT>, "Offset iterator value type should be integral.");
10831085
if constexpr (::cuda::std::is_integral_v<OffsetT>)
10841086
{
@@ -1194,6 +1196,9 @@ public:
11941196
using op_t = ::cuda::minimum<>;
11951197
using AccumT = ::cuda::std::__accumulator_t<op_t, cub::detail::it_value_t<InputIteratorT>, init_t>;
11961198

1199+
static_assert(::cuda::std::numeric_limits<init_t>::is_specialized,
1200+
"numeric_limits must be specialized for the input value type");
1201+
11971202
return segmented_reduce_impl<AccumT, OffsetT>(
11981203
d_in, d_out, num_segments, d_begin_offsets, d_end_offsets, op_t{}, ::cuda::std::numeric_limits<init_t>::max(), env);
11991204
}
@@ -1271,6 +1276,9 @@ public:
12711276
using offset_t = int;
12721277
using input_t = detail::it_value_t<InputIteratorT>;
12731278

1279+
static_assert(::cuda::std::numeric_limits<input_t>::is_specialized,
1280+
"numeric_limits must be specialized for the input value type");
1281+
12741282
return detail::reduce::
12751283
DispatchFixedSizeSegmentedReduce<InputIteratorT, OutputIteratorT, offset_t, ::cuda::minimum<>, input_t>::Dispatch(
12761284
d_temp_storage,
@@ -1349,6 +1357,9 @@ public:
13491357
static_assert(!::cuda::std::is_same_v<requested_determinism_t, ::cuda::execution::determinism::gpu_to_gpu_t>,
13501358
"gpu_to_gpu determinism is not supported for device segmented reductions ");
13511359

1360+
static_assert(::cuda::std::numeric_limits<input_t>::is_specialized,
1361+
"numeric_limits must be specialized for the input value type");
1362+
13521363
return detail::dispatch_with_env(
13531364
env, [&]([[maybe_unused]] auto tuning, void* d_temp_storage, size_t& temp_storage_bytes, cudaStream_t stream) {
13541365
return detail::reduce::
@@ -1484,6 +1495,8 @@ public:
14841495
using InitT = detail::reduce::empty_problem_init_t<OverrideAccumT>;
14851496

14861497
static_assert(::cuda::std::is_same_v<int, OutputKeyT>, "Output key type must be int.");
1498+
static_assert(::cuda::std::numeric_limits<InputValueT>::is_specialized,
1499+
"numeric_limits must be specialized for the input value type");
14871500

14881501
// Wrapped input iterator to produce index-value <OverrideOffsetT, InputT> tuples
14891502
using ArgIndexInputIteratorT = ArgIndexInputIterator<InputIteratorT, OverrideOffsetT, OutputValueT>;
@@ -1620,6 +1633,8 @@ public:
16201633
using InitT = detail::reduce::empty_problem_init_t<OverrideAccumT>;
16211634

16221635
static_assert(::cuda::std::is_same_v<int, OutputKeyT>, "Output key type must be int.");
1636+
static_assert(::cuda::std::numeric_limits<InputValueT>::is_specialized,
1637+
"numeric_limits must be specialized for the input value type");
16231638

16241639
// Wrapped input iterator to produce index-value <OverrideOffsetT, InputT> tuples
16251640
using ArgIndexInputIteratorT = ArgIndexInputIterator<InputIteratorT, OverrideOffsetT, OutputValueT>;
@@ -1718,6 +1733,8 @@ public:
17181733
using output_value_t = typename output_tuple_t::second_type;
17191734

17201735
static_assert(::cuda::std::is_same_v<int, output_key_t>, "Output key type must be int.");
1736+
static_assert(::cuda::std::numeric_limits<input_value_t>::is_specialized,
1737+
"numeric_limits must be specialized for the input value type");
17211738

17221739
// Wrapped input iterator to produce index-value <offset_t, InputT> tuples
17231740
auto d_indexed_in = THRUST_NS_QUALIFIER::make_transform_iterator(
@@ -1821,6 +1838,8 @@ public:
18211838
"gpu_to_gpu determinism is not supported for device segmented reductions ");
18221839

18231840
static_assert(::cuda::std::is_same_v<int, output_key_t>, "Output key type must be int.");
1841+
static_assert(::cuda::std::numeric_limits<input_value_t>::is_specialized,
1842+
"numeric_limits must be specialized for the input value type");
18241843

18251844
using arg_index_input_iterator_t =
18261845
THRUST_NS_QUALIFIER::transform_iterator<detail::reduce::generate_idx_value<InputIteratorT, output_value_t>,
@@ -1953,6 +1972,8 @@ public:
19531972
using InputT = cub::detail::it_value_t<InputIteratorT>;
19541973
using init_t = InputT;
19551974

1975+
static_assert(::cuda::std::numeric_limits<init_t>::is_specialized,
1976+
"numeric_limits must be specialized for the input value type");
19561977
static_assert(::cuda::std::is_integral_v<OffsetT>, "Offset iterator value type should be integral.");
19571978
if constexpr (::cuda::std::is_integral_v<OffsetT>)
19581979
{
@@ -2068,6 +2089,9 @@ public:
20682089
using op_t = ::cuda::maximum<>;
20692090
using AccumT = ::cuda::std::__accumulator_t<op_t, cub::detail::it_value_t<InputIteratorT>, init_t>;
20702091

2092+
static_assert(::cuda::std::numeric_limits<init_t>::is_specialized,
2093+
"numeric_limits must be specialized for the input value type");
2094+
20712095
return segmented_reduce_impl<AccumT, OffsetT>(
20722096
d_in,
20732097
d_out,
@@ -2146,6 +2170,9 @@ public:
21462170
using offset_t = int;
21472171
using input_t = detail::it_value_t<InputIteratorT>;
21482172

2173+
static_assert(::cuda::std::numeric_limits<input_t>::is_specialized,
2174+
"numeric_limits must be specialized for the input value type");
2175+
21492176
return detail::reduce::
21502177
DispatchFixedSizeSegmentedReduce<InputIteratorT, OutputIteratorT, offset_t, ::cuda::maximum<>, input_t>::Dispatch(
21512178
d_temp_storage,
@@ -2223,6 +2250,8 @@ public:
22232250

22242251
static_assert(!::cuda::std::is_same_v<requested_determinism_t, ::cuda::execution::determinism::gpu_to_gpu_t>,
22252252
"gpu_to_gpu determinism is not supported for device segmented reductions ");
2253+
static_assert(::cuda::std::numeric_limits<input_t>::is_specialized,
2254+
"numeric_limits must be specialized for the input value type");
22262255

22272256
return detail::dispatch_with_env(
22282257
env, [&]([[maybe_unused]] auto tuning, void* d_temp_storage, size_t& temp_storage_bytes, cudaStream_t stream) {
@@ -2362,6 +2391,8 @@ public:
23622391
using OutputValueT = typename OutputTupleT::Value;
23632392

23642393
static_assert(::cuda::std::is_same_v<int, OutputKeyT>, "Output key type must be int.");
2394+
static_assert(::cuda::std::numeric_limits<InputValueT>::is_specialized,
2395+
"numeric_limits must be specialized for the input value type");
23652396

23662397
// Wrapped input iterator to produce index-value <OverrideOffsetT, InputT> tuples
23672398
using ArgIndexInputIteratorT = ArgIndexInputIterator<InputIteratorT, OverrideOffsetT, OutputValueT>;
@@ -2498,6 +2529,8 @@ public:
24982529
using OutputValueT = typename OutputTupleT::Value;
24992530

25002531
static_assert(::cuda::std::is_same_v<int, OutputKeyT>, "Output key type must be int.");
2532+
static_assert(::cuda::std::numeric_limits<InputValueT>::is_specialized,
2533+
"numeric_limits must be specialized for the input value type");
25012534

25022535
// Wrapped input iterator to produce index-value <OverrideOffsetT, InputT> tuples
25032536
using ArgIndexInputIteratorT = ArgIndexInputIterator<InputIteratorT, OverrideOffsetT, OutputValueT>;
@@ -2593,6 +2626,8 @@ public:
25932626
using output_value_t = typename output_tuple_t::second_type;
25942627

25952628
static_assert(::cuda::std::is_same_v<int, output_key_t>, "Output key type must be int.");
2629+
static_assert(::cuda::std::numeric_limits<input_value_t>::is_specialized,
2630+
"numeric_limits must be specialized for the input value type");
25962631

25972632
// Wrapped input iterator to produce index-value <input_t, InputT> tuples
25982633
auto d_indexed_in = THRUST_NS_QUALIFIER::make_transform_iterator(
@@ -2694,6 +2729,8 @@ public:
26942729
"gpu_to_gpu determinism is not supported for device segmented reductions ");
26952730

26962731
static_assert(::cuda::std::is_same_v<int, output_key_t>, "Output key type must be int.");
2732+
static_assert(::cuda::std::numeric_limits<input_value_t>::is_specialized,
2733+
"numeric_limits must be specialized for the input value type");
26972734

26982735
using arg_index_input_iterator_t =
26992736
THRUST_NS_QUALIFIER::transform_iterator<detail::reduce::generate_idx_value<InputIteratorT, output_value_t>,

0 commit comments

Comments
 (0)