FZGPUModules 2.0
GPU-accelerated modular compression pipelines
Loading...
Searching...
No Matches
szp_stage.h
Go to the documentation of this file.
1#pragma once
2
40#include "stage/stage.h"
41#include "fzm_format.h"
42#include "backend/types.h"
43#include <cstdint>
44#include <cstring>
45#include <stdexcept>
46#include <string>
47#include <type_traits>
48#include <unordered_map>
49#include <vector>
50
51namespace fz {
52
53enum class SZpErrorMode : uint8_t { ABS = 0, NOA = 2 };
54
56struct SZpConfig {
58 uint8_t eb_mode;
59 uint8_t _pad[2];
60 uint32_t block_size;
61 uint64_t num_elements;
62 double error_bound;
63 double value_base;
64
65 SZpConfig()
66 : data_type(DataType::FLOAT32), eb_mode(0), _pad{},
67 block_size(128), num_elements(0), error_bound(0.0), value_base(0.0) {}
68};
69static_assert(sizeof(SZpConfig) <= FZM_STAGE_CONFIG_SIZE,
70 "SZpConfig must fit in FZM_STAGE_CONFIG_SIZE");
71
84template<typename T>
85class SZpStage : public Stage {
86 static_assert(std::is_same_v<T, float> || std::is_same_v<T, double>,
87 "SZpStage: T must be float or double.");
88public:
89 SZpStage() = default;
90 ~SZpStage() override;
91
92 void setInverse(bool inv) override { is_inverse_ = inv; }
93 bool isInverse() const override { return is_inverse_; }
94 // ABS forward is graph-capturable (size readback deferred to
95 // postStreamSync()); NOA forward needs a range reduce + host read inside
96 // execute(), so it is not.
97 bool isGraphCompatible() const override {
98 return !is_inverse_ && eb_mode_ != SZpErrorMode::NOA;
99 }
100
101 void setBlockSize(uint32_t n) {
102 if (n == 0 || n > 4096)
103 throw std::invalid_argument("SZpStage::setBlockSize: n in [1,4096]");
104 block_size_ = n;
105 }
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_; }
111
112 void execute(fz::stream_t stream, MemoryPool* pool,
113 const std::vector<void*>& inputs,
114 const std::vector<void*>& outputs,
115 const std::vector<size_t>& sizes) override;
116 void postStreamSync(fz::stream_t stream) override;
117
118private:
121 double resolveAbsEb(fz::stream_t stream, MemoryPool* pool, const T* d_in, size_t n);
122public:
123
124 std::string getName() const override { return "SZp"; }
125 size_t getNumInputs() const override { return 1; }
126 size_t getNumOutputs() const override { return 1; }
127
128 std::vector<size_t> estimateOutputSizes(
129 const std::vector<size_t>& input_sizes) const override;
131 const std::vector<size_t>& input_sizes) const override;
132
133 std::unordered_map<std::string, size_t>
134 getActualOutputSizesByName() const override {
135 return {{"output", actual_output_size_}};
136 }
137 size_t getActualOutputSize(int index) const override {
138 return (index == 0) ? actual_output_size_ : 0;
139 }
140
141 uint16_t getStageTypeId() const override {
142 return static_cast<uint16_t>(StageType::SZP);
143 }
144 uint8_t getOutputDataType(size_t) const override {
145 return static_cast<uint8_t>(is_inverse_ ? getElementDataType()
146 : DataType::UINT8);
147 }
148 uint8_t getInputDataType(size_t) const override {
149 return static_cast<uint8_t>(is_inverse_ ? DataType::UINT8
150 : getElementDataType());
151 }
152
153 size_t serializeHeader(size_t, uint8_t* buf, size_t max_size) const override {
154 if (max_size < sizeof(SZpConfig)) return 0;
155 SZpConfig cfg;
156 cfg.data_type = getElementDataType();
157 cfg.eb_mode = static_cast<uint8_t>(eb_mode_);
158 cfg.block_size = block_size_;
159 cfg.num_elements = static_cast<uint64_t>(num_elements_);
160 cfg.error_bound = abs_eb_;
161 cfg.value_base = value_base_;
162 std::memcpy(buf, &cfg, sizeof(cfg));
163 return sizeof(cfg);
164 }
165 void deserializeHeader(const uint8_t* buf, size_t size) override {
166 if (size < sizeof(SZpConfig))
167 throw std::runtime_error("SZpStage: header too small");
168 SZpConfig cfg; std::memcpy(&cfg, buf, sizeof(cfg));
169 block_size_ = cfg.block_size ? cfg.block_size : 128u;
170 num_elements_ = static_cast<size_t>(cfg.num_elements);
171 eb_mode_ = static_cast<SZpErrorMode>(cfg.eb_mode);
172 abs_eb_ = cfg.error_bound;
173 value_base_ = cfg.value_base;
174 }
175 size_t getMaxHeaderSize(size_t) const override { return sizeof(SZpConfig); }
176
177 void saveState() override {
178 saved_ = {block_size_, num_elements_, actual_output_size_, abs_eb_, value_base_};
179 }
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;
184 }
185 size_t getNumElements() const { return num_elements_; }
186
187private:
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;
196
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;
203
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};
207
208 static DataType getElementDataType() {
209 return std::is_same<T, float>::value ? DataType::FLOAT32 : DataType::FLOAT64;
210 }
211};
212
213extern template class SZpStage<float>;
214extern template class SZpStage<double>;
215
216} // namespace fz
Definition mempool.h:82
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
Definition stage.h:31
FZM binary file format definitions — structs, enums, and helpers.
Definition dag.h:24
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.