48#include <unordered_map>
53enum class SZpErrorMode : uint8_t { ABS = 0, NOA = 2 };
61 uint64_t num_elements;
70 "SZpConfig must fit in FZM_STAGE_CONFIG_SIZE");
86 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
87 "SZpStage: T must be float or double.");
92 void setInverse(
bool inv)
override { is_inverse_ = inv; }
93 bool isInverse()
const override {
return is_inverse_; }
98 return !is_inverse_ && eb_mode_ != SZpErrorMode::NOA;
101 void setBlockSize(uint32_t n) {
102 if (n == 0 || n > 4096)
103 throw std::invalid_argument(
"SZpStage::setBlockSize: n in [1,4096]");
106 uint32_t getBlockSize()
const {
return block_size_; }
107 void setErrorBound(
double eb) { user_eb_ = eb; }
108 double getErrorBound()
const {
return user_eb_; }
109 void setErrorMode(SZpErrorMode m) { eb_mode_ = m; }
110 SZpErrorMode getErrorMode()
const {
return eb_mode_; }
113 const std::vector<void*>& inputs,
114 const std::vector<void*>& outputs,
115 const std::vector<size_t>& sizes)
override;
121 double resolveAbsEb(fz::stream_t stream,
MemoryPool* pool,
const T* d_in,
size_t n);
124 std::string
getName()
const override {
return "SZp"; }
125 size_t getNumInputs()
const override {
return 1; }
126 size_t getNumOutputs()
const override {
return 1; }
129 const std::vector<size_t>& input_sizes)
const override;
131 const std::vector<size_t>& input_sizes)
const override;
133 std::unordered_map<std::string, size_t>
135 return {{
"output", actual_output_size_}};
138 return (index == 0) ? actual_output_size_ : 0;
145 return static_cast<uint8_t
>(is_inverse_ ? getElementDataType()
149 return static_cast<uint8_t
>(is_inverse_ ? DataType::UINT8
150 : getElementDataType());
154 if (max_size <
sizeof(
SZpConfig))
return 0;
157 cfg.
eb_mode =
static_cast<uint8_t
>(eb_mode_);
159 cfg.num_elements =
static_cast<uint64_t
>(num_elements_);
162 std::memcpy(buf, &cfg,
sizeof(cfg));
167 throw std::runtime_error(
"SZpStage: header too small");
168 SZpConfig cfg; std::memcpy(&cfg, buf,
sizeof(cfg));
170 num_elements_ =
static_cast<size_t>(cfg.num_elements);
171 eb_mode_ =
static_cast<SZpErrorMode
>(cfg.
eb_mode);
178 saved_ = {block_size_, num_elements_, actual_output_size_, abs_eb_, value_base_};
180 void restoreState()
override {
181 block_size_ = saved_.block_size; num_elements_ = saved_.num_elements;
182 actual_output_size_ = saved_.actual_size; abs_eb_ = saved_.abs_eb;
183 value_base_ = saved_.value_base;
185 size_t getNumElements()
const {
return num_elements_; }
188 bool is_inverse_ =
false;
189 uint32_t block_size_ = 128;
190 SZpErrorMode eb_mode_ = SZpErrorMode::ABS;
191 double user_eb_ = 1e-3;
192 double abs_eb_ = 0.0;
193 double value_base_ = 0.0;
194 size_t num_elements_ = 0;
195 size_t actual_output_size_= 0;
197 uint32_t* d_block_cost_ =
nullptr;
198 uint32_t* d_block_offset_ =
nullptr;
199 size_t scratch_blocks_ = 0;
200 MemoryPool* scratch_pool_ =
nullptr;
201 size_t fwd_num_blocks_ = 0;
202 size_t fwd_meta_bytes_ = 0;
204 struct Saved { uint32_t block_size;
size_t num_elements;
size_t actual_size;
205 double abs_eb;
double value_base; };
206 Saved saved_{128, 0, 0, 0.0, 0.0};
208 static DataType getElementDataType() {
209 return std::is_same<T, float>::value ? DataType::FLOAT32 : DataType::FLOAT64;
213extern template class SZpStage<float>;
214extern template class SZpStage<double>;
Definition szp_stage.h:85
bool isGraphCompatible() const override
Definition szp_stage.h:97
size_t getActualOutputSize(int index) const override
Definition szp_stage.h:137
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 postStreamSync(fz::stream_t stream) override
uint8_t getOutputDataType(size_t) const override
Definition szp_stage.h:144
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition szp_stage.h:134
uint8_t getInputDataType(size_t) const override
Definition szp_stage.h:148
void saveState() override
Definition szp_stage.h:177
void setInverse(bool inv) override
Definition szp_stage.h:92
uint16_t getStageTypeId() const override
Definition szp_stage.h:141
size_t estimateScratchBytes(const std::vector< size_t > &input_sizes) const override
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition szp_stage.h:165
size_t serializeHeader(size_t, uint8_t *buf, size_t max_size) const override
Definition szp_stage.h:153
std::string getName() const override
Definition szp_stage.h:124
size_t getMaxHeaderSize(size_t) const override
Definition szp_stage.h:175
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
@ SZP
SZp / fZ-light: quantize + 1-D Lorenzo delta + fixed-length bitpack. QUARANTINED experimental referen...
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:142
Base class interface for all compression stages.
Definition szp_stage.h:56
double error_bound
Absolute bound after mode conversion (f64-safe).
Definition szp_stage.h:62
uint32_t block_size
Elements per block (SZp default 128).
Definition szp_stage.h:60
uint8_t eb_mode
SZpErrorMode.
Definition szp_stage.h:58
double value_base
value_range for NOA; else 0.
Definition szp_stage.h:63
DataType data_type
FLOAT32 / FLOAT64.
Definition szp_stage.h:57
Backend-neutral GPU type aliases.