cuDDL
Loading...
Searching...
No Matches
Classes | Namespaces | Enumerations | Functions | Variables
kernels.cuh File Reference
#include <cooperative_groups.h>
#include <cooperative_groups/reduce.h>
#include <cuda_runtime.h>
#include <cub/block/block_histogram.cuh>
#include <cub/block/block_reduce.cuh>
#include <cub/block/block_scan.cuh>
#include <cuda/std/algorithm>
#include <cuda/std/bit>
#include <cuda/std/cstddef>
#include <cuda/std/cstdint>
#include <cuddl/blacklist.cuh>
#include <cuddl/detail/cardinality.cuh>
#include <cuddl/detail/comparison.cuh>
#include <cuddl/detail/hash.cuh>
#include <cuddl/detail/hybrid_cardinality.cuh>
#include <cuddl/detail/register.cuh>
#include <cuddl/helpers.cuh>
#include <cuddl/pairwise_counts.cuh>

Go to the source code of this file.

Classes

struct  cuddl::detail::summary_payload
 Per-thread accumulator feeding a CUB block reduction for fused summaries. More...
 
struct  cuddl::detail::posting_bitmap_cell
 Selects posting lists whose bitmap uses no more storage than their reference IDs. More...
 
struct  cuddl::detail::plane_counts
 Bit-sliced pairwise counts of one 32-bucket group, accumulated per lane. More...
 
struct  cuddl::detail::refine_cells
 How a refinement-style block splits a tile: cell c holds query group c % groups and the reference words from first_word + (c / groups) * block_words. More...
 
struct  cuddl::detail::word_popcount
 Popcount of one pass-bit word. More...
 
struct  cuddl::detail::cardinality_payload
 Per-thread accumulator feeding the CUB block reduction for cardinality. More...
 

Namespaces

namespace  cuddl
 Batch operations over contiguous device rows.
 
namespace  cuddl::detail
 

Enumerations

enum class  cuddl::detail::refine_candidates { cuddl::detail::bitmap , cuddl::detail::all , cuddl::detail::reference_mask }
 Pairs refine_batch_bitmap_kernel compares. More...
 

Functions

template<size_t BucketCount, typename Layout = default_register_layout, bool HasBlacklist = false>
__global__ cuddl::detail::__launch_bounds__ (shared_construction_block_size) void add_shared_kernel(uint64_t const *input
 Constructs a sketch through a CTA-local shared-memory register array.
 
__device__ uint2 cuddl::detail::lane_posting_range (uint32_t const *offsets, uint16_t const *sorted_keys, uint32_t reference_count, uint32_t bucket, uint32_t key, uint32_t key_count)
 One thread's posting range for a bucket/key cell of a dense or sparse index.
 
__host__ __device__ constexpr uint32_t cuddl::detail::sparse_directory_shift (uint32_t reference_count) noexcept
 Low key bits a sparse key directory cell spans for reference_count references.
 
__host__ __device__ constexpr uint32_t cuddl::detail::sparse_directory_entries (uint32_t reference_count) noexcept
 Bounds per bucket in a sparse key directory.
 
__global__ cuddl::detail::__launch_bounds__ (block_size) static void build_sparse_directory_kernel(uint16_t const *sorted_keys
 Builds a sparse key directory: entry c of bucket b is the first position in b's sorted keys whose key is at least c << shift.
 
 cuddl::detail::for (auto i=static_cast< size_t >(blockIdx.x) *block_size+threadIdx.x;i< total;i+=static_cast< size_t >(gridDim.x) *block_size)
 
 cuddl::detail::if (local !=0U)
 
__device__ uint2 cuddl::detail::directory_posting_range (uint16_t const *sorted_keys, uint32_t const *directory, uint32_t reference_count, uint32_t bucket, uint32_t sparse_key)
 One sparse bucket/key posting range, narrowed through the bucket's key directory.
 
template<size_t BucketCount, typename QueryRow >
__global__ cuddl::detail::__launch_bounds__ (block_size) void count_batch_index_matches_kernel(QueryRow const *queries
 Counts index matches for every query/reference pair in one tile.
 
bool cuddl::detail::uses_tiled_index_counts (uint32_t reference_count, uint32_t query_count, uint32_t indexed_bucket_count) noexcept
 Whether a batch counts through count_batch_index_tile_kernel.
 
uint32_t cuddl::detail::index_tile_references (uint32_t reference_count, uint32_t query_count, uint32_t multiprocessors, uint32_t max_shared_bytes) noexcept
 References per tile, bounded by the device's shared memory and small enough that the batch launches about four blocks per SM.
 
template<size_t BucketCount>
__global__ void cuddl::detail::hybrid_posting_ranges_kernel (uint16_t const *queries, uint32_t const *offsets, uint32_t const *bitmap_cells, uint32_t bitmap_count, uint32_t words, uint32_t indexed_buckets, uint16_t key_mask, uint2 *ranges, uint32_t *bitmap_starts, uint32_t *bitmap_counts)
 Splits each query's posting ranges into short lists and bitmap offsets.
 
template<uint32_t CounterBits>
__device__ uint32_t cuddl::detail::sum_posting_bitmaps (uint32_t const *bitmaps, uint32_t const *starts, uint32_t count, uint32_t word, uint32_t minimum_matches, uint32_t passed, uint32_t(&counters)[CounterBits])
 Sums one query's posting bitmaps over one word of references in bit-sliced counters.
 
template<size_t BucketCount, uint32_t CounterBits, typename QueryRow >
__global__ cuddl::detail::__maxnreg__ (48) void count_batch_index_tile_kernel(QueryRow const *queries
 Counts index matches for one query against one reference tile in shared memory.
 
 cuddl::detail::if (candidate_bits !=nullptr &&all_to_all &&high<=query_id_offset+query_index+1U)
 
if cuddl::detail::constexpr (CounterBits !=0U)
 
 cuddl::detail::__syncthreads ()
 
 cuddl::detail::if (candidate_bits==nullptr)
 
template<typename ReferenceScore >
__device__ __forceinline__ void cuddl::detail::classify_query_words (pairwise_counts &target, uint32_t const (&q)[8], ReferenceScore const *reference) noexcept
 Classifies 16 buckets of an already loaded 16-bit query chunk against one load_256_alignment aligned reference chunk.
 
template<typename SearchResult >
__device__ void cuddl::detail::refine_write_result (uint32_t index, uint32_t query_index, uint32_t reference_id, uint32_t query_id_offset, uint32_t const *match_counts, uint32_t pair_id, pairwise_counts local, uint32_t lane, SearchResult *results, uint32_t *result_match_counts)
 Warp-reduces one refined candidate and writes its stable result slot.
 
__host__ __device__ constexpr uint32_t cuddl::detail::score_plane_index (uint32_t group, uint32_t plane) noexcept
 Position of plane plane of 32-bucket group group within a row's bit-planes.
 
__device__ __forceinline__ void cuddl::detail::write_score_planes (uint32_t score, uint32_t group, uint32_t lane, uint32_t *planes)
 Writes the bit-planes of one 32-bucket group whose scores the warp holds, one per lane.
 
template<size_t BucketCount>
__global__ cuddl::detail::__launch_bounds__ (block_size) void build_score_planes_kernel(uint16_t const *rows
 Transposes compact score rows into the bit-plane layout of score_plane_index.
 
__device__ __forceinline__ void cuddl::detail::load_plane_group (uint4 const *row, uint32_t group, uint32_t(&words)[score_planes])
 Loads group group of one bit-plane row (score_plane_index layout).
 
__device__ __forceinline__ uint32_t cuddl::detail::plane_any (uint32_t const (&planes)[score_planes]) noexcept
 Buckets of a plane group holding a nonzero score.
 
__device__ __forceinline__ uint32_t cuddl::detail::plane_low_any (uint32_t const (&planes)[score_planes]) noexcept
 Buckets of a plane group whose score is nonzero below the top plane.
 
template<bool CountMatches, bool ReferenceFull = false>
__device__ __forceinline__ void cuddl::detail::compare_plane_group (uint32_t const (&q)[score_planes], uint32_t const (&r)[score_planes], uint32_t reference_any, uint32_t reference_low_any, uint16_t key_mask, uint32_t match_lanes, plane_counts &counts) noexcept
 Adds one group's comparison of query planes q with reference planes r, whose nonzero buckets reference_any the caller hoists out of per-query loops.
 
uint32_t cuddl::detail::warp_grid_blocks (size_t warps) noexcept
 Blocks for a grid-stride launch covering warps warps of block_size threads.
 
__device__ __forceinline__ uint32_t cuddl::detail::next_cell (uint32_t *cell_counter, uint32_t cell, uint32_t &claimed)
 The cell a refinement-style block processes after cell: claimed from cell_counter, a zeroed per-launch counter, so blocks balance uneven cells; without one, grid-stride.
 
template<bool UpperTriangle>
__device__ __forceinline__ refine_cells cuddl::detail::make_refine_cells (uint32_t query_id_offset, uint32_t query_count, uint32_t group, uint32_t words_per_query, uint32_t max_block_words, uint32_t waves)
 Splits a tile into refine_cells, about waves cells per block when the tile allows, so that blocks claiming cells dynamically even out cells of uneven work.
 
template<bool UpperTriangle>
__host__ __device__ uint64_t cuddl::detail::batch_result_slot (uint32_t query_index, uint32_t reference_id, uint32_t query_id_offset, uint32_t reference_count) noexcept
 Position of the pair (query_index of the tile, reference_id) in a tile's results: rows of reference_count references per query, or for all-to-all tiles the packed strict upper triangle of pairs with query_id < reference_id, where query IDs start at query_id_offset.
 
template<size_t BucketCount, bool CountMatches, typename SearchResult , refine_candidates Candidates, bool UpperTriangle, uint32_t QueryGroup>
__global__ cuddl::detail::__launch_bounds__ (bitmap_refine_block_size) void refine_batch_bitmap_kernel(uint32_t const *query_planes
 Exactly compares query bit-planes with references, sharing each reference row across a query group.
 
__device__ __forceinline__ void cuddl::detail::load_plane_chunk (uint4 const *row, uint32_t group, uint32_t chunk, uint32_t(&words)[4])
 Loads plane chunk chunk (planes 4 chunk ... 4 chunk + 3) of group group of a bit-plane row (score_plane_index layout).
 
template<size_t BucketCount, bool UpperTriangle, uint32_t QueryGroup>
__global__ void cuddl::detail::match_filter_kernel (uint32_t const *query_planes, uint32_t query_id_offset, uint32_t query_count, uint32_t const *reference_planes, uint32_t reference_count, uint32_t indexed_bucket_count, uint32_t minimum_matches, uint32_t *candidate_bits, uint32_t *cell_counter)
 Records in candidate_bits (candidate-bitmap layout) the pairs of the layout whose scores agree in their low match_filter_planes planes in at least minimum_matches buckets.
 
template<size_t BucketCount, typename SearchResult , bool UpperTriangle, uint32_t QueryGroup>
__global__ void cuddl::detail::refine_all_pairs_kernel (uint32_t const *query_planes, uint32_t query_id_offset, uint32_t query_count, uint32_t const *reference_planes, uint32_t reference_count, SearchResult *results, uint32_t *cell_counter, uint32_t const *reference_mask)
 Exactly compares the layout pairs selected by reference_mask, without match counts.
 
template<size_t BucketCount, typename SearchResult , bool UpperTriangle, bool Swar>
__global__ cuddl::detail::__launch_bounds__ (block_size) void row_major_all_pairs_kernel(uint16_t const *rows
 The all-pairs comparison of refine_all_pairs_kernel over row-major 16-bit scores instead of bit-planes, one warp per pair, for ablation builds to compare with.
 
template<size_t BucketCount, typename Layout = default_register_layout>
__global__ void cuddl::detail::cardinality_kernel (uint32_t const *registers, uint64_t *empty_out, double *estimate_out)
 Computes the cardinality of a single constructed sketch.
 
template<size_t BucketCount, typename Layout = default_register_layout>
__global__ void cuddl::detail::hybrid_cardinality_kernel (uint32_t const *const registers, hybrid_cardinality_estimates *const estimates)
 Computes BBTools and paper-style HybridDDL estimates in one register scan.
 
template<size_t BucketCount, hybrid_variant Variant, typename Layout = default_register_layout>
__global__ void cuddl::detail::hybrid_cardinality_variant_kernel (uint32_t const *const registers, double *const estimate)
 Computes one HybridDDL variant estimate for estimator comparisons.
 
template<size_t BucketCount, typename Layout = default_register_layout>
__global__ void cuddl::detail::batch_cardinality_kernel (uint32_t const *const registers, uint32_t const row_count, uint64_t *const empty_out, double *const estimates_out)
 Computes the cardinality of every stored sketch in one launch.
 
template<size_t BucketCount>
__global__ void cuddl::detail::batch_scores_kernel (uint32_t const *const registers, uint32_t const row_count, uint16_t *const scores_out)
 Copies the winning score of every register into compact row-major scores.
 

Variables

constexpr uint32_t cuddl::detail::block_size = 256
 Threads per CTA for the single-pair and cardinality reduction kernels.
 
constexpr size_t cuddl::detail::maximum_batch_rows = (size_t{1} << 31) - 1U
 Stored sketches one batch launch may index, bounded by the CUDA grid dimension.
 
template<typename QueryScore , typename ReferenceScore >
constexpr uint32_t cuddl::detail::wide_chunk_buckets
 Buckets one contiguous chunk covers, for a query/reference score pair.
 
constexpr uint32_t cuddl::detail::shared_construction_block_size = 768
 Threads per CTA for the CTA-local construction kernel.
 
__global__ size_t cuddl::detail::input_size
 
__global__ size_t uint32_t * cuddl::detail::registers
 
__global__ size_t uint32_t bool cuddl::detail::vector_input
 
__global__ size_t uint32_t bool blacklist_view cuddl::detail::blacklist
 
__global__ size_t uint32_t bool blacklist_view bool cuddl::detail::IncludeCardinality
 
__global__ size_t uint32_t bool blacklist_view bool cuddl::detail::Layout
 
constexpr uint32_t cuddl::detail::index_match_cells_per_warp = 32U
 Cells one warp owns per iteration of count_batch_index_matches_kernel: one per lane.
 
__global__ uint32_t cuddl::detail::reference_count
 
__global__ uint32_t uint32_t cuddl::detail::indexed_bucket_count
 
__global__ uint32_t uint32_t uint32_t * cuddl::detail::directory
 
auto const cuddl::detail::shift = sparse_directory_shift(reference_count)
 
auto const cuddl::detail::total = static_cast<size_t>(indexed_bucket_count) * entries
 
__global__ uint16_t const * cuddl::detail::sorted_keys
 
__global__ uint16_t const uint32_t uint32_t uint32_t cuddl::detail::key_count = static_cast<uint32_t>(key_mask) + 1U
 
__global__ uint16_t const uint32_t uint32_t uint32_t unsigned long long * cuddl::detail::work
 
unsigned long long cuddl::detail::local = 0U
 
constexpr uint32_t cuddl::detail::posting_range_block_size = 1024U
 Threads of the single index_posting_ranges_kernel block.
 
static __global__ uint32_t const * cuddl::detail::offsets
 
static __global__ uint32_t const uint16_t const uint32_t uint32_t uint16_t cuddl::detail::key_mask
 
static __global__ uint32_t const uint16_t const uint32_t uint32_t uint16_t uint32_t * cuddl::detail::range_begin
 
static __global__ uint32_t const uint16_t const uint32_t uint32_t uint16_t uint32_t uint32_t * cuddl::detail::range_end_scan
 
__shared__ block_scan::TempStorage cuddl::detail::storage
 
uint32_t cuddl::detail::carry = 0U
 
static __global__ uint32_t const uint32_t uint32_t const * cuddl::detail::postings
 
static __global__ uint32_t const uint32_t uint32_t const uint32_t * cuddl::detail::match_counts
 
auto const cuddl::detail::stride = static_cast<uint32_t>(gridDim.x) * block_size
 
__global__ size_t cuddl::detail::query_row_offset
 
__global__ size_t uint32_t cuddl::detail::query_count
 
constexpr uint32_t cuddl::detail::index_tile_lane_postings = 16U
 Longest posting range one count_batch_index_tile_kernel lane walks alone.
 
constexpr uint32_t cuddl::detail::index_tile_long_capacity = 32U
 Long posting ranges one count_batch_index_tile_kernel block walks together.
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t cuddl::detail::tile
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const * cuddl::detail::ranges
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t cuddl::detail::minimum_matches
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t cuddl::detail::query_id_offset
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t bool cuddl::detail::all_to_all
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t bool uint32_t * cuddl::detail::candidate_bits
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t bool uint32_t uint32_t const * cuddl::detail::bitmaps
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t bool uint32_t uint32_t const uint32_t const * cuddl::detail::bitmap_starts
 
__global__ size_t uint32_t const uint32_t const uint32_t uint32_t uint16_t uint32_t uint32_t uint16_t const uint2 const uint32_t uint32_t bool uint32_t uint32_t const uint32_t const uint32_t const * cuddl::detail::bitmap_counts
 
constexpr uint32_t cuddl::detail::warps_per_block = index_tile_block_size / warp_width
 
__shared__ uint32_t cuddl::detail::packed_counts []
 
auto const cuddl::detail::tiles = (reference_count + tile - 1U) / tile
 
auto const cuddl::detail::query_index = static_cast<uint32_t>(blockIdx.x) / tiles
 
auto cuddl::detail::low = static_cast<uint32_t>(blockIdx.x) % tiles * tile
 
auto const cuddl::detail::high = min(low + tile, reference_count)
 
auto const cuddl::detail::width = high - low
 
__shared__ uint2 cuddl::detail::long_ranges [index_tile_long_capacity]
 
__shared__ uint32_t cuddl::detail::long_count
 
auto const cuddl::detail::lane = static_cast<uint32_t>(threadIdx.x) % warp_width
 
auto const cuddl::detail::warp = static_cast<uint32_t>(threadIdx.x) / warp_width
 
 cuddl::detail::else
 
auto const * cuddl::detail::query = queries + (query_row_offset + query_index) * BucketCount
 
auto const cuddl::detail::count
 
auto const cuddl::detail::long_ranges_used
 
auto *const cuddl::detail::bits
 
constexpr size_t cuddl::detail::refine_block_row_bytes = size_t{8} << 20U
 Reference-row bytes one refine_batch_index_candidates_kernel block spans.
 
constexpr uint32_t cuddl::detail::score_planes = 16U
 Bits per score, and so bit-planes per 32-bucket group.
 
__global__ uint32_t cuddl::detail::row_count
 
__global__ uint32_t uint32_t * cuddl::detail::planes
 
constexpr uint32_t cuddl::detail::groups_per_row = static_cast<uint32_t>(BucketCount / warp_width)
 
__global__ size_t uint16_t * cuddl::detail::rows
 
__global__ uint32_t const * cuddl::detail::reference_planes
 
__global__ uint32_t const uint32_t uint32_t const * cuddl::detail::candidate_ids
 
__global__ uint32_t const uint32_t uint32_t const uint32_t const * cuddl::detail::candidate_count
 
__global__ uint32_t const uint32_t uint32_t const uint32_t const SearchResult * cuddl::detail::results
 
constexpr uint32_t cuddl::detail::row_words = static_cast<uint32_t>(BucketCount / 2U)
 
auto const cuddl::detail::items = candidate_ids == nullptr ? reference_count : *candidate_count
 
auto const cuddl::detail::pairs = static_cast<uint64_t>(query_count) * reference_count
 
auto const cuddl::detail::indexed_groups = indexed_bucket_count / warp_width
 
constexpr uint32_t cuddl::detail::bitmap_refine_block_size = 768U
 Threads per refine_batch_bitmap_kernel block.
 
constexpr uint32_t cuddl::detail::bitmap_refine_waves = 8U
 Cells per refine_batch_bitmap_kernel block that a tile of bitmap-selected pairs is split into when it allows.
 
constexpr size_t cuddl::detail::bitmap_refine_shared_bytes = 96U * 1024U
 Shared bytes refine_batch_bitmap_kernel may stage query planes in; one block per SM fits on every supported architecture.
 
template<size_t BucketCount>
constexpr bool cuddl::detail::bitmap_refine_staged = bitmap_refine_shared_bytes >= BucketCount * sizeof(uint16_t)
 Whether a query group's planes fit bitmap_refine_shared_bytes.
 
template<size_t BucketCount>
constexpr uint32_t cuddl::detail::bitmap_refine_group
 Queries one refine_batch_bitmap_kernel block refines together.
 
template<size_t BucketCount>
constexpr size_t cuddl::detail::bitmap_refine_dynamic_bytes
 Shared bytes one refine_batch_bitmap_kernel block stages.
 
__global__ uint32_t const uint32_t const * cuddl::detail::pass_bits
 
__global__ uint32_t const uint32_t const uint32_t const * cuddl::detail::word_offsets
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t cuddl::detail::first_query_id
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t uint32_t size_t cuddl::detail::word_begin
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t uint32_t size_t size_t cuddl::detail::word_end
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t uint32_t size_t size_t uint32_t cuddl::detail::packed_base
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t uint32_t size_t size_t uint32_t SearchResult * cuddl::detail::packed
 
__global__ uint32_t const uint32_t const uint32_t const uint32_t uint32_t size_t size_t uint32_t SearchResult uint32_t * cuddl::detail::packed_match_counts
 
auto const cuddl::detail::words_per_query = candidate_bit_words(reference_count)
 
__global__ uint32_t uint32_t uint32_t const uint32_t uint32_t uint16_t uint32_t const SearchResult uint32_t * cuddl::detail::result_match_counts
 
__global__ uint32_t uint32_t uint32_t const uint32_t uint32_t uint16_t uint32_t const SearchResult uint32_t uint32_t uint32_t uint32_t * cuddl::detail::cell_counter
 
constexpr uint32_t cuddl::detail::group = QueryGroup
 
constexpr bool cuddl::detail::staged = bitmap_refine_staged<BucketCount>
 
constexpr uint32_t cuddl::detail::lane_groups = groups_per_row / warp_width
 
constexpr uint32_t cuddl::detail::cached_groups = lane_groups < 2U ? lane_groups : 2U
 
constexpr uint32_t cuddl::detail::max_block_words
 
constexpr uint32_t cuddl::detail::word_slices = Candidates == refine_candidates::all ? 1U : 4U
 
__shared__ uint4 cuddl::detail::query_plane_storage []
 
__shared__ uint32_t cuddl::detail::next_word
 
__shared__ uint32_t cuddl::detail::claimed_cell
 
auto const cuddl::detail::cells
 
auto const cuddl::detail::groups = cells.groups
 
auto const cuddl::detail::thresholded = CountMatches && pass_bits != nullptr
 
constexpr uint32_t cuddl::detail::match_filter_block_size = 512U
 Threads per match_filter_kernel block.
 
template<size_t BucketCount>
constexpr bool cuddl::detail::match_filter_supported
 Whether match_filter_kernel supports BucketCount: a lane caches at most two plane groups of each of its references.
 
constexpr uint32_t cuddl::detail::match_filter_planes = 12U
 Low planes match_filter_kernel compares.
 
constexpr uint32_t cuddl::detail::all_pairs_block_size = 512U
 Threads per refine_all_pairs_kernel block.
 
constexpr uint32_t cuddl::detail::all_pairs_word_parts = 4U
 Parts a refine_all_pairs_kernel warp claims each 32-reference word in.
 
__global__ uint32_t uint32_t uint32_t SearchResult uint32_t const * cuddl::detail::reference_mask
 
auto const cuddl::detail::warps = uint64_t{gridDim.x} * (block_size / warp_width)