31#include <unordered_map>
60 "SZxConfig must fit in FZM_STAGE_CONFIG_SIZE");
84 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
85 "SZxStage: T must be float or double.");
91 void setInverse(
bool inv)
override { is_inverse_ = inv; }
92 bool isInverse()
const override {
return is_inverse_; }
98 return !is_inverse_ && eb_mode_ != SZxErrorMode::NOA;
101 void setBlockSize(uint32_t n) {
102 if (n == 0 || n > 4096)
103 throw std::invalid_argument(
104 "SZxStage::setBlockSize: n must be in [1, 4096], got "
105 + std::to_string(n));
108 uint32_t getBlockSize()
const {
return block_size_; }
110 void setErrorBound(
double eb) { user_eb_ = eb; }
111 double getErrorBound()
const {
return user_eb_; }
121 const std::vector<void*>& inputs,
122 const std::vector<void*>& outputs,
123 const std::vector<size_t>& sizes)
override;
131 double resolveAbsEb(fz::stream_t stream,
MemoryPool* pool,
const T* d_in,
size_t n);
136 std::string
getName()
const override {
return "SZx"; }
137 size_t getNumInputs()
const override {
return 1; }
138 size_t getNumOutputs()
const override {
return 1; }
141 const std::vector<size_t>& input_sizes)
const override;
143 const std::vector<size_t>& input_sizes)
const override;
145 std::unordered_map<std::string, size_t>
147 return {{
"output", actual_output_size_}};
150 return (index == 0) ? actual_output_size_ : 0;
158 return static_cast<uint8_t
>(is_inverse_ ? getElementDataType()
162 return static_cast<uint8_t
>(is_inverse_ ? DataType::UINT8
163 : getElementDataType());
168 if (max_size <
sizeof(
SZxConfig))
return 0;
171 cfg.
eb_mode =
static_cast<uint8_t
>(eb_mode_);
173 cfg.
num_elements =
static_cast<uint64_t
>(num_elements_);
176 std::memcpy(buf, &cfg,
sizeof(cfg));
181 throw std::runtime_error(
"SZxStage: header too small");
183 std::memcpy(&cfg, buf,
sizeof(cfg));
193 saved_ = {block_size_, num_elements_, actual_output_size_, abs_eb_, value_base_};
195 void restoreState()
override {
196 block_size_ = saved_.block_size;
197 num_elements_ = saved_.num_elements;
198 actual_output_size_ = saved_.actual_size;
199 abs_eb_ = saved_.abs_eb;
200 value_base_ = saved_.value_base;
203 size_t getNumElements()
const {
return num_elements_; }
206 bool is_inverse_ =
false;
207 uint32_t block_size_ = 128;
209 double user_eb_ = 1e-3;
210 double abs_eb_ = 0.0;
211 double value_base_ = 0.0;
212 size_t num_elements_ = 0;
213 size_t actual_output_size_= 0;
214 double const_block_frac_ = 0.0;
219 uint32_t* d_block_cost_ =
nullptr;
220 uint32_t* d_block_offset_ =
nullptr;
221 size_t scratch_blocks_ = 0;
222 MemoryPool* scratch_pool_ =
nullptr;
223 size_t fwd_num_blocks_ = 0;
224 size_t fwd_meta_bytes_ = 0;
226 struct Saved { uint32_t block_size;
size_t num_elements;
size_t actual_size;
227 double abs_eb;
double value_base; };
228 Saved saved_{128, 0, 0, 0.0, 0.0};
230 static DataType getElementDataType() {
231 return std::is_same<T, float>::value ? DataType::FLOAT32 : DataType::FLOAT64;
235extern template class SZxStage<float>;
236extern template class SZxStage<double>;
Definition szx_stage.h:83
size_t getActualOutputSize(int index) const override
Definition szx_stage.h:149
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition szx_stage.h:146
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
bool isGraphCompatible() const override
Definition szx_stage.h:97
std::string getName() const override
Definition szx_stage.h:136
uint8_t getInputDataType(size_t) const override
Definition szx_stage.h:161
size_t estimateScratchBytes(const std::vector< size_t > &input_sizes) const override
void setInverse(bool inv) override
Definition szx_stage.h:91
std::vector< std::string > getRunNotes() const override
double getConstantBlockFraction() const
Definition szx_stage.h:117
size_t getMaxHeaderSize(size_t) const override
Definition szx_stage.h:190
void postStreamSync(fz::stream_t stream) override
uint8_t getOutputDataType(size_t) const override
Definition szx_stage.h:157
uint16_t getStageTypeId() const override
Definition szx_stage.h:154
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition szx_stage.h:179
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
void saveState() override
Definition szx_stage.h:192
size_t serializeHeader(size_t, uint8_t *buf, size_t max_size) const override
Definition szx_stage.h:167
@ NOA
Value-range relative bound (norm-of-absolute).
@ ABS
Absolute error bound.
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
@ SZX
SZx ultrafast EB compressor: per-block constant/non-constant classification + fixed-length residuals ...
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:139
SZxErrorMode
Definition szx_stage.h:41
Base class interface for all compression stages.
Definition szx_stage.h:46
uint8_t eb_mode
SZxErrorMode cast to uint8_t.
Definition szx_stage.h:48
uint32_t block_size
Elements per block (SZx default 128).
Definition szx_stage.h:50
double value_base
value_range used for NOA→ABS conversion; else 0.
Definition szx_stage.h:53
DataType data_type
FLOAT32 / FLOAT64 (1B).
Definition szx_stage.h:47
uint8_t _pad[2]
Must be zero.
Definition szx_stage.h:49
double error_bound
Absolute bound after mode conversion (f64-safe).
Definition szx_stage.h:52
uint64_t num_elements
Original element count (sizes the inverse).
Definition szx_stage.h:51
Backend-neutral GPU type aliases.