Skip to content

Commit

Permalink
Expose streams in all public sorting APIs (#14146)
Browse files Browse the repository at this point in the history
Contributes to #925

Authors:
  - Vyas Ramasubramani (https://github.com/vyasr)

Approvers:
  - Bradley Dice (https://github.com/bdice)
  - David Wendt (https://github.com/davidwendt)

URL: #14146
  • Loading branch information
vyasr authored Sep 22, 2023
1 parent c7dd6b4 commit 517d123
Show file tree
Hide file tree
Showing 11 changed files with 210 additions and 55 deletions.
44 changes: 32 additions & 12 deletions cpp/include/cudf/sorting.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include <cudf/aggregation.hpp>
#include <cudf/types.hpp>
#include <cudf/utilities/default_stream.hpp>

#include <rmm/mr/device/per_device_resource.hpp>

Expand All @@ -43,6 +44,7 @@ namespace cudf {
* @param null_precedence The desired order of null compared to other elements
* for each column. Size must be equal to `input.num_columns()` or empty.
* If empty, all columns will be sorted in `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource used to allocate the returned column's device memory
* @return A non-nullable column of elements containing the permuted row indices of
* `input` if it were sorted
Expand All @@ -51,6 +53,7 @@ std::unique_ptr<column> sorted_order(
table_view const& input,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -65,27 +68,30 @@ std::unique_ptr<column> stable_sorted_order(
table_view const& input,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
* @brief Checks whether the rows of a `table` are sorted in a lexicographical
* order.
*
* @param[in] table Table whose rows need to be compared for ordering
* @param[in] column_order The expected sort order for each column. Size
* must be equal to `in.num_columns()` or empty. If
* empty, it is expected all columns are in
* ascending order.
* @param[in] null_precedence The desired order of null compared to other
* elements for each column. Size must be equal to
* `input.num_columns()` or empty. If empty,
* `null_order::BEFORE` is assumed for all columns.
*
* @returns bool true if sorted as expected, false if not
* @param table Table whose rows need to be compared for ordering
* @param column_order The expected sort order for each column. Size
* must be equal to `in.num_columns()` or empty. If
* empty, it is expected all columns are in
* ascending order.
* @param null_precedence The desired order of null compared to other
* elements for each column. Size must be equal to
* `input.num_columns()` or empty. If empty,
* `null_order::BEFORE` is assumed for all columns.
*
* @param stream CUDA stream used for device memory operations and kernel launches
* @returns true if sorted as expected, false if not
*/
bool is_sorted(cudf::table_view const& table,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence);
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream = cudf::get_default_stream());

/**
* @brief Performs a lexicographic sort of the rows of a table
Expand All @@ -98,13 +104,15 @@ bool is_sorted(cudf::table_view const& table,
* elements for each column in `input`. Size must be equal to
* `input.num_columns()` or empty. If empty, all columns will be sorted with
* `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource used to allocate the returned table's device memory
* @return New table containing the desired sorted order of `input`
*/
std::unique_ptr<table> sort(
table_view const& input,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -124,6 +132,7 @@ std::unique_ptr<table> sort(
* elements for each column in `keys`. Size must be equal to
* `keys.num_columns()` or empty. If empty, all columns will be sorted with
* `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource used to allocate the returned table's device memory
* @return The reordering of `values` determined by the lexicographic order of
* the rows of `keys`.
Expand All @@ -133,6 +142,7 @@ std::unique_ptr<table> sort_by_key(
table_view const& keys,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -154,6 +164,7 @@ std::unique_ptr<table> sort_by_key(
* elements for each column in `keys`. Size must be equal to
* `keys.num_columns()` or empty. If empty, all columns will be sorted with
* `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource used to allocate the returned table's device memory
* @return The reordering of `values` determined by the lexicographic order of
* the rows of `keys`.
Expand All @@ -163,6 +174,7 @@ std::unique_ptr<table> stable_sort_by_key(
table_view const& keys,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -189,6 +201,7 @@ std::unique_ptr<table> stable_sort_by_key(
* @param null_precedence The desired order of null compared to other elements
* for column
* @param percentage flag to convert ranks to percentage in range (0,1]
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource used to allocate the returned column's device memory
* @return A column of containing the rank of the each element of the column of `input`. The output
* column type will be `size_type`column by default or else `double` when
Expand All @@ -201,6 +214,7 @@ std::unique_ptr<column> rank(
null_policy null_handling,
null_order null_precedence,
bool percentage,
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand Down Expand Up @@ -241,6 +255,7 @@ std::unique_ptr<column> rank(
* elements for each column in `keys`. Size must be equal to
* `keys.num_columns()` or empty. If empty, all columns will be sorted with
* `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource to allocate any returned objects
* @return sorted order of the segment sorted table
*
Expand All @@ -250,6 +265,7 @@ std::unique_ptr<column> segmented_sorted_order(
column_view const& segment_offsets,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -262,6 +278,7 @@ std::unique_ptr<column> stable_segmented_sorted_order(
column_view const& segment_offsets,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand Down Expand Up @@ -306,6 +323,7 @@ std::unique_ptr<column> stable_segmented_sorted_order(
* elements for each column in `keys`. Size must be equal to
* `keys.num_columns()` or empty. If empty, all columns will be sorted with
* `null_order::BEFORE`.
* @param stream CUDA stream used for device memory operations and kernel launches
* @param mr Device memory resource to allocate any returned objects
* @return table with elements in each segment sorted
*
Expand All @@ -316,6 +334,7 @@ std::unique_ptr<table> segmented_sort_by_key(
column_view const& segment_offsets,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/**
Expand All @@ -329,6 +348,7 @@ std::unique_ptr<table> stable_segmented_sort_by_key(
column_view const& segment_offsets,
std::vector<order> const& column_order = {},
std::vector<null_order> const& null_precedence = {},
rmm::cuda_stream_view stream = cudf::get_default_stream(),
rmm::mr::device_memory_resource* mr = rmm::mr::get_current_device_resource());

/** @} */ // end of group
Expand Down
30 changes: 15 additions & 15 deletions cpp/src/lists/segmented_sort.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION.
* Copyright (c) 2021-2023, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -70,13 +70,13 @@ std::unique_ptr<column> sort_lists(lists_column_view const& input,
auto output_offset = build_output_offsets(input, stream, mr);
auto const child = input.get_sliced_child(stream);

auto const sorted_child_table = segmented_sort_by_key(table_view{{child}},
table_view{{child}},
output_offset->view(),
{column_order},
{null_precedence},
stream,
mr);
auto const sorted_child_table = cudf::detail::segmented_sort_by_key(table_view{{child}},
table_view{{child}},
output_offset->view(),
{column_order},
{null_precedence},
stream,
mr);

return make_lists_column(input.size(),
std::move(output_offset),
Expand All @@ -98,13 +98,13 @@ std::unique_ptr<column> stable_sort_lists(lists_column_view const& input,
auto output_offset = build_output_offsets(input, stream, mr);
auto const child = input.get_sliced_child(stream);

auto const sorted_child_table = stable_segmented_sort_by_key(table_view{{child}},
table_view{{child}},
output_offset->view(),
{column_order},
{null_precedence},
stream,
mr);
auto const sorted_child_table = cudf::detail::stable_segmented_sort_by_key(table_view{{child}},
table_view{{child}},
output_offset->view(),
{column_order},
{null_precedence},
stream,
mr);

return make_lists_column(input.size(),
std::move(output_offset),
Expand Down
5 changes: 3 additions & 2 deletions cpp/src/sort/is_sorted.cu
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ bool is_sorted(cudf::table_view const& in,

bool is_sorted(cudf::table_view const& in,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence)
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream)
{
CUDF_FUNC_RANGE();
if (in.num_columns() == 0 || in.num_rows() == 0) { return true; }
Expand All @@ -89,7 +90,7 @@ bool is_sorted(cudf::table_view const& in,
"Number of columns in the table doesn't match the vector null_precedence's size .\n");
}

return detail::is_sorted(in, column_order, null_precedence, cudf::get_default_stream());
return detail::is_sorted(in, column_order, null_precedence, stream);
}

} // namespace cudf
11 changes: 3 additions & 8 deletions cpp/src/sort/rank.cu
Original file line number Diff line number Diff line change
Expand Up @@ -366,16 +366,11 @@ std::unique_ptr<column> rank(column_view const& input,
null_policy null_handling,
null_order null_precedence,
bool percentage,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::rank(input,
method,
column_order,
null_handling,
null_precedence,
percentage,
cudf::get_default_stream(),
mr);
return detail::rank(
input, method, column_order, null_handling, null_precedence, percentage, stream, mr);
}
} // namespace cudf
8 changes: 5 additions & 3 deletions cpp/src/sort/segmented_sort.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION.
* Copyright (c) 2021-2023, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -81,23 +81,25 @@ std::unique_ptr<column> segmented_sorted_order(table_view const& keys,
column_view const& segment_offsets,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::segmented_sorted_order(
keys, segment_offsets, column_order, null_precedence, cudf::get_default_stream(), mr);
keys, segment_offsets, column_order, null_precedence, stream, mr);
}

std::unique_ptr<table> segmented_sort_by_key(table_view const& values,
table_view const& keys,
column_view const& segment_offsets,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::segmented_sort_by_key(
values, keys, segment_offsets, column_order, null_precedence, cudf::get_default_stream(), mr);
values, keys, segment_offsets, column_order, null_precedence, stream, mr);
}

} // namespace cudf
2 changes: 1 addition & 1 deletion cpp/src/sort/segmented_sort_impl.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ std::unique_ptr<column> fast_segmented_sorted_order(column_view const& input,
// Unfortunately, CUB's segmented sort functions cannot accept iterators.
// We have to build a pre-filled sequence of indices as input.
auto sorted_indices =
cudf::detail::sequence(input.size(), numeric_scalar<size_type>{0}, stream, mr);
cudf::detail::sequence(input.size(), numeric_scalar<size_type>{0, true, stream}, stream, mr);
auto indices_view = sorted_indices->mutable_view();

cudf::type_dispatcher<dispatch_storage_type>(input.type(),
Expand Down
10 changes: 6 additions & 4 deletions cpp/src/sort/sort.cu
Original file line number Diff line number Diff line change
Expand Up @@ -109,30 +109,32 @@ std::unique_ptr<table> sort(table_view const& input,
std::unique_ptr<column> sorted_order(table_view const& input,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::sorted_order(input, column_order, null_precedence, cudf::get_default_stream(), mr);
return detail::sorted_order(input, column_order, null_precedence, stream, mr);
}

std::unique_ptr<table> sort(table_view const& input,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::sort(input, column_order, null_precedence, cudf::get_default_stream(), mr);
return detail::sort(input, column_order, null_precedence, stream, mr);
}

std::unique_ptr<table> sort_by_key(table_view const& values,
table_view const& keys,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::sort_by_key(
values, keys, column_order, null_precedence, cudf::get_default_stream(), mr);
return detail::sort_by_key(values, keys, column_order, null_precedence, stream, mr);
}

} // namespace cudf
8 changes: 5 additions & 3 deletions cpp/src/sort/stable_segmented_sort.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION.
* Copyright (c) 2021-2023, NVIDIA CORPORATION.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -55,23 +55,25 @@ std::unique_ptr<column> stable_segmented_sorted_order(
column_view const& segment_offsets,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::stable_segmented_sorted_order(
keys, segment_offsets, column_order, null_precedence, cudf::get_default_stream(), mr);
keys, segment_offsets, column_order, null_precedence, stream, mr);
}

std::unique_ptr<table> stable_segmented_sort_by_key(table_view const& values,
table_view const& keys,
column_view const& segment_offsets,
std::vector<order> const& column_order,
std::vector<null_order> const& null_precedence,
rmm::cuda_stream_view stream,
rmm::mr::device_memory_resource* mr)
{
CUDF_FUNC_RANGE();
return detail::stable_segmented_sort_by_key(
values, keys, segment_offsets, column_order, null_precedence, cudf::get_default_stream(), mr);
values, keys, segment_offsets, column_order, null_precedence, stream, mr);
}

} // namespace cudf
Loading

0 comments on commit 517d123

Please sign in to comment.