tatami_chunked
Helpers to create custom chunked tatami matrices
Loading...
Searching...
No Matches
SlabCacheStats.hpp
Go to the documentation of this file.
1#ifndef TATAMI_CHUNKED_SLAB_CACHE_STATS_HPP
2#define TATAMI_CHUNKED_SLAB_CACHE_STATS_HPP
3
4#include <algorithm>
5#include <cstddef>
6
7#include "sanisizer/sanisizer.hpp"
8
14namespace tatami_chunked {
15
25template<typename MaxSlabs_>
31
37
52 template<typename Index_, typename TargetNumSlabs_>
53 SlabCacheStats(Index_ target_length, Index_ non_target_length, TargetNumSlabs_ target_num_slabs, std::size_t cache_size_in_elements, bool require_minimum_cache) :
54 // Don't be tempted to do unsafe casts of target_length to size_t,
55 // as this class might be used outside of the tatami::Matrix contract (i.e., Index_ might store values beyond std::size_t).
56 slab_size_in_elements(sanisizer::product<std::size_t>(target_length, non_target_length)),
57 max_slabs_in_cache(compute_max_slabs_in_cache(slab_size_in_elements, target_num_slabs, cache_size_in_elements, require_minimum_cache))
58 {}
59
76 template<typename Index_, typename TargetNumSlabs_>
77 SlabCacheStats(Index_ target_length, Index_ non_target_length, TargetNumSlabs_ target_num_slabs, std::size_t cache_size_in_bytes, std::size_t element_size, bool require_minimum_cache) :
78 slab_size_in_elements(sanisizer::product<std::size_t>(target_length, non_target_length)),
80 if (element_size == 0) {
81 return sanisizer::cap<MaxSlabs_>(target_num_slabs);
82 } else {
83 return compute_max_slabs_in_cache(slab_size_in_elements, target_num_slabs, cache_size_in_bytes / element_size, require_minimum_cache);
84 }
85 }())
86 {}
87
88private:
89 template<typename NumSlabs_>
90 static MaxSlabs_ compute_max_slabs_in_cache(std::size_t slab_size_in_elements, NumSlabs_ num_slabs, std::size_t cache_size_in_elements, bool require_minimum_cache) {
91 if (slab_size_in_elements == 0) {
92 return sanisizer::cap<MaxSlabs_>(num_slabs);
93 }
94
95 auto tmp = cache_size_in_elements / slab_size_in_elements;
96 if (tmp == 0 && require_minimum_cache) {
97 return 1;
98 }
99
100 if (sanisizer::is_less_than_or_equal(tmp, num_slabs)) {
101 return sanisizer::cast<MaxSlabs_>(tmp);
102 } else {
103 return sanisizer::cast<MaxSlabs_>(num_slabs);
104 }
105 }
106};
107
108}
109
110#endif
Methods to handle chunked tatami matrices.
Definition ChunkDimensionStats.hpp:11
Statistics for slab caching.
Definition SlabCacheStats.hpp:26
MaxSlabs_ max_slabs_in_cache
Definition SlabCacheStats.hpp:36
std::size_t slab_size_in_elements
Definition SlabCacheStats.hpp:30
SlabCacheStats(Index_ target_length, Index_ non_target_length, TargetNumSlabs_ target_num_slabs, std::size_t cache_size_in_elements, bool require_minimum_cache)
Definition SlabCacheStats.hpp:53
SlabCacheStats(Index_ target_length, Index_ non_target_length, TargetNumSlabs_ target_num_slabs, std::size_t cache_size_in_bytes, std::size_t element_size, bool require_minimum_cache)
Definition SlabCacheStats.hpp:77