cuSBF
Loading...
Searching...
No Matches
filter_impl.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>
9
10namespace cusbf {
11
18template <typename Config>
19struct alignas(32) filter_block {
20 static constexpr uint64_t wordCount = Config::blockWordCount;
21 static constexpr uint64_t wordBits = Config::wordBits;
22 static constexpr int wordBitsLog2 = cuda::std::bit_width(wordBits) - 1;
23 static constexpr uint64_t wordMask = (1ULL << wordBitsLog2) - 1;
24 static constexpr int hashShift = 64 - wordBitsLog2;
25 static constexpr uint64_t sliceWidth = 64 / Config::hashCount;
26 static constexpr bool useBitSlicing = sliceWidth >= wordBitsLog2;
27
29 uint64_t words[wordCount];
30
36 template <uint64_t HashIndex>
37 [[nodiscard]] constexpr __host__ __device__ static uint64_t sectorizedBitAddress(
38 uint64_t baseHash
39 ) {
40 static_assert(HashIndex < Config::hashCount, "Hash index out of range");
41 if constexpr (useBitSlicing) {
42 return (baseHash >> (sliceWidth * HashIndex)) & wordMask;
43 } else {
44 const uint64_t mixed = baseHash * detail::multiplicativeSaltLiteral<HashIndex>();
45 return mixed >> hashShift;
46 }
47 }
48
54 __device__ __forceinline__ static void sectorizedHashToMasks(
55 uint64_t baseHash,
56 uint64_t& mask0,
57 uint64_t& mask1,
58 uint64_t& mask2,
59 uint64_t& mask3
60 ) {
62 [&]<uint64_t HashIndex>(std::integral_constant<uint64_t, HashIndex>) {
63 constexpr uint64_t s = HashIndex % Config::blockWordCount;
64 const uint64_t bit_pos = sectorizedBitAddress<HashIndex>(baseHash);
65 const uint64_t bit = uint64_t{1} << bit_pos;
66 if constexpr (s == 0) {
67 mask0 |= bit;
68 } else if constexpr (s == 1) {
69 mask1 |= bit;
70 } else if constexpr (s == 2) {
71 mask2 |= bit;
72 } else {
73 mask3 |= bit;
74 }
75 }
76 );
77 }
78};
79
80} // namespace cusbf
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 hashCount
Independent Bloom hash functions.
Definition config.cuh:45
static constexpr uint64_t wordBits
Bits per shard word.
Definition config.cuh:60
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.
static constexpr bool useBitSlicing
static constexpr uint64_t wordCount
static constexpr int wordBitsLog2
static constexpr uint64_t wordMask
constexpr __host__ static __device__ uint64_t sectorizedBitAddress(uint64_t baseHash)
Bit position within shard word HashIndex % blockWordCount for baseHash.
static constexpr int hashShift
static constexpr uint64_t wordBits
uint64_t words[wordCount]
Sector words, hash i maps to word i % blockWordCount.
static constexpr uint64_t sliceWidth