28#include <unordered_map>
54 , actual_output_size_(0)
58 void setInverse(
bool inv)
override { is_inverse_ = inv; }
59 bool isInverse()
const override {
return is_inverse_; }
61 void setBlockSize(
size_t bytes) { block_size_ =
static_cast<uint32_t
>(bytes); }
62 void setWordSize(
size_t bytes) { word_size_ =
static_cast<uint8_t
>(bytes); }
63 void setDim(
size_t dim) { dim_ =
static_cast<uint8_t
>(dim); }
65 size_t getBlockSize()
const {
return block_size_; }
67 size_t getWordSize()
const {
return word_size_; }
68 size_t getDim()
const {
return dim_; }
74 const std::vector<void*>& inputs,
75 const std::vector<void*>& outputs,
76 const std::vector<size_t>& sizes
80 std::string
getName()
const override {
return "TUPL"; }
81 size_t getNumInputs()
const override {
return 1; }
82 size_t getNumOutputs()
const override {
return 1; }
85 const std::vector<size_t>& input_sizes
88 return {input_sizes[0]};
91 std::unordered_map<std::string, size_t>
93 return {{
"output", actual_output_size_}};
96 return (index == 0) ? actual_output_size_ : 0;
105 return static_cast<uint8_t
>(DataType::UINT8);
111 size_t output_index, uint8_t* buf,
size_t max_size
114 if (max_size < 6)
return 0;
115 std::memcpy(buf, &block_size_,
sizeof(uint32_t));
122 if (size >= 4) std::memcpy(&block_size_, buf,
sizeof(uint32_t));
123 if (size >= 5) word_size_ = buf[4];
124 if (size >= 6) dim_ = buf[5];
130 saved_block_size_ = block_size_;
131 saved_word_size_ = word_size_;
133 saved_actual_output_size_ = actual_output_size_;
136 void restoreState()
override {
137 block_size_ = saved_block_size_;
138 word_size_ = saved_word_size_;
140 actual_output_size_ = saved_actual_output_size_;
145 uint32_t block_size_;
146 uint32_t saved_block_size_ = 0;
148 uint8_t saved_word_size_ = 0;
150 uint8_t saved_dim_ = 0;
151 size_t actual_output_size_ = 0;
152 size_t saved_actual_output_size_ = 0;
160 void validateConfig()
const {
161 if (word_size_ != 1 && word_size_ != 2 && word_size_ != 4 && word_size_ != 8)
162 throw std::invalid_argument(
163 "TUPLStage: word_size must be 1, 2, 4, or 8");
165 throw std::invalid_argument(
"TUPLStage: dim must be >= 2");
166 if (block_size_ == 0 || block_size_ % word_size_ != 0)
167 throw std::invalid_argument(
168 "TUPLStage: block_size must be a positive multiple of word_size");
Definition tupl_stage.h:47
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition tupl_stage.h:121
void setInverse(bool inv) override
Definition tupl_stage.h:58
std::string getName() const override
Definition tupl_stage.h:80
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
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
Definition tupl_stage.h:84
size_t serializeHeader(size_t output_index, uint8_t *buf, size_t max_size) const override
Definition tupl_stage.h:110
uint8_t getOutputDataType(size_t) const override
Definition tupl_stage.h:103
void saveState() override
Definition tupl_stage.h:129
uint16_t getStageTypeId() const override
Definition tupl_stage.h:99
size_t getMaxHeaderSize(size_t) const override
Definition tupl_stage.h:127
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition tupl_stage.h:92
size_t getRequiredInputAlignment() const override
Definition tupl_stage.h:66
size_t getActualOutputSize(int index) const override
Definition tupl_stage.h:95
Definition algorithms.h:48
@ TUPL
Tuple deinterleave (AoS -> SoA) transpose (LC framework lossless component)
Base class interface for all compression stages.
Backend-neutral GPU type aliases.