Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ab919e0
Migrate zip iterators to CUDA
PointKernel Jul 20, 2026
cbe3507
Merge upstream/main into migrate-zip-iterator
PointKernel Jul 22, 2026
3946f65
Merge branch 'main' into migrate-zip-iterator
PointKernel Jul 29, 2026
2db9dd6
Merge remote-tracking branch 'upstream/main' into codex/pr23336-confl…
PointKernel Jul 30, 2026
111eade
Migrate transform iterator
PointKernel Apr 10, 2026
7f33dd5
Fix styles
PointKernel Apr 10, 2026
d436513
Complete transform iterator migration
PointKernel Jul 20, 2026
bcb77de
Make device functor return types explicit
PointKernel Jul 20, 2026
b7945f3
Finalize CUDA iterator migration
PointKernel Aug 1, 2026
7ccdcbe
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 1, 2026
30260e4
Use standard views for host test data
PointKernel Aug 1, 2026
14025b0
Use CUDA iterator for nulls_at
PointKernel Aug 1, 2026
b09109c
Make nulls_at a standard range
PointKernel Aug 1, 2026
f084a8c
Avoid copying validity ranges
PointKernel Aug 1, 2026
d04d3bc
Fix struct validity overload resolution
PointKernel Aug 1, 2026
310508b
Fix struct validity overload dispatch
PointKernel Aug 1, 2026
35c9b60
Keep list null-mask views alive
PointKernel Aug 1, 2026
d8acca5
Keep remaining null-mask views alive
PointKernel Aug 1, 2026
1e0b3d2
Initialize JSON offsets with a zipped fill
PointKernel Aug 3, 2026
fbf799d
Use a constant source for JSON offset initialization
PointKernel Aug 3, 2026
31667e9
Hoist JSON offset duplication functor
PointKernel Aug 3, 2026
b4feff4
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 5, 2026
bc0bd5c
Use input transform iterator for JSON scatter
PointKernel Aug 5, 2026
72f6a8e
Materialize explode offset iterator tuple
PointKernel Aug 5, 2026
163bcb3
Keep indexed traversal for explode offsets
PointKernel Aug 5, 2026
4e2861e
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 5, 2026
8888454
Apply clang-format
PointKernel Aug 5, 2026
401c60e
Update copyright notices
PointKernel Aug 5, 2026
ea02157
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 5, 2026
eb237ce
Remove redundant valid-length transform
PointKernel Aug 5, 2026
1b77b6a
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 7, 2026
564113e
Fix CUDA iterator migration regressions
PointKernel Aug 7, 2026
60a5a37
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 7, 2026
e22b2d8
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 7, 2026
11cc222
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 10, 2026
3c45f0c
Restore nulls_at iterator compatibility
PointKernel Aug 10, 2026
7765c04
Restore nulls_at iterator contract
PointKernel Aug 10, 2026
34d2e5d
Merge remote-tracking branch 'upstream/main' into migrate-transform-i…
PointKernel Aug 10, 2026
2f76a94
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 10, 2026
4c7909e
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 14, 2026
2dc3d98
Fix iterator checks and empty DECIMAL128 extraction
PointKernel Aug 14, 2026
c5fa6b7
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 14, 2026
da1e9e8
Merge branch 'main' into migrate-transform-iterator-v2
PointKernel Aug 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ repos:
entry: 'rmm::exec_policy\('
language: pygrep
types_or: [c, c++, cuda]
- id: use-cuda-iterators
name: use-cuda-iterators
description: 'Enforce that CUDA iterators are used instead of equivalent Thrust iterators'
entry: 'thrust::(?:make_)?(?:constant|counting|discard|permutation|reverse|strided|tabulate_output|transform|transform_input_output|transform_output|zip)_iterator'
language: pygrep
types_or: [c, c++, cuda]
- id: exec-policy-nosync-memory-resource
name: exec-policy-nosync-memory-resource
description: 'Enforce that rmm::exec_policy_nosync is always passed a memory resource as its second argument'
Expand Down
17 changes: 2 additions & 15 deletions cpp/benchmarks/common/generate_input.cu
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
#include <thrust/fill.h>
#include <thrust/for_each.h>
#include <thrust/gather.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/random/uniform_int_distribution.h>
#include <thrust/random/uniform_real_distribution.h>
#include <thrust/scan.h>
Expand Down Expand Up @@ -419,7 +418,7 @@ rmm::device_uvector<cudf::size_type> sample_indices_with_run_length(cudf::size_t
thrust::device, run_lens.begin(), run_lens.end(), run_lens.begin(), cuda::std::plus<int>{});
auto const samples_indices = sample_dist(engine, approx_run_len + 1);
// This is gather.
auto avg_repeated_sample_indices_iterator = thrust::make_transform_iterator(
auto avg_repeated_sample_indices_iterator = cuda::transform_iterator(
cuda::counting_iterator<cudf::size_type>{0},
cuda::proclaim_return_type<cudf::size_type>(
[rb = run_lens.begin(),
Expand All @@ -441,14 +440,6 @@ rmm::device_uvector<cudf::size_type> sample_indices_with_run_length(cudf::size_t
}
}

struct valid_or_zero {
template <typename T>
__device__ T operator()(cuda::std::tuple<T, bool> len_valid) const
{
return cuda::std::get<1>(len_valid) ? cuda::std::get<0>(len_valid) : T{0};
}
};

enum class string_encoding {
ASCII,
UTF8,
Expand Down Expand Up @@ -511,13 +502,9 @@ std::unique_ptr<cudf::column> create_random_utf8_string_column(data_profile cons
lengths.begin(),
cuda::proclaim_return_type<cudf::size_type>([] __device__(auto) { return 0; }),
cuda::std::logical_not<bool>{});
auto valid_lengths = thrust::make_transform_iterator(
cuda::make_zip_iterator(cuda::std::make_tuple(lengths.begin(), null_mask.begin())),
valid_or_zero{});

// offsets are created as INT32 or INT64 as appropriate
auto [offsets, chars_length] = cudf::strings::detail::make_offsets_child_column(
valid_lengths, valid_lengths + num_rows, stream, mr);
lengths.begin(), lengths.begin() + num_rows, stream, mr);
// use the offsetalator to normalize the offset values for use by the string_generator
auto offsets_itr = cudf::detail::offsetalator_factory::make_input_iterator(offsets->view());
rmm::device_uvector<char> chars(chars_length, cudf::get_default_stream());
Expand Down
6 changes: 3 additions & 3 deletions cpp/benchmarks/io/orc/orc_writer_chunks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#include <cudf/table/table.hpp>
#include <cudf/utilities/default_stream.hpp>

#include <thrust/iterator/transform_iterator.h>
#include <cuda/iterator>

#include <nvbench/nvbench.cuh>

Expand Down Expand Up @@ -92,10 +92,10 @@ void nvbench_orc_chunked_write(nvbench::state& state)

auto mem_stats_logger = cudf::memory_stats_logger();

auto size_iter = thrust::make_transform_iterator(
auto size_iter = cuda::transform_iterator(
tables.begin(), [](auto const& i) { return i->num_columns() * i->num_rows(); });
auto row_count_iter =
thrust::make_transform_iterator(tables.begin(), [](auto const& i) { return i->num_rows(); });
cuda::transform_iterator(tables.begin(), [](auto const& i) { return i->num_rows(); });
auto total_elements = std::accumulate(size_iter, size_iter + num_tables, 0);
auto total_rows = std::accumulate(row_count_iter, row_count_iter + num_tables, 0);

Expand Down
3 changes: 1 addition & 2 deletions cpp/benchmarks/iterator/iterator.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -16,7 +16,6 @@
#include <cub/device/device_reduce.cuh>
#include <cuda/iterator>
#include <thrust/execution_policy.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/reduce.h>

#include <nvbench/nvbench.cuh>
Expand Down
5 changes: 2 additions & 3 deletions cpp/benchmarks/transpose/transpose.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -12,7 +12,6 @@
#include <cudf/utilities/default_stream.hpp>

#include <cuda/iterator>
#include <thrust/iterator/transform_iterator.h>

#include <nvbench/nvbench.cuh>

Expand All @@ -22,7 +21,7 @@ void bench_transpose(nvbench::state& state)
constexpr auto column_type_id = cudf::type_id::INT32;

auto int_column_generator =
thrust::make_transform_iterator(cuda::counting_iterator<std::size_t>{0}, [count](int i) {
cuda::transform_iterator(cuda::counting_iterator<std::size_t>{0}, [count](int i) {
return cudf::make_numeric_column(
cudf::data_type{column_type_id}, count, cudf::mask_state::ALL_VALID);
});
Expand Down
11 changes: 5 additions & 6 deletions cpp/include/cudf/column/column_device_view.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#include <cuda/iterator>
#include <cuda/std/utility>
#include <cuda/stream>
#include <thrust/iterator/transform_iterator.h>

#include <functional>

Expand Down Expand Up @@ -228,7 +227,7 @@ class alignas(16) column_device_view : public column_device_view_core {
* @brief Iterator for navigating this column
*/
template <typename T>
using const_iterator = thrust::transform_iterator<detail::value_accessor<T>, count_it>;
using const_iterator = cuda::transform_iterator<detail::value_accessor<T>, count_it>;

/**
* @brief Return an iterator to the first element of the column.
Expand Down Expand Up @@ -276,14 +275,14 @@ class alignas(16) column_device_view : public column_device_view_core {
*/
template <typename T, typename Nullate>
using const_optional_iterator =
thrust::transform_iterator<detail::optional_accessor<T, Nullate>, count_it>;
cuda::transform_iterator<detail::optional_accessor<T, Nullate>, count_it>;

/**
* @brief Pair iterator for navigating this column
*/
template <typename T, bool has_nulls>
using const_pair_iterator =
thrust::transform_iterator<detail::pair_accessor<T, has_nulls>, count_it>;
cuda::transform_iterator<detail::pair_accessor<T, has_nulls>, count_it>;

/**
* @brief Pair rep iterator for navigating this column
Expand All @@ -292,7 +291,7 @@ class alignas(16) column_device_view : public column_device_view_core {
*/
template <typename T, bool has_nulls>
using const_pair_rep_iterator =
thrust::transform_iterator<detail::pair_rep_accessor<T, has_nulls>, count_it>;
cuda::transform_iterator<detail::pair_rep_accessor<T, has_nulls>, count_it>;

/**
* @brief Return an optional iterator to the first element of the column.
Expand Down Expand Up @@ -701,7 +700,7 @@ class alignas(16) mutable_column_device_view : public mutable_column_device_view
* @brief Iterator for navigating this column
*/
template <typename T>
using iterator = thrust::transform_iterator<detail::mutable_value_accessor<T>, count_it>;
using iterator = cuda::transform_iterator<detail::mutable_value_accessor<T>, count_it>;

/**
* @brief Return first element (accounting for offset) after underlying data
Expand Down
7 changes: 3 additions & 4 deletions cpp/include/cudf/detail/indexalator.cuh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2020-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2020-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -16,7 +16,6 @@
#include <cuda/iterator>
#include <cuda/std/optional>
#include <cuda/std/utility>
#include <thrust/iterator/transform_iterator.h>

namespace cudf {
namespace detail {
Expand Down Expand Up @@ -344,8 +343,8 @@ struct indexalator_factory {
*/
static auto make_input_optional_iterator(scalar const& input, rmm::cuda_stream_view stream)
{
return thrust::make_transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_optional_index_accessor{input, stream});
return cuda::transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_optional_index_accessor{input, stream});
}
};

Expand Down
15 changes: 7 additions & 8 deletions cpp/include/cudf/detail/iterator.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,11 @@
#include <cuda/std/optional>
#include <cuda/std/type_traits>
#include <cuda/std/utility>
#include <thrust/iterator/transform_iterator.h>

namespace cudf {
namespace detail {
/**
* @brief Convenience wrapper for creating a `thrust::transform_iterator` over a
* @brief Convenience wrapper for creating a `cuda::transform_iterator` over a
* `cuda::counting_iterator` within the range [0, INT_MAX].
*
*
Expand Down Expand Up @@ -65,7 +64,7 @@ CUDF_HOST_DEVICE inline auto make_counting_transform_iterator(CountingIterType s
cuda::std::numeric_limits<cudf::size_type>::digits,
"The `start` for the counting_transform_iterator must be size_type or smaller type");

return thrust::make_transform_iterator(cuda::counting_iterator{start}, f);
return cuda::transform_iterator(cuda::counting_iterator{start}, f);
}

/**
Expand Down Expand Up @@ -381,8 +380,8 @@ auto inline make_scalar_iterator(scalar const& scalar_value)
{
CUDF_EXPECTS(data_type(type_to_id<Element>()) == scalar_value.type(), "the data type mismatch");
CUDF_EXPECTS(scalar_value.is_valid(), "the scalar value must be valid");
return thrust::make_transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_value_accessor<Element>{scalar_value});
return cuda::transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_value_accessor<Element>{scalar_value});
}

/**
Expand Down Expand Up @@ -577,7 +576,7 @@ auto inline make_optional_iterator(scalar const& scalar_value, Nullate has_nulls
{
CUDF_EXPECTS(type_id_matches_device_storage_type<Element>(scalar_value.type().id()),
"the data type mismatch");
return thrust::make_transform_iterator(
return cuda::transform_iterator(
cuda::make_constant_iterator<size_type>(0),
scalar_optional_accessor<Element, Nullate>{scalar_value, has_nulls});
}
Expand Down Expand Up @@ -608,8 +607,8 @@ auto inline make_pair_iterator(scalar const& scalar_value)
{
CUDF_EXPECTS(type_id_matches_device_storage_type<Element>(scalar_value.type().id()),
"the data type mismatch");
return thrust::make_transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_pair_accessor<Element>{scalar_value});
return cuda::transform_iterator(cuda::make_constant_iterator<size_type>(0),
scalar_pair_accessor<Element>{scalar_value});
}

/**
Expand Down
2 changes: 1 addition & 1 deletion cpp/include/cudf/detail/join/filtered_join.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class filtered_join {
struct key_pair_fn {
CUDF_HOST_DEVICE constexpr key_pair_fn(Hasher const& hasher) : _hasher{hasher} {}

__device__ __forceinline__ auto operator()(size_type i) const noexcept
__device__ __forceinline__ cuco::pair<hash_value_type, T> operator()(size_type i) const noexcept
{
return cuco::pair{_hasher(i), T{i}};
}
Expand Down
15 changes: 7 additions & 8 deletions cpp/include/cudf/detail/null_mask.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#include <cuda/std/tuple>
#include <cuda/stream>
#include <thrust/for_each.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/transform.h>

#include <algorithm>
Expand Down Expand Up @@ -536,11 +535,11 @@ rmm::device_uvector<size_type> segmented_count_bits(bitmask_type const* bitmask,
static_cast<size_type>(std::distance(first_bit_indices_begin, first_bit_indices_end));
rmm::device_uvector<size_type> d_bit_counts(num_ranges, stream);

auto num_set_bits_in_word = thrust::make_transform_iterator(bitmask, popcount{});
auto num_set_bits_in_word = cuda::transform_iterator(bitmask, popcount{});
auto first_word_indices =
thrust::make_transform_iterator(first_bit_indices_begin, bit_to_word_index{true});
cuda::transform_iterator(first_bit_indices_begin, bit_to_word_index{true});
auto last_word_indices =
thrust::make_transform_iterator(last_bit_indices_begin, bit_to_word_index{false});
cuda::transform_iterator(last_bit_indices_begin, bit_to_word_index{false});

// Allocate temporary memory.
size_t temp_storage_bytes{0};
Expand Down Expand Up @@ -577,7 +576,7 @@ rmm::device_uvector<size_type> segmented_count_bits(bitmask_type const* bitmask,
// Convert from set bits counts to unset bits by subtracting the number of
// set bits from the length of the segment.
auto segments_begin = cuda::make_zip_iterator(first_bit_indices_begin, last_bit_indices_begin);
auto segment_length_iterator = thrust::transform_iterator(
auto segment_length_iterator = cuda::transform_iterator(
segments_begin, cuda::proclaim_return_type<size_type>([] __device__(auto const& segment) {
auto const begin = cuda::std::get<0>(segment);
auto const end = cuda::std::get<1>(segment);
Expand Down Expand Up @@ -683,10 +682,10 @@ std::vector<size_type> segmented_count_bits(bitmask_type const* bitmask,
make_device_uvector_async(h_indices, stream, cudf::get_current_device_resource_ref());

// Compute the bit counts over each segment.
auto first_bit_indices_begin = thrust::make_transform_iterator(
auto first_bit_indices_begin = cuda::transform_iterator(
cuda::counting_iterator<cudf::size_type>{0}, index_alternator{false, d_indices.data()});
auto const first_bit_indices_end = first_bit_indices_begin + num_segments;
auto last_bit_indices_begin = thrust::make_transform_iterator(
auto last_bit_indices_begin = cuda::transform_iterator(
cuda::counting_iterator<cudf::size_type>{0}, index_alternator{true, d_indices.data()});
rmm::device_uvector<size_type> d_bit_counts =
cudf::detail::segmented_count_bits(bitmask,
Expand Down Expand Up @@ -794,7 +793,7 @@ std::pair<rmm::device_buffer, size_type> segmented_null_mask_reduction(
{
auto const segments_begin =
cuda::make_zip_iterator(first_bit_indices_begin, last_bit_indices_begin);
auto const segment_length_iterator = thrust::make_transform_iterator(
auto const segment_length_iterator = cuda::transform_iterator(
segments_begin, cuda::proclaim_return_type<size_type>([] __device__(auto const& segment) {
auto const begin = cuda::std::get<0>(segment);
auto const end = cuda::std::get<1>(segment);
Expand Down
4 changes: 2 additions & 2 deletions cpp/include/cudf/detail/row_operator/hashing.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
#include <cudf/utilities/traits.hpp>
#include <cudf/utilities/type_dispatcher.hpp>

#include <cuda/iterator>
#include <cuda/std/limits>
#include <cuda/std/type_traits>
#include <thrust/iterator/transform_iterator.h>

#include <memory>

Expand Down Expand Up @@ -126,7 +126,7 @@ class device_row_hasher {
auto const init = has_columns ? hasher(_table.column(0)) : _seed;
auto const start_col = static_cast<size_type>(has_columns);

auto it = thrust::make_transform_iterator(_table.begin() + start_col, hasher);
auto it = cuda::transform_iterator(_table.begin() + start_col, hasher);
return detail::accumulate(
it, it + (_table.num_columns() - start_col), init, [](auto hash, auto h) {
return cudf::hashing::detail::hash_combine(hash, h);
Expand Down
5 changes: 2 additions & 3 deletions cpp/include/cudf/detail/scatter.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include <cuda/iterator>
#include <cuda/stream>
#include <thrust/count.h>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/scatter.h>
#include <thrust/sequence.h>
#include <thrust/uninitialized_fill.h>
Expand Down Expand Up @@ -380,9 +379,9 @@ std::unique_ptr<table> scatter(table_view const& source,

// Transform negative indices to index + target size.
auto updated_scatter_map_begin =
thrust::make_transform_iterator(scatter_map_begin, index_converter<MapType>{target.num_rows()});
cuda::transform_iterator(scatter_map_begin, index_converter<MapType>{target.num_rows()});
auto updated_scatter_map_end =
thrust::make_transform_iterator(scatter_map_end, index_converter<MapType>{target.num_rows()});
cuda::transform_iterator(scatter_map_end, index_converter<MapType>{target.num_rows()});
auto result = std::vector<std::unique_ptr<column>>(target.num_columns());

std::transform(source.begin(),
Expand Down
18 changes: 8 additions & 10 deletions cpp/include/cudf/detail/utilities/batched_memset.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -16,7 +16,6 @@
#include <cub/device/device_copy.cuh>
#include <cuda/functional>
#include <cuda/iterator>
#include <thrust/iterator/transform_iterator.h>
#include <thrust/transform.h>

namespace CUDF_EXPORT cudf {
Expand All @@ -43,19 +42,18 @@ void batched_memset(cudf::host_span<cudf::device_span<T> const> host_buffers,
host_buffers, stream, cudf::get_current_device_resource_ref());

// Vector of sizes of all buffer spans
auto sizes = thrust::make_transform_iterator(
cuda::counting_iterator<std::size_t>{0},
cuda::proclaim_return_type<std::size_t>(
[buffers = buffers.data()] __device__(std::size_t i) { return buffers[i].size(); }));
auto sizes = cuda::transform_iterator(
buffers.begin(), cuda::proclaim_return_type<std::size_t>([] __device__(auto const& buffer) {
return buffer.size();
}));

// Constant iterator to the value to memset
auto iter_in = cuda::make_constant_iterator(cuda::make_constant_iterator(value));

// Iterator to each device span pointer
auto iter_out = thrust::make_transform_iterator(
cuda::counting_iterator<std::size_t>{0},
cuda::proclaim_return_type<T*>(
[buffers = buffers.data()] __device__(std::size_t i) { return buffers[i].data(); }));
auto iter_out = cuda::transform_iterator(
buffers.begin(),
cuda::proclaim_return_type<T*>([] __device__(auto const& buffer) { return buffer.data(); }));

std::size_t temp_storage_bytes = 0;
auto const num_buffers = host_buffers.size();
Expand Down
Loading
Loading