// SPDX-FileCopyrightText: Copyright (c) 2011-2025, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: BSD-3-Clause #include // #include #include #include #include #include #include #include namespace c2h::detail { template struct greater_equal_op { T val; __device__ bool operator()(T x) { return x >= val; } }; template std::size_t gen_uniform_offsets( seed_t seed, cuda::std::span segment_offsets, T total_elements, T min_segment_size, T max_segment_size) { gen_values_between(seed, segment_offsets, min_segment_size, max_segment_size); *thrust::device_ptr(&segment_offsets[total_elements]) = total_elements + 1; thrust::exclusive_scan(device_policy, segment_offsets.begin(), segment_offsets.end(), segment_offsets.begin()); const auto iter = thrust::find_if(device_policy, segment_offsets.begin(), segment_offsets.end(), greater_equal_op{total_elements}); *thrust::device_ptr(&*iter) = total_elements; return iter - segment_offsets.begin() + 1; } template std::size_t gen_uniform_offsets( seed_t seed, cuda::std::span segment_offsets, int32_t total_elements, int32_t min_segment_size, int32_t max_segment_size); template std::size_t gen_uniform_offsets( seed_t seed, cuda::std::span segment_offsets, uint32_t total_elements, uint32_t min_segment_size, uint32_t max_segment_size); template std::size_t gen_uniform_offsets( seed_t seed, cuda::std::span segment_offsets, int64_t total_elements, int64_t min_segment_size, int64_t max_segment_size); template std::size_t gen_uniform_offsets( seed_t seed, cuda::std::span segment_offsets, uint64_t total_elements, uint64_t min_segment_size, uint64_t max_segment_size); } // namespace c2h::detail