8#include "stage/stage.h"
10#include "predictors/lorenzo/lorenzo.h"
11#include <cuda_runtime.h>
49 "QuantizerConfig must fit in FZM_STAGE_CONFIG_SIZE");
92template<
typename TInput =
float,
typename TCode = u
int16_t>
115 int radius = 32768,
float outlier_cap = 0.05f)
125 const std::vector<void*>& inputs,
126 const std::vector<void*>& outputs,
127 const std::vector<size_t>& sizes
132 std::string
getName()
const override {
return "Quantizer"; }
134 size_t getNumInputs()
const override {
135 if (!is_inverse_)
return 1;
136 return isInplaceMode() ? 1 : 4;
138 size_t getNumOutputs()
const override {
139 if (is_inverse_)
return 1;
140 return isInplaceMode() ? 1 : 4;
144 if (is_inverse_)
return {
"reconstructed"};
145 if (isInplaceMode())
return {
"codes"};
146 return {
"codes",
"outlier_vals",
"outlier_idxs",
"outlier_count"};
150 const std::vector<size_t>& input_sizes
155 std::unordered_map<std::string, size_t> result;
156 for (
size_t i = 0; i < names.size() && i < actual_output_sizes_.size(); i++)
157 result[names[i]] = actual_output_sizes_[i];
161 return (index >= 0 && index <
static_cast<int>(actual_output_sizes_.size()))
162 ? actual_output_sizes_[index] : 0;
165 void setInverse(
bool inverse)
override { is_inverse_ = inverse; }
166 bool isInverse()
const override {
return is_inverse_; }
174 if (isInplaceMode())
return static_cast<uint8_t
>(getCodeDataType());
175 switch (output_index) {
176 case 0:
return static_cast<uint8_t
>(getCodeDataType());
178 case 2:
return static_cast<uint8_t
>(DataType::UINT32);
179 case 3:
return static_cast<uint8_t
>(DataType::UINT32);
180 default:
return static_cast<uint8_t
>(DataType::UINT8);
188 size_t serializeHeader(
size_t output_index, uint8_t* buf,
size_t max_size)
const override;
193 saved_config_ = config_;
194 saved_num_elements_ = num_elements_;
195 saved_actual_outlier_count_ = actual_outlier_count_;
196 saved_computed_abs_eb_ = computed_abs_eb_;
197 saved_computed_value_base_ = computed_value_base_;
198 saved_actual_output_sizes_ = actual_output_sizes_;
201 void restoreState()
override {
202 config_ = saved_config_;
203 num_elements_ = saved_num_elements_;
204 actual_outlier_count_ = saved_actual_outlier_count_;
205 computed_abs_eb_ = saved_computed_abs_eb_;
206 computed_value_base_ = saved_computed_value_base_;
207 actual_output_sizes_ = saved_actual_output_sizes_;
210 void setErrorBound(TInput eb) { config_.
error_bound =
static_cast<float>(eb); }
211 void setQuantRadius(
int r) { config_.
quant_radius = r; }
215 void setZigzagCodes(
bool enable) { config_.
zigzag_codes = enable; }
221 TInput getErrorBound()
const {
return static_cast<TInput
>(config_.
error_bound); }
222 int getQuantRadius()
const {
return config_.
quant_radius; }
223 ErrorBoundMode getErrorBoundMode()
const {
return config_.eb_mode; }
225 bool getZigzagCodes()
const {
return config_.
zigzag_codes; }
231 Config saved_config_;
232 std::vector<size_t> actual_output_sizes_;
233 std::vector<size_t> saved_actual_output_sizes_;
234 size_t num_elements_ = 0;
235 size_t saved_num_elements_ = 0;
236 uint32_t actual_outlier_count_= 0;
237 uint32_t saved_actual_outlier_count_ = 0;
238 bool is_inverse_ =
false;
239 TInput computed_abs_eb_ =
static_cast<TInput
>(1e-4);
240 TInput saved_computed_abs_eb_ =
static_cast<TInput
>(1e-4);
241 float computed_value_base_ = 0.0f;
242 float saved_computed_value_base_ = 0.0f;
243 const void* d_outlier_count_ptr_ =
nullptr;
245 bool isInplaceMode()
const {
246 return config_.inplace_outliers
251 if (std::is_same<TInput, float>::value)
return DataType::FLOAT32;
252 if (std::is_same<TInput, double>::value)
return DataType::FLOAT64;
253 return DataType::FLOAT32;
256 if (std::is_same<TCode, uint8_t>::value)
return DataType::UINT8;
257 if (std::is_same<TCode, uint16_t>::value)
return DataType::UINT16;
258 if (std::is_same<TCode, uint32_t>::value)
return DataType::UINT32;
259 return DataType::UINT16;
261 size_t getMaxOutlierCount(
size_t n)
const {
262 return static_cast<size_t>(std::ceil(n * config_.outlier_capacity));
266extern template class QuantizerStage<float, uint16_t>;
267extern template class QuantizerStage<float, uint32_t>;
268extern template class QuantizerStage<double, uint16_t>;
269extern template class QuantizerStage<double, uint32_t>;
Definition quantizer.h:93
void saveState() override
Definition quantizer.h:192
uint8_t getInputDataType(size_t) const override
Definition quantizer.h:184
uint8_t getOutputDataType(size_t output_index) const override
Definition quantizer.h:172
void setInplaceOutliers(bool enable)
ABS/NOA: encode outliers in-place (raw float bits in codes array; no scatter buffers).
Definition quantizer.h:219
std::vector< std::string > getOutputNames() const override
Definition quantizer.h:143
void setInverse(bool inverse) override
Definition quantizer.h:165
void postStreamSync(cudaStream_t stream) override
void deserializeHeader(const uint8_t *buf, size_t size) override
void setOutlierThreshold(float t)
ABS/NOA: |x| >= threshold → lossless outlier regardless of bin (LC reference parameter).
Definition quantizer.h:217
void execute(cudaStream_t stream, MemoryPool *pool, const std::vector< void * > &inputs, const std::vector< void * > &outputs, const std::vector< size_t > &sizes) override
std::string getName() const override
Definition quantizer.h:132
size_t serializeHeader(size_t output_index, uint8_t *buf, size_t max_size) const override
uint16_t getStageTypeId() const override
Definition quantizer.h:168
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition quantizer.h:153
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
size_t getMaxHeaderSize(size_t) const override
Definition quantizer.h:189
size_t getActualOutputSize(int index) const override
Definition quantizer.h:160
Definition fzm_format.h:25
ErrorBoundMode
Definition lorenzo.h:26
@ ABS
Absolute error bound.
@ REL
Global-approximate point-wise relative bound.
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
@ QUANTIZER
QuantizerStage — direct-value quantization.
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:103
Definition quantizer.h:25
uint8_t inplace_outliers
1 if outliers are encoded in-place in the codes array.
Definition quantizer.h:37
uint8_t eb_mode
ErrorBoundMode cast to uint8_t.
Definition quantizer.h:34
uint32_t outlier_count
Actual number of outliers.
Definition quantizer.h:31
DataType code_type
Quantization code type (1B).
Definition quantizer.h:33
uint8_t zigzag_codes
1 if ABS/NOA codes are zigzag-encoded.
Definition quantizer.h:35
uint32_t num_elements
Total element count.
Definition quantizer.h:30
uint32_t quant_radius
Quantization radius.
Definition quantizer.h:29
float user_error_bound
Original user-specified EB.
Definition quantizer.h:27
DataType input_type
Original input type (1B).
Definition quantizer.h:32
float abs_error_bound
Absolute EB after mode conversion (0 for REL).
Definition quantizer.h:26
uint8_t _pad[3]
Alignment padding — must be zero.
Definition quantizer.h:38
float outlier_threshold
ABS/NOA: |x| >= threshold → forced outlier (inf = disabled).
Definition quantizer.h:36
float value_base
value_range (NOA); 0 for ABS/REL.
Definition quantizer.h:28
Definition quantizer.h:96
float outlier_threshold
ABS/NOA: |x| >= threshold → lossless outlier (LC reference threshold). Default: ∞.
Definition quantizer.h:107
float outlier_capacity
Fraction of input size reserved for outliers.
Definition quantizer.h:99
bool zigzag_codes
Definition quantizer.h:105
float precomputed_value_base
Pre-computed value_base > 0 to skip the NOA data scan; 0 = auto.
Definition quantizer.h:102
bool inplace_outliers
Definition quantizer.h:111
int quant_radius
Quantization radius.
Definition quantizer.h:98
float error_bound
Error bound (interpretation set by eb_mode).
Definition quantizer.h:97