cuSBF
Loading...
Searching...
No Matches
filter_ref.cuh
Go to the documentation of this file.
1#pragma once
2
3#include <cuda/std/bit>
4
5#include <cstdint>
6
7#include <cusbf/config.cuh>
11#include <cusbf/device_span.cuh>
12
13namespace cusbf {
14
20template <typename Config>
22 public:
24
26 __host__ __device__ constexpr filter_ref() noexcept : blocks_{}, num_blocks_{} {}
27
33 __host__ __device__ constexpr filter_ref(block_type* blocks, uint64_t num_blocks) noexcept
34 : blocks_(blocks), num_blocks_(num_blocks) {}
35
37 [[nodiscard]] __host__ __device__ block_type* blocks() const noexcept {
38 return blocks_;
39 }
40
42 [[nodiscard]] __host__ __device__ uint64_t num_blocks() const noexcept {
43 return num_blocks_;
44 }
45
52 [[nodiscard]] __host__ __device__ static uint64_t
53 shard_index(uint64_t minimizer_hash, uint64_t num_blocks) noexcept {
54 return minimizer_hash & (num_blocks - 1);
55 }
56
58 [[nodiscard]] __device__ uint64_t shard_index(uint64_t minimizer_hash) const noexcept {
59 return shard_index(minimizer_hash, num_blocks_);
60 }
61
70 [[nodiscard]] __device__ static bool
71 sectorized_contains_packed_kmer(uint64_t packed_kmer, const uint64_t* shard_words) {
72 bool present = true;
73 _Pragma("unroll")
74 for (uint64_t smer_offset = 0; smer_offset < Config::findereSpan; ++smer_offset) {
75 const uint64_t smer_hash =
76 detail::packed_kmer_smer_hash<Config>(packed_kmer, smer_offset);
78 [&]<uint64_t HashIndex>(std::integral_constant<uint64_t, HashIndex>) {
79 constexpr uint64_t s = HashIndex % Config::blockWordCount;
80 const uint64_t bit_pos =
81 block_type::template sectorizedBitAddress<HashIndex>(smer_hash);
82 present &= ((shard_words[s] >> bit_pos) & 1) != 0;
83 }
84 );
85 }
86 return present;
87 }
88
94 __device__ void
95 apply_word_masks(block_type& block, uint64_t m0, uint64_t m1, uint64_t m2, uint64_t m3) const {
96 if (m0 != 0) {
97 detail::atomicOrWord(&block.words[0], m0);
98 }
99 if (m1 != 0) {
100 detail::atomicOrWord(&block.words[1], m1);
101 }
102 if (m2 != 0) {
103 detail::atomicOrWord(&block.words[2], m2);
104 }
105 if (m3 != 0) {
106 detail::atomicOrWord(&block.words[3], m3);
107 }
108 }
109
110 private:
111 block_type* blocks_{};
112 uint64_t num_blocks_{};
113};
114
115} // namespace cusbf
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.
filter_block< Config > block_type
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.
__host__ __device__ uint64_t num_blocks() const noexcept
Number of power-of-two shards in this filter.
__device__ uint64_t shard_index(uint64_t minimizer_hash) const noexcept
Shard index for minimizer_hash within this filter.
__host__ __device__ constexpr filter_ref(block_type *blocks, uint64_t num_blocks) noexcept
Constructs a reference over blocks spanning num_blocks shards.
__host__ __device__ block_type * blocks() const noexcept
Raw pointer to the first 256-bit filter block (shard array base).
__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.
__host__ __device__ constexpr filter_ref() noexcept
Default-constructed empty reference (no shard storage).
__device__ __forceinline__ void atomicOrWord(uint64_t *ptr, uint64_t value)
64-bit atomic OR used for sectorized Bloom inserts.
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
static constexpr uint64_t blockWordCount
64-bit words per 256-bit shard.
Definition config.cuh:62
static constexpr uint64_t findereSpan
S-mers hashed per k-mer (findere).
Definition config.cuh:66
One 256-bit filter block stored as an array of Config::blockWordCount words.
uint64_t words[wordCount]
Sector words, hash i maps to word i % blockWordCount.