52#include <unordered_map>
68 std::is_same_v<T, uint8_t> ||
69 std::is_same_v<T, uint16_t> ||
70 std::is_same_v<T, uint32_t>,
71 "BitpackStage: T must be uint8_t, uint16_t, or uint32_t.");
77 void setInverse(
bool inv)
override { is_inverse_ = inv; }
78 bool isInverse()
const override {
return is_inverse_; }
94 if (nbits == 0 || nbits > 8 *
sizeof(T) || (nbits & (nbits - 1)) != 0)
95 throw std::invalid_argument(
96 "BitpackStage::setNBits: nbits must be a power of two "
97 "in [1, " + std::to_string(8 *
sizeof(T)) +
"], got "
98 + std::to_string(nbits));
101 uint8_t getNBits()
const {
return nbits_; }
111 T getBase()
const {
return base_; }
125 if (shift >= 8 *
sizeof(T))
126 throw std::invalid_argument(
127 "BitpackStage::setShift: shift must be in [0, "
128 + std::to_string(8 *
sizeof(T) - 1) +
"], got "
129 + std::to_string(shift));
132 uint8_t getShift()
const {
return shift_; }
148 bool isAutoDetect()
const {
return auto_detect_; }
156 bool isAutoBase()
const {
return auto_base_; }
166 bool isAutoShift()
const {
return auto_shift_; }
175 auto_base_ = auto_shift_ = auto_detect_ = enable;
182 const std::vector<void*>& inputs,
183 const std::vector<void*>& outputs,
184 const std::vector<size_t>& sizes
188 std::string
getName()
const override {
return "Bitpack"; }
189 size_t getNumInputs()
const override {
return 1; }
190 size_t getNumOutputs()
const override {
return 1; }
193 const std::vector<size_t>& input_sizes
195 if (input_sizes.empty())
return {0};
200 return {input_sizes[0]};
203 const size_t n = input_sizes[0] /
sizeof(T);
204 return {(n * nbits_ + 7) / 8};
208 const size_t max_elems = (input_sizes[0] * 8 + nbits_ - 1) / nbits_;
209 return {max_elems *
sizeof(T)};
213 std::unordered_map<std::string, size_t>
215 return {{
"output", actual_output_size_}};
219 return (index == 0) ? actual_output_size_ : 0;
225 return static_cast<uint16_t
>(StageType::BITPACK);
239 size_t , uint8_t* buf,
size_t max_size
241 if (max_size < 15)
return 0;
242 buf[0] =
static_cast<uint8_t
>(dataTypeOf<T>());
244 std::memcpy(buf + 2, &num_elements_,
sizeof(uint64_t));
246 const uint32_t base32 =
static_cast<uint32_t
>(base_);
247 std::memcpy(buf + 11, &base32,
sizeof(uint32_t));
254 if (size >= 2) nbits_ = buf[1];
255 if (size >= 10) std::memcpy(&num_elements_, buf + 2,
sizeof(uint64_t));
260 std::memcpy(&base32, buf + 11,
sizeof(uint32_t));
261 base_ =
static_cast<T
>(base32);
271 saved_nbits_ = nbits_;
272 saved_num_elements_ = num_elements_;
273 saved_output_size_ = actual_output_size_;
274 saved_shift_ = shift_;
278 void restoreState()
override {
279 nbits_ = saved_nbits_;
280 num_elements_ = saved_num_elements_;
281 actual_output_size_ = saved_output_size_;
282 shift_ = saved_shift_;
289 return !(auto_detect_ || auto_base_ || auto_shift_);
293 bool is_inverse_ =
false;
294 bool auto_detect_ =
false;
295 bool auto_base_ =
false;
296 bool auto_shift_ =
false;
297 uint8_t nbits_ = 8 *
sizeof(T);
300 uint64_t num_elements_ = 0;
301 size_t actual_output_size_ = 0;
304 uint8_t saved_nbits_ = 8 *
sizeof(T);
305 uint8_t saved_shift_ = 0;
306 T saved_base_ = T(0);
307 uint64_t saved_num_elements_ = 0;
308 size_t saved_output_size_ = 0;
311 static constexpr DataType dataTypeOf() {
312 if (std::is_same_v<U, uint8_t>)
return DataType::UINT8;
313 if (std::is_same_v<U, uint16_t>)
return DataType::UINT16;
314 if (std::is_same_v<U, uint32_t>)
return DataType::UINT32;
315 return DataType::UINT8;
319extern template class BitpackStage<uint8_t>;
320extern template class BitpackStage<uint16_t>;
321extern template class BitpackStage<uint32_t>;
Definition bitpack_stage.h:66
void setAdaptive(bool enable)
Definition bitpack_stage.h:174
void setAutoShift(bool enable)
Definition bitpack_stage.h:165
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
Definition bitpack_stage.h:192
void saveState() override
Definition bitpack_stage.h:270
bool isGraphCompatible() const override
Definition bitpack_stage.h:288
void execute(fz::stream_t stream, MemoryPool *pool, const std::vector< void * > &inputs, const std::vector< void * > &outputs, const std::vector< size_t > &sizes) override
size_t getActualOutputSize(int index) const override
Definition bitpack_stage.h:218
uint8_t getInputDataType(size_t) const override
Definition bitpack_stage.h:232
void setShift(uint8_t shift)
Definition bitpack_stage.h:124
std::string getName() const override
Definition bitpack_stage.h:188
void setAutoDetect(bool enable)
Definition bitpack_stage.h:147
uint16_t getStageTypeId() const override
Definition bitpack_stage.h:224
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition bitpack_stage.h:214
size_t getMaxHeaderSize(size_t) const override
Definition bitpack_stage.h:265
void setInverse(bool inv) override
Definition bitpack_stage.h:77
uint8_t getOutputDataType(size_t) const override
Definition bitpack_stage.h:229
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition bitpack_stage.h:251
void setAutoBase(bool enable)
Definition bitpack_stage.h:155
size_t serializeHeader(size_t, uint8_t *buf, size_t max_size) const override
Definition bitpack_stage.h:238
void setNBits(uint8_t nbits)
Definition bitpack_stage.h:93
void setBase(T base)
Definition bitpack_stage.h:110
Definition algorithms.h:48
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:117
@ UNKNOWN
Byte-transparent stages: skip type checking at finalize()
Base class interface for all compression stages.
Backend-neutral GPU type aliases.