3#include <cuda_runtime.h>
34template <
size_t BucketCount>
39 cuda::stream_ref stream
41 static_assert(BucketCount >= (
size_t{1} << 11) && BucketCount <= (
size_t{1} << 13));
42 static_assert((BucketCount & (BucketCount - 1U)) == 0U);
44 if (left_rows.size() != right_rows.size()) {
47 if (left_rows.size() % BucketCount != 0U) {
50 auto const pair_count = left_rows.size() / BucketCount;
51 if (outputs.size() < pair_count) {
54 if (pair_count != 0U && (left_rows.data() ==
nullptr || right_rows.data() ==
nullptr ||
55 outputs.data() ==
nullptr)) {
58 if (pair_count == 0U) {
63 constexpr size_t maximum_blocks = 65535U;
65 std::min((pair_count + warps_per_block - 1U) / warps_per_block, maximum_blocks);
66 detail::batch_summary_kernel<BucketCount>
68 left_rows.data(), right_rows.data(), pair_count, outputs.data()
79template <
size_t BucketCount,
typename Layout = default_register_layout>
84 cuda::stream_ref stream
86 static_assert(BucketCount >= (
size_t{1} << 11) && BucketCount <= (
size_t{1} << 13));
87 static_assert((BucketCount & (BucketCount - 1U)) == 0U);
89 if (sketches.size() % BucketCount != 0U) {
92 auto const row_count = sketches.size() / BucketCount;
93 if (empty_out.size() < row_count || estimates_out.size() < row_count) {
96 if (row_count == 0U) {
99 if (sketches.data() ==
nullptr || empty_out.data() ==
nullptr ||
100 estimates_out.data() ==
nullptr) {
107 detail::batch_cardinality_kernel<BucketCount, Layout>
110 static_cast<uint32_t
>(row_count),
114 return cuda_try(cudaGetLastError());
122template <
size_t BucketCount>
126 cuda::stream_ref stream
128 static_assert(BucketCount >= (
size_t{1} << 11) && BucketCount <= (
size_t{1} << 13));
129 static_assert((BucketCount & (BucketCount - 1U)) == 0U);
131 if (sketches.size() % BucketCount != 0U) {
134 auto const row_count = sketches.size() / BucketCount;
135 if (scores_out.size() < row_count * BucketCount) {
138 if (row_count == 0U) {
141 if (sketches.data() ==
nullptr || scores_out.data() ==
nullptr) {
148 detail::batch_scores_kernel<BucketCount>
150 sketches.data(),
static_cast<uint32_t
>(row_count), scores_out.data()
152 return cuda_try(cudaGetLastError());
constexpr uint32_t block_size
Threads per CTA for the single-pair and cardinality reduction kernels.
constexpr size_t maximum_batch_rows
Stored sketches one batch launch may index, bounded by the CUDA grid dimension.
Batch operations over contiguous device rows.
Result< void > Ok() noexcept
Success return for Result<void>; same as return {}.
Result< void > compare_batch_async(device_span< uint32_t const > left_rows, device_span< uint32_t const > right_rows, device_span< pairwise_summary > outputs, cuda::stream_ref stream)
Compares corresponding rows from two contiguous register batches.
Result< void > extract_scores_batch_async(device_span< uint32_t const > sketches, device_span< uint16_t > scores_out, cuda::stream_ref stream)
Copies the winning score of every register into compact row-major scores.
Result< void > cardinality_batch_async(device_span< uint32_t const > sketches, device_span< uint64_t > empty_out, device_span< double > estimates_out, cuda::stream_ref stream)
Computes the cardinality of every stored sketch.
cuda::std::unexpected< Error > Err(Error error)
Failure return; converts to any Result<T> via cuda::std::unexpected.
Result< void > cuda_try(cudaError_t error, std::source_location location=std::source_location::current())
Checks a CUDA runtime call and returns an error on failure.
static Error invalid_argument(std::string message)
Fallible API result: cuda::std::expected<T, Error> with cuDDL factories.
A span that is assumed to point to device-accessible memory.