cuSBF
Loading...
Searching...
No Matches
kernels.cuh
Go to the documentation of this file.
1#pragma once
2
3#include <cuda/__cmath/ceil_div.h>
4#include <cuda_runtime.h>
5
6#include <cub/warp/warp_reduce.cuh>
7
8#include <cstdint>
9
10#include <cusbf/config.cuh>
15#include <cusbf/filter_ref.cuh>
16
17namespace cusbf::detail {
18
20template <typename Config>
25
27template <typename Config>
33
39template <typename Config, uint32_t k_stride>
44 bool block_all_valid,
46 uint64_t num_shards,
48) {
49 const uint64_t thread_offset = static_cast<uint64_t>(threadIdx.x) * k_stride;
51 return;
52 }
53
56 );
57
60
61 for (uint32_t s = 0; s < k_stride; ++s) {
63 if (local_idx >= block_kmers) {
64 break;
65 }
66
68
69 if (s > 0) {
72 );
73 }
74
75 if (!(kmer_valid_mask & (1u << s))) {
76 output[kmer_index] = 0;
77 continue;
78 }
79
81
82 const auto shard_idx =
84 const uint32_t peers = __match_any_sync(0xFFFFFFFFu, shard_idx);
85 const int leader = __ffs(static_cast<int>(peers)) - 1;
86
87 uint64_t w[4];
88 if (static_cast<int>(threadIdx.x & 31u) == leader) {
90 }
91 w[0] = __shfl_sync(peers, w[0], leader);
92 w[1] = __shfl_sync(peers, w[1], leader);
93 w[2] = __shfl_sync(peers, w[2], leader);
94 w[3] = __shfl_sync(peers, w[3], leader);
95
98 }
99}
100
106template <typename Config, uint32_t warps_per_block>
108 const uint8_t* sequence_tile,
111 bool block_all_valid,
113 uint64_t num_shards,
114 cub::WarpReduce<uint64_t>::TempStorage reduce_storage[warps_per_block][4]
115) {
116 constexpr uint32_t warp_size = 32;
117
118 const auto local_kmer_index = static_cast<uint64_t>(threadIdx.x);
120
121 bool active = in_range;
122 if (active && !block_all_valid) {
124 }
125
131
132 if (active) {
133 const uint64_t packed_kmer =
136
140 );
141 _Pragma("unroll")
146 );
147 }
148 }
149
150 const auto shard_idx =
151 static_cast<uint32_t>(active ? (minimizer_hash & (num_shards - 1)) : ~threadIdx.x);
152
153 const uint32_t lane = threadIdx.x & (warp_size - 1);
155 const uint32_t prev_shard_idx = __shfl_up_sync(0xffffffff, shard_idx, 1);
156 const bool run_head = (lane == 0) || (shard_idx != prev_shard_idx);
158
159 using WarpReduceWord = cub::WarpReduce<uint64_t>;
161 .HeadSegmentedReduce(word_mask0, run_head, bitwise_or);
163 .HeadSegmentedReduce(word_mask1, run_head, bitwise_or);
165 .HeadSegmentedReduce(word_mask2, run_head, bitwise_or);
167 .HeadSegmentedReduce(word_mask3, run_head, bitwise_or);
168
169 if (run_head && active) {
172 }
173}
174
180template <typename Config>
216
222template <typename Config>
224 const char* sequence,
227 uint64_t num_shards
228) {
231
232 using WarpReduceWord = cub::WarpReduce<uint64_t>;
233
235 __shared__ typename WarpReduceWord::TempStorage reduce_storage[warps_per_block][4];
236
239 return;
240 }
241
243
246 );
247
253 shards,
254 num_shards,
256 );
257}
258
262template <typename Config>
300
304template <typename Config>
342
343} // namespace cusbf::detail
Non-owning device reference to sectorized filter storage.
__host__ static __device__ uint64_t shard_index(uint64_t minimizer_hash, uint64_t num_blocks) noexcept
Maps a minimizer hash to a shard index via low bits.
static __device__ bool sectorized_contains_packed_kmer(uint64_t packed_kmer, const uint64_t *shard_words)
Tests sectorized membership for a packed k-mer against shard words.
__device__ void apply_word_masks(block_type &block, uint64_t m0, uint64_t m1, uint64_t m2, uint64_t m3) const
Atomically ORs non-zero per-word Bloom masks into block.
__global__ void insert_sequence_kmers_kernel(const char *sequence, uint64_t num_kmers, filter_block< Config > *shards, uint64_t num_shards)
Insert kernel: sectorized Bloom updates grouped by minimizer shard.
Definition kernels.cuh:223
__global__ void insert_dense_packed_kmers_kernel(const uint64_t *words, uint64_t num_kmers, filter_block< Config > *shards, uint64_t num_shards)
Insert kernel for a dense packed symbol buffer (DensePackedKmerInput).
Definition kernels.cuh:305
constexpr uint64_t dense_packed_insert_word_tile_capacity()
Maximum uint64_t words loaded for a dense-packed insert block tile.
Definition kernels.cuh:21
__global__ void contains_dense_packed_kmers_kernel(const uint64_t *words, uint64_t num_kmers, const filter_block< Config > *shards, uint64_t num_shards, uint8_t *output)
Query kernel for a dense packed symbol buffer (DensePackedKmerInput).
Definition kernels.cuh:263
constexpr uint32_t kContainsSequenceStride
K-mers processed per query thread per inner loop iteration.
constexpr uint64_t dense_packed_query_word_tile_capacity()
Maximum uint64_t words loaded for a dense-packed query block tile.
Definition kernels.cuh:28
__global__ void contains_sequence_kmers_kernel(const char *sequence, uint64_t num_kmers, const filter_block< Config > *shards, uint64_t num_shards, uint8_t *output)
Query kernel: one byte per k-mer (1 = present, 0 = absent or invalid).
Definition kernels.cuh:181
__device__ __forceinline__ void insert_kmers_from_symbol_tile(const uint8_t *sequence_tile, uint64_t block_start_kmer, uint64_t block_kmers, bool block_all_valid, filter_block< Config > *shards, uint64_t num_shards, cub::WarpReduce< uint64_t >::TempStorage reduce_storage[warps_per_block][4])
Shared insert path after a block symbol tile has been prepared.
Definition kernels.cuh:107
consteval bool separatorPositionAlwaysEncodesInvalid(char *input, uint64_t separatorPosition, uint64_t index)
Recursively tests whether placing the separator byte at any position in an input of valid bytes alway...
Definition Alphabet.cuh:37
__device__ __forceinline__ void contains_kmers_from_symbol_tile(const uint8_t *sequence_tile, uint64_t block_start_kmer, uint64_t block_kmers, bool block_all_valid, const filter_block< Config > *shards, uint64_t num_shards, uint8_t *output)
Shared query path after a block symbol tile has been prepared.
Definition kernels.cuh:40
Compile-time configuration for a cusbf::filter.
Definition config.cuh:35
static constexpr uint64_t cudaBlockSize
CUDA threads per kernel block.
Definition config.cuh:57
static constexpr uint64_t findereSpan
S-mers hashed per k-mer (findere).
Definition config.cuh:66
static constexpr uint16_t k
K-mer length in symbols.
Definition config.cuh:39
Device functor for bitwise OR reduction (CUB WarpReduce).
One 256-bit filter block stored as an array of Config::blockWordCount words.
__device__ static __forceinline__ void sectorizedHashToMasks(uint64_t baseHash, uint64_t &mask0, uint64_t &mask1, uint64_t &mask2, uint64_t &mask3)
Accumulates Bloom bit masks for all hash indices into four shard words.