66 "%s: ErrorBoundMode::REL is deprecated for this stage and has been "
67 "mapped to PREL (abs_eb = eb * max(|data|)). This does NOT guarantee a "
68 "per-element relative bound. Use PREL explicitly to silence this, or "
69 "QuantizerStage with REL for an exact point-wise bound.",
116static_assert(
sizeof(LorenzoQuantConfig) <=
FZM_STAGE_CONFIG_SIZE,
"LorenzoQuantConfig must fit in FZM_STAGE_CONFIG_SIZE");
145template<
typename TInput =
float,
typename TCode = u
int16_t>
156 std::array<size_t, 3>
dims = {0, 1, 1};
177 Config(TInput eb, TCode radius = 32768,
float outlier_cap = 0.2f,
178 std::array<size_t, 3> d = {0, 1, 1})
183 explicit LorenzoQuantStage(
const Config& config = Config());
184 ~LorenzoQuantStage()
override;
189 const std::vector<void*>& inputs,
190 const std::vector<void*>& outputs,
191 const std::vector<size_t>& sizes
208 return sizeof(uint32_t);
211 std::string
getName()
const override {
return "LorenzoQuant"; }
212 size_t getNumInputs()
const override {
213 return is_inverse_ ? (config_.
centering ? 4 : 3) : 1;
215 size_t getNumOutputs()
const override {
216 return is_inverse_ ? 1 : (config_.
centering ? 4 : 3);
221 return {
"codes",
"outlier_errors",
"outlier_indices",
"means"};
222 return {
"codes",
"outlier_errors",
"outlier_indices"};
226 const std::vector<size_t>& input_sizes
231 std::unordered_map<std::string, size_t> result;
232 for (
size_t i = 0; i < names.size() && i < actual_output_sizes_.size(); i++) {
233 result[names[i]] = actual_output_sizes_[i];
238 return (index >= 0 && index <
static_cast<int>(actual_output_sizes_.size()))
239 ? actual_output_sizes_[index] : 0;
246 void saveState()
override { saved_output_sizes_ = actual_output_sizes_; }
247 void restoreState()
override { actual_output_sizes_ = saved_output_sizes_; }
250 void setErrorBound(TInput error_bound) { config_.
error_bound = error_bound; }
251 void setQuantRadius(TCode radius) { config_.
quant_radius = radius; }
252 void setOutlierCapacity(
float capacity) { config_.
outlier_capacity = capacity; }
253 void setDims(
const std::array<size_t, 3>& dims)
override { config_.
dims = dims; }
264 void setZigzagCodes(
bool enable) { config_.
zigzag_codes = enable; }
270 void setDims(
size_t x,
size_t y = 1,
size_t z = 1) { config_.
dims = {x, y, z}; }
272 TInput getErrorBound()
const {
return config_.
error_bound; }
273 TCode getQuantRadius()
const {
return config_.
quant_radius; }
275 std::array<size_t, 3> getDims()
const {
return config_.
dims; }
283 bool getZigzagCodes()
const {
return config_.
zigzag_codes; }
284 bool getCentering()
const {
return config_.
centering; }
288 if (config_.
dims[2] > 1)
return 3;
289 if (config_.
dims[1] > 1)
return 2;
294 bool isInverse()
const {
return is_inverse_; }
299 return static_cast<uint16_t
>(StageType::LORENZO_QUANT);
303 switch (output_index) {
304 case 0:
return static_cast<uint8_t
>(getCodeDataType());
306 case 2:
return static_cast<uint8_t
>(DataType::UINT32);
307 default:
return static_cast<uint8_t
>(DataType::UINT8);
315 size_t serializeHeader(
size_t output_index, uint8_t* header_buffer,
size_t max_size)
const override {
319 throw std::runtime_error(
"Insufficient buffer for Lorenzo config");
323 config.
error_bound =
static_cast<float>(computed_abs_eb_);
325 config.
num_elements =
static_cast<uint32_t
>(num_elements_);
329 config.
ndim =
static_cast<uint8_t
>(
ndim());
331 config.
dim_x =
static_cast<uint32_t
>(config_.
dims[0]);
332 config.
dim_y =
static_cast<uint32_t
>(config_.
dims[1]);
333 config.
dim_z =
static_cast<uint32_t
>(config_.
dims[2]);
335 config.
value_base =
static_cast<float>(computed_value_base_);
337 config.
value_base_f64 =
static_cast<double>(computed_value_base_);
353 constexpr size_t kLegacySize = 32;
354 if (size < kLegacySize) {
355 throw std::runtime_error(
"Invalid Lorenzo config size");
363 constexpr size_t kSizeBeforeF64 = 44;
364 const bool has_f64 = (size > kSizeBeforeF64 && config.
error_bound_f64 != 0.0);
366 computed_abs_eb_ = has_f64 ?
static_cast<TInput
>(config.
error_bound_f64)
372 constexpr size_t kV1Size = 40;
373 if (size >= kV1Size) {
381 computed_value_base_ = has_f64
387 computed_value_base_ =
static_cast<TInput
>(0);
393 constexpr size_t kV2Size = 44;
394 if (size >= kV2Size) {
405 int eff_ndim = (config.
ndim == 0) ? 1 :
static_cast<int>(config.
ndim);
407 if (config.
dim_x > 0) {
410 size_t yz = std::max<size_t>(1, config.
dim_y) * std::max<size_t>(1, config.
dim_z);
429 std::vector<size_t> actual_output_sizes_;
430 std::vector<size_t> saved_output_sizes_;
431 size_t num_elements_ = 0;
432 uint32_t actual_outlier_count_ = 0;
433 bool is_inverse_ =
false;
437 TInput computed_abs_eb_ = 0;
440 TInput computed_value_base_ =
static_cast<TInput
>(0);
447 uint32_t* d_outlier_count_scratch_ =
nullptr;
455 std::weak_ptr<const void> persistent_pool_alive_;
460 void initOutlierCountScratch(
MemoryPool* pool);
462 DataType getInputDataType()
const {
return fused::dataTypeOf<TInput>(); }
463 DataType getCodeDataType()
const {
return fused::dataTypeOf<TCode>(); }
465 size_t getMaxOutlierCount(
size_t num_elements)
const {
466 return static_cast<size_t>(std::ceil(num_elements * config_.outlier_capacity));
470extern template class LorenzoQuantStage<float, uint16_t>;
471extern template class LorenzoQuantStage<float, uint8_t>;
472extern template class LorenzoQuantStage<double, uint16_t>;
473extern template class LorenzoQuantStage<double, uint32_t>;
477template<
typename TInput,
typename TCode>
478void launchLorenzoKernel(
479 const TInput* d_input,
size_t n,
480 TInput ebx2_r, TCode quant_radius,
481 TCode* d_codes, TInput* d_outlier_errors,
482 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
483 size_t max_outliers,
int grid_size,
488 TInput* d_means =
nullptr
491template<
typename TInput,
typename TCode>
492void launchLorenzoInverseKernel(
493 const TCode* d_codes,
494 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
497 TInput ebx2, TCode quant_radius,
500 fz::stream_t stream, MemoryPool* pool,
502 const TInput* d_means =
nullptr
506template<
typename TInput,
typename TCode>
508 const TInput* d_input,
size_t nx,
size_t ny,
509 TInput ebx2_r, TCode quant_radius,
510 TCode* d_codes, TInput* d_outlier_errors,
511 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
518template<
typename TInput,
typename TCode>
520 const TCode* d_codes,
521 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
523 size_t nx,
size_t ny,
524 TInput ebx2, TCode quant_radius,
531template<
typename TInput,
typename TCode>
533 const TInput* d_input,
size_t nx,
size_t ny,
size_t nz,
534 TInput ebx2_r, TCode quant_radius,
535 TCode* d_codes, TInput* d_outlier_errors,
536 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
543template<
typename TInput,
typename TCode>
545 const TCode* d_codes,
546 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
548 size_t nx,
size_t ny,
size_t nz,
549 TInput ebx2, TCode quant_radius,
Definition lorenzo_quant.h:146
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition lorenzo_quant.h:229
int ndim() const
Returns the effective spatial dimensionality (1, 2, or 3).
Definition lorenzo_quant.h:287
void postStreamSync(fz::stream_t stream) override
uint8_t getOutputDataType(size_t output_index) const override
Definition lorenzo_quant.h:302
uint16_t getStageTypeId() const override
Definition lorenzo_quant.h:298
void setCentering(bool enable)
Definition lorenzo_quant.h:269
void setErrorBoundMode(ErrorBoundMode mode)
Definition lorenzo_quant.h:258
size_t getActualOutputSize(int index) const override
Definition lorenzo_quant.h:237
void saveState() override
Definition lorenzo_quant.h:246
size_t serializeHeader(size_t output_index, uint8_t *header_buffer, size_t max_size) const override
Definition lorenzo_quant.h:315
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
size_t getMaxHeaderSize(size_t output_index) const override
Definition lorenzo_quant.h:346
size_t estimateDeviceFootprintBytes(size_t) const override
Definition lorenzo_quant.h:207
std::string getName() const override
Definition lorenzo_quant.h:211
uint8_t getInputDataType(size_t) const override
Definition lorenzo_quant.h:311
void deserializeHeader(const uint8_t *header_buffer, size_t size) override
Definition lorenzo_quant.h:351
std::vector< std::string > getOutputNames() const override
Definition lorenzo_quant.h:219
void onFinalize(size_t estimated_inlen, MemoryPool *pool) override
void setDims(const std::array< size_t, 3 > &dims) override
Definition lorenzo_quant.h:253
void setInverse(bool inverse)
Definition lorenzo_quant.h:293
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
TInput getComputedAbsErrorBound() const
Definition lorenzo_quant.h:281
Compile-time C++ type -> DataType enum mapping, shared by the fused stages that dispatch on multiple ...
Logging infrastructure and macros.
#define FZ_LOG(level,...)
Definition log.h:201
void launchLorenzoKernel3D(const TInput *d_input, size_t nx, size_t ny, size_t nz, TInput ebx2_r, TCode quant_radius, TCode *d_codes, TInput *d_outlier_errors, uint32_t *d_outlier_indices, uint32_t *d_outlier_count, size_t max_outliers, bool zigzag_codes, fz::stream_t stream)
3-D forward Lorenzo kernel launcher.
ErrorBoundMode
Definition lorenzo_quant.h:42
@ PREL
Pseudo-relative: eb × max(|data|), applied as a single ABS bound.
@ ABS
Absolute error bound.
@ REL
Exact per-element point-wise relative bound (QuantizerStage only).
ErrorBoundMode resolveApproxRelMode(ErrorBoundMode mode, const char *stage_name)
Definition lorenzo_quant.h:63
void launchLorenzoKernel2D(const TInput *d_input, size_t nx, size_t ny, TInput ebx2_r, TCode quant_radius, TCode *d_codes, TInput *d_outlier_errors, uint32_t *d_outlier_indices, uint32_t *d_outlier_count, size_t max_outliers, bool zigzag_codes, fz::stream_t stream)
2-D forward Lorenzo kernel launcher. nx is the fast (x) dimension.
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:142
void launchLorenzoInverseKernel3D(const TCode *d_codes, const TInput *d_outlier_errors, const uint32_t *d_outlier_indices, uint32_t outlier_n, size_t nx, size_t ny, size_t nz, TInput ebx2, TCode quant_radius, TInput *d_output, bool zigzag_codes, fz::stream_t stream, MemoryPool *pool)
3-D inverse Lorenzo kernel launcher.
@ WARN
Unexpected but recoverable: outlier overflow, fallbacks.
void launchLorenzoInverseKernel2D(const TCode *d_codes, const TInput *d_outlier_errors, const uint32_t *d_outlier_indices, uint32_t outlier_n, size_t nx, size_t ny, TInput ebx2, TCode quant_radius, TInput *d_output, bool zigzag_codes, fz::stream_t stream, MemoryPool *pool)
2-D inverse Lorenzo kernel launcher.
Base class interface for all compression stages.
Definition lorenzo_quant.h:81
uint8_t zigzag_codes
1 if codes are zigzag-encoded, else 0.
Definition lorenzo_quant.h:95
float value_base
value_range (NOA) or max(|data|) (REL) used in conversion.
Definition lorenzo_quant.h:94
uint8_t centering
1 if per-tile mean centering is enabled, else 0.
Definition lorenzo_quant.h:96
DataType input_type
Original input type (1B).
Definition lorenzo_quant.h:86
uint32_t quant_radius
Quantization radius.
Definition lorenzo_quant.h:83
float error_bound
Absolute bound after mode conversion (used by decompressor).
Definition lorenzo_quant.h:82
uint8_t eb_mode
ErrorBoundMode cast to uint8_t.
Definition lorenzo_quant.h:89
uint32_t num_elements
Total element count.
Definition lorenzo_quant.h:84
uint8_t ndim
Spatial dimensionality 1/2/3 (0 treated as 1).
Definition lorenzo_quant.h:88
double value_base_f64
Full-precision value_base; 0 in pre-2026-08-08 headers.
Definition lorenzo_quant.h:105
double error_bound_f64
Definition lorenzo_quant.h:104
uint32_t dim_z
Z dimension (1 for 1-D/2-D).
Definition lorenzo_quant.h:92
uint8_t reserved[2]
Definition lorenzo_quant.h:97
DataType code_type
Quantization code type (1B).
Definition lorenzo_quant.h:87
uint32_t dim_y
Y dimension (1 for 1-D).
Definition lorenzo_quant.h:91
uint32_t outlier_count
Actual number of outliers.
Definition lorenzo_quant.h:85
float user_eb
Original user-specified error bound value.
Definition lorenzo_quant.h:93
uint32_t dim_x
X (fast) dimension; 0 = infer from num_elements.
Definition lorenzo_quant.h:90
Definition lorenzo_quant.h:149
int quant_radius
Quantization radius (2^15 for uint16_t).
Definition lorenzo_quant.h:151
ErrorBoundMode eb_mode
Definition lorenzo_quant.h:160
float error_bound
Error bound (interpretation depends on eb_mode).
Definition lorenzo_quant.h:150
bool zigzag_codes
Definition lorenzo_quant.h:166
float outlier_capacity
Definition lorenzo_quant.h:152
float precomputed_value_base
Definition lorenzo_quant.h:163
bool centering
Definition lorenzo_quant.h:175
std::array< size_t, 3 > dims
Definition lorenzo_quant.h:156
Backend-neutral GPU type aliases.