cuSBF
Loading...
Searching...
No Matches
config.cuh
Go to the documentation of this file.
1#pragma once
2
3#include <cuda/std/bit>
4
5#include <cusbf/Alphabet.cuh>
6
7namespace cusbf {
8
10template <typename Config>
11class filter;
12
28template <
29 uint16_t K_,
30 uint16_t S_,
31 uint16_t M_,
32 uint64_t HashCount_ = 4,
33 uint64_t CudaBlockSize_ = 256,
34 Alphabet Alphabet_ = DnaAlphabet>
35struct Config {
36 using Alphabet = Alphabet_;
37
39 static constexpr uint16_t k = K_;
41 static constexpr uint16_t m = M_;
43 static constexpr uint16_t s = S_;
45 static constexpr uint64_t hashCount = HashCount_;
47 static constexpr uint64_t alphabetSize = Alphabet::symbolCount;
49 static constexpr uint64_t symbolWidth = Alphabet::symbolWidth;
51 static constexpr uint64_t symbolBits = cuda::std::bit_width(alphabetSize - 1);
53 static constexpr uint64_t symbolMask = (uint64_t{1} << symbolBits) - 1;
55 static constexpr uint64_t filterBlockBits = 256;
57 static constexpr uint64_t cudaBlockSize = CudaBlockSize_;
58
60 static constexpr uint64_t wordBits = 64;
62 static constexpr uint64_t blockWordCount = filterBlockBits / wordBits;
64 static constexpr uint64_t minimizerSpan = k - m + 1;
66 static constexpr uint64_t findereSpan = k - s + 1;
68 static constexpr uint64_t insertGroupSize = blockWordCount;
70 static constexpr uint64_t queryGroupSize = 1;
72 static constexpr uint64_t maxRunKmers = cudaBlockSize;
73
74 static_assert(k > 0, "k must be positive");
75 static_assert(symbolWidth > 0, "alphabet symbolWidth must be positive");
76 static_assert(m > 0 && m <= k, "m must satisfy 0 < m <= k");
77 static_assert(s > 0 && s <= k, "s must satisfy 0 < s <= k");
78 static_assert(k * symbolBits <= 64, "k-mer must fit in one packed uint64_t");
79 static_assert(m * symbolBits <= 64, "m-mer must fit in one packed uint64_t");
80 static_assert(s * symbolBits <= 64, "s-mer must fit in one packed uint64_t");
81 static_assert(hashCount > 0, "At least one Bloom hash is required");
82 static_assert(hashCount <= 16, "This implementation provides 16 multiplicative salts");
83 static_assert(filterBlockBits >= wordBits, "Filter block must contain at least one word");
84 static_assert(
85 cuda::std::has_single_bit(filterBlockBits),
86 "Filter block size must be a power of two"
87 );
88 static_assert(filterBlockBits % wordBits == 0, "Filter block size must align to the word size");
89 static_assert(blockWordCount <= 32, "At most one warp may cooperate on a filter block");
90 static_assert(
91 cuda::std::has_single_bit(blockWordCount),
92 "blockWordCount must be a power of two"
93 );
94 static_assert(insertGroupSize <= 32, "insertGroupSize must fit in one warp");
95 static_assert(queryGroupSize <= 32, "queryGroupSize must fit in one warp");
96 static_assert(
97 cuda::std::has_single_bit(insertGroupSize),
98 "insertGroupSize must be a power of two"
99 );
100 static_assert(
101 cuda::std::has_single_bit(queryGroupSize),
102 "queryGroupSize must be a power of two"
103 );
104 static_assert(
106 "Sectorized layout requires hashCount >= blockWordCount"
107 );
108 static_assert(
110 "Hash count must distribute evenly across shard words"
111 );
112 static_assert(cudaBlockSize % 32 == 0, "CUDA block size must be a multiple of one warp");
113 static_assert(
115 "cudaBlockSize must divide insertGroupSize"
116 );
117 static_assert(cudaBlockSize % queryGroupSize == 0, "cudaBlockSize must divide queryGroupSize");
118};
119
120} // namespace cusbf
Concept for alphabet-like types used to encode bytes as symbol indices.
Definition Alphabet.cuh:95
Compile-time configuration for a cusbf::filter.
Definition config.cuh:35
static constexpr uint64_t symbolWidth
Input bytes per symbol.
Definition config.cuh:49
static constexpr uint64_t blockWordCount
64-bit words per 256-bit shard.
Definition config.cuh:62
static constexpr uint64_t alphabetSize
Number of symbols in the alphabet.
Definition config.cuh:47
static constexpr uint16_t s
S-mer width (Bloom hash seed) in symbols.
Definition config.cuh:43
static constexpr uint64_t hashCount
Independent Bloom hash functions.
Definition config.cuh:45
static constexpr uint16_t m
Minimizer width in symbols.
Definition config.cuh:41
static constexpr uint64_t symbolMask
Low symbolBits mask for one encoded symbol.
Definition config.cuh:53
static constexpr uint64_t minimizerSpan
M-mers evaluated per k-mer window.
Definition config.cuh:64
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 uint64_t maxRunKmers
Max consecutive k-mers per warp run.
Definition config.cuh:72
static constexpr uint64_t wordBits
Bits per shard word.
Definition config.cuh:60
static constexpr uint16_t k
K-mer length in symbols.
Definition config.cuh:39
static constexpr uint64_t insertGroupSize
Threads cooperating on insert.
Definition config.cuh:68
static constexpr uint64_t filterBlockBits
Bits per shard (filter block).
Definition config.cuh:55
static constexpr uint64_t symbolBits
Bits per packed symbol in a uint64_t k-mer.
Definition config.cuh:51
static constexpr uint64_t queryGroupSize
Threads cooperating on query (fused path).
Definition config.cuh:70