cuSBF
Loading...
Searching...
No Matches
dense_packed.hpp
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 <cstdint>
7#include <string_view>
8#include <vector>
9
10#include <cusbf/config.cuh>
12#include <cusbf/helpers.cuh>
13
14namespace cusbf {
15
17template <typename Config>
18[[nodiscard]] constexpr uint64_t dense_packed_word_count(uint64_t num_symbols) {
20}
21
23template <typename Config>
24[[nodiscard]] constexpr uint64_t dense_packed_kmer_count(uint64_t num_symbols) {
26}
27
35template <typename Config>
36[[nodiscard]] std::vector<uint64_t> pack_dense_sequence(std::string_view sequence) {
37 const uint64_t num_symbols = sequence.size() / Config::symbolWidth;
38 std::vector<uint64_t> words(dense_packed_word_count<Config>(num_symbols), 0);
39 constexpr uint64_t symbols_per_word = detail::dense_packed_symbols_per_word<Config>();
40 for (uint64_t symbol_index = 0; symbol_index < num_symbols; ++symbol_index) {
41 const uint8_t symbol =
42 Config::Alphabet::encode(sequence.data() + symbol_index * Config::symbolWidth);
43 const uint64_t word_index = symbol_index / symbols_per_word;
44 const auto bit_offset =
45 static_cast<unsigned>((symbol_index % symbols_per_word) * Config::symbolBits);
46 words[word_index] |= (static_cast<uint64_t>(symbol & Config::symbolMask) << bit_offset);
47 }
48 return words;
49}
50
57template <typename Config>
59 const char* d_sequence,
60 uint64_t num_symbols,
61 uint64_t* d_words,
62 cudaStream_t stream = {}
63) {
64 if (num_symbols == 0) {
65 return;
66 }
67 constexpr uint64_t block_size = 256;
68 const uint64_t num_words = dense_packed_word_count<Config>(num_symbols);
69 const uint64_t grid_size = cuda::ceil_div(num_words, block_size);
71 <<<grid_size, block_size, 0, stream>>>(d_sequence, num_symbols, d_words);
72 CUSBF_CUDA_CALL(cudaGetLastError());
73}
74
75} // namespace cusbf
#define CUSBF_CUDA_CALL(err)
Checks a CUDA runtime call and throws std::runtime_error on failure.
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
std::vector< uint64_t > pack_dense_sequence(std::string_view sequence)
Packs an ASCII sequence into dense symbolBits-wide uint64_t words.
void pack_dense_sequence_device(const char *d_sequence, uint64_t num_symbols, uint64_t *d_words, cudaStream_t stream={})
Packs a device-resident encoded byte sequence into dense uint64_t words.
constexpr uint64_t dense_packed_kmer_count(uint64_t num_symbols)
Returns the number of k-mer windows in a dense packed symbol sequence.
constexpr uint64_t dense_packed_word_count(uint64_t num_symbols)
Returns the number of uint64_t words required for num_symbols encoded symbols.
static constexpr uint64_t symbolWidth
Input bytes per symbol.
Definition config.cuh:49
static constexpr uint64_t symbolMask
Low symbolBits mask for one encoded symbol.
Definition config.cuh:53
static constexpr uint64_t symbolBits
Bits per packed symbol in a uint64_t k-mer.
Definition config.cuh:51