3#include "stage/stage.h"
5#include <cuda_runtime.h>
64static_assert(
sizeof(LorenzoConfig) <=
FZM_STAGE_CONFIG_SIZE,
"LorenzoConfig must fit in FZM_STAGE_CONFIG_SIZE");
81template<
typename TInput =
float,
typename TCode = u
int16_t>
92 std::array<size_t, 3>
dims = {0, 1, 1};
101 Config(TInput eb, TCode radius = 32768,
float outlier_cap = 0.2f,
102 std::array<size_t, 3> d = {0, 1, 1})
107 explicit LorenzoStage(
const Config& config = Config());
112 const std::vector<void*>& inputs,
113 const std::vector<void*>& outputs,
114 const std::vector<size_t>& sizes
126 case 2:
return "Lorenzo2D";
127 case 3:
return "Lorenzo3D";
128 default:
return "Lorenzo1D";
131 size_t getNumInputs()
const override {
return is_inverse_ ? 4 : 1; }
132 size_t getNumOutputs()
const override {
return is_inverse_ ? 1 : 4; }
135 return {
"codes",
"outlier_errors",
"outlier_indices",
"outlier_count"};
139 const std::vector<size_t>& input_sizes
144 std::unordered_map<std::string, size_t> result;
145 for (
size_t i = 0; i < names.size() && i < actual_output_sizes_.size(); i++) {
146 result[names[i]] = actual_output_sizes_[i];
151 return (index >= 0 && index <
static_cast<int>(actual_output_sizes_.size()))
152 ? actual_output_sizes_[index] : 0;
159 void saveState()
override { saved_output_sizes_ = actual_output_sizes_; }
160 void restoreState()
override { actual_output_sizes_ = saved_output_sizes_; }
163 void setErrorBound(TInput error_bound) { config_.
error_bound = error_bound; }
164 void setQuantRadius(TCode radius) { config_.
quant_radius = radius; }
165 void setOutlierCapacity(
float capacity) { config_.
outlier_capacity = capacity; }
166 void setDims(
const std::array<size_t, 3>& dims)
override { config_.
dims = dims; }
167 void setErrorBoundMode(
ErrorBoundMode mode) { config_.eb_mode = mode; }
171 void setZigzagCodes(
bool enable) { config_.
zigzag_codes = enable; }
172 void setDims(
size_t x,
size_t y = 1,
size_t z = 1) { config_.
dims = {x, y, z}; }
174 TInput getErrorBound()
const {
return config_.
error_bound; }
175 TCode getQuantRadius()
const {
return config_.
quant_radius; }
177 std::array<size_t, 3> getDims()
const {
return config_.
dims; }
178 ErrorBoundMode getErrorBoundMode()
const {
return config_.eb_mode; }
180 bool getZigzagCodes()
const {
return config_.
zigzag_codes; }
184 if (config_.
dims[2] > 1)
return 3;
185 if (config_.
dims[1] > 1)
return 2;
190 bool isInverse()
const {
return is_inverse_; }
203 switch (output_index) {
204 case 0:
return static_cast<uint8_t
>(getCodeDataType());
206 case 2:
return static_cast<uint8_t
>(DataType::UINT32);
207 case 3:
return static_cast<uint8_t
>(DataType::UINT32);
208 default:
return static_cast<uint8_t
>(DataType::UINT8);
216 size_t serializeHeader(
size_t output_index, uint8_t* header_buffer,
size_t max_size)
const override {
220 throw std::runtime_error(
"Insufficient buffer for Lorenzo config");
224 config.
error_bound =
static_cast<float>(computed_abs_eb_);
226 config.
num_elements =
static_cast<uint32_t
>(num_elements_);
230 config.
ndim =
static_cast<uint8_t
>(
ndim());
231 config.
eb_mode =
static_cast<uint8_t
>(config_.eb_mode);
232 config.
dim_x =
static_cast<uint32_t
>(config_.
dims[0]);
233 config.
dim_y =
static_cast<uint32_t
>(config_.
dims[1]);
234 config.
dim_z =
static_cast<uint32_t
>(config_.
dims[2]);
251 constexpr size_t kLegacySize = 32;
252 if (size < kLegacySize) {
253 throw std::runtime_error(
"Invalid Lorenzo config size");
257 std::memcpy(&config, header_buffer, std::min(size,
sizeof(
LorenzoConfig)));
261 computed_abs_eb_ =
static_cast<TInput
>(config.
error_bound);
266 constexpr size_t kV1Size = 40;
267 if (size >= kV1Size) {
274 computed_value_base_ = 0.0f;
284 int eff_ndim = (config.
ndim == 0) ? 1 :
static_cast<int>(config.
ndim);
286 if (config.
dim_x > 0) {
289 size_t yz = std::max<size_t>(1, config.
dim_y) * std::max<size_t>(1, config.
dim_z);
308 std::vector<size_t> actual_output_sizes_;
309 std::vector<size_t> saved_output_sizes_;
310 size_t num_elements_ = 0;
311 uint32_t actual_outlier_count_ = 0;
312 bool is_inverse_ =
false;
316 TInput computed_abs_eb_ = 0;
319 float computed_value_base_ = 0.0f;
322 const void* d_outlier_count_ptr_ =
nullptr;
325 if (std::is_same<TInput, float>::value)
return DataType::FLOAT32;
326 if (std::is_same<TInput, double>::value)
return DataType::FLOAT64;
327 return DataType::FLOAT32;
331 if (std::is_same<TCode, uint8_t>::value)
return DataType::UINT8;
332 if (std::is_same<TCode, uint16_t>::value)
return DataType::UINT16;
333 if (std::is_same<TCode, uint32_t>::value)
return DataType::UINT32;
334 return DataType::UINT16;
337 size_t getMaxOutlierCount(
size_t num_elements)
const {
338 return static_cast<size_t>(std::ceil(num_elements * config_.outlier_capacity));
342extern template class LorenzoStage<float, uint16_t>;
343extern template class LorenzoStage<float, uint8_t>;
344extern template class LorenzoStage<double, uint16_t>;
345extern template class LorenzoStage<double, uint32_t>;
349template<
typename TInput,
typename TCode>
350void launchLorenzoKernel(
351 const TInput* d_input,
size_t n,
352 TInput ebx2_r, TCode quant_radius,
353 TCode* d_codes, TInput* d_outlier_errors,
354 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
355 size_t max_outliers,
int grid_size,
360template<
typename TInput,
typename TCode>
361void launchLorenzoInverseKernel(
362 const TCode* d_codes,
363 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
364 const uint32_t* d_outlier_count,
365 size_t n,
size_t max_outliers,
366 TInput ebx2, TCode quant_radius,
369 cudaStream_t stream, MemoryPool* pool
373template<
typename TInput,
typename TCode>
375 const TInput* d_input,
size_t nx,
size_t ny,
376 TInput ebx2_r, TCode quant_radius,
377 TCode* d_codes, TInput* d_outlier_errors,
378 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
385template<
typename TInput,
typename TCode>
387 const TCode* d_codes,
388 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
389 const uint32_t* d_outlier_count,
390 size_t nx,
size_t ny,
size_t max_outliers,
391 TInput ebx2, TCode quant_radius,
398template<
typename TInput,
typename TCode>
400 const TInput* d_input,
size_t nx,
size_t ny,
size_t nz,
401 TInput ebx2_r, TCode quant_radius,
402 TCode* d_codes, TInput* d_outlier_errors,
403 uint32_t* d_outlier_indices, uint32_t* d_outlier_count,
410template<
typename TInput,
typename TCode>
412 const TCode* d_codes,
413 const TInput* d_outlier_errors,
const uint32_t* d_outlier_indices,
414 const uint32_t* d_outlier_count,
415 size_t nx,
size_t ny,
size_t nz,
size_t max_outliers,
416 TInput ebx2, TCode quant_radius,
void deserializeHeader(const uint8_t *header_buffer, size_t size) override
Definition lorenzo.h:249
void execute(cudaStream_t stream, MemoryPool *pool, const std::vector< void * > &inputs, const std::vector< void * > &outputs, const std::vector< size_t > &sizes) override
uint8_t getOutputDataType(size_t output_index) const override
Definition lorenzo.h:202
std::vector< std::string > getOutputNames() const override
Definition lorenzo.h:134
size_t serializeHeader(size_t output_index, uint8_t *header_buffer, size_t max_size) const override
Definition lorenzo.h:216
size_t getMaxHeaderSize(size_t output_index) const override
Definition lorenzo.h:244
std::string getName() const override
Definition lorenzo.h:124
uint8_t getInputDataType(size_t) const override
Definition lorenzo.h:212
void setInverse(bool inverse)
Definition lorenzo.h:189
void setDims(const std::array< size_t, 3 > &dims) override
Definition lorenzo.h:166
void postStreamSync(cudaStream_t stream) override
int ndim() const
Returns the effective spatial dimensionality (1, 2, or 3).
Definition lorenzo.h:183
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
void saveState() override
Definition lorenzo.h:159
uint16_t getStageTypeId() const override
Definition lorenzo.h:194
size_t getActualOutputSize(int index) const override
Definition lorenzo.h:150
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition lorenzo.h:142
Definition fzm_format.h:25
void launchLorenzoInverseKernel3D(const TCode *d_codes, const TInput *d_outlier_errors, const uint32_t *d_outlier_indices, const uint32_t *d_outlier_count, size_t nx, size_t ny, size_t nz, size_t max_outliers, TInput ebx2, TCode quant_radius, TInput *d_output, bool zigzag_codes, cudaStream_t stream, MemoryPool *pool)
3-D inverse Lorenzo kernel launcher.
ErrorBoundMode
Definition lorenzo.h:26
@ NOA
Value-range relative bound (norm-of-absolute).
@ ABS
Absolute error bound.
@ REL
Global-approximate point-wise relative bound.
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, cudaStream_t stream)
3-D forward Lorenzo kernel launcher.
void launchLorenzoInverseKernel2D(const TCode *d_codes, const TInput *d_outlier_errors, const uint32_t *d_outlier_indices, const uint32_t *d_outlier_count, size_t nx, size_t ny, size_t max_outliers, TInput ebx2, TCode quant_radius, TInput *d_output, bool zigzag_codes, cudaStream_t stream, MemoryPool *pool)
2-D inverse Lorenzo kernel launcher.
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
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, cudaStream_t stream)
2-D forward Lorenzo kernel launcher. nx is the fast (x) dimension.
@ LORENZO_1D
LorenzoStage — 1-D predictor.
@ LORENZO_3D
LorenzoStage — 3-D predictor.
@ LORENZO_2D
LorenzoStage — 2-D predictor.
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:103
uint32_t dim_z
Z dimension (1 for 1-D/2-D).
Definition lorenzo.h:50
uint32_t dim_y
Y dimension (1 for 1-D).
Definition lorenzo.h:49
uint8_t ndim
Spatial dimensionality 1/2/3 (0 treated as 1).
Definition lorenzo.h:46
DataType input_type
Original input type (1B).
Definition lorenzo.h:44
uint8_t eb_mode
ErrorBoundMode cast to uint8_t.
Definition lorenzo.h:47
float user_eb
Original user-specified error bound value.
Definition lorenzo.h:51
uint32_t dim_x
X (fast) dimension; 0 = infer from num_elements.
Definition lorenzo.h:48
uint32_t outlier_count
Actual number of outliers.
Definition lorenzo.h:43
float value_base
value_range (NOA) or max(|data|) (REL) used in conversion.
Definition lorenzo.h:52
DataType code_type
Quantization code type (1B).
Definition lorenzo.h:45
float error_bound
Absolute bound after mode conversion (used by decompressor).
Definition lorenzo.h:40
uint32_t quant_radius
Quantization radius.
Definition lorenzo.h:41
uint32_t num_elements
Total element count.
Definition lorenzo.h:42
uint8_t reserved[3]
Must be zero.
Definition lorenzo.h:54
uint8_t zigzag_codes
1 if codes are zigzag-encoded, else 0.
Definition lorenzo.h:53
float error_bound
Error bound (interpretation depends on eb_mode).
Definition lorenzo.h:86
int quant_radius
Quantization radius (2^15 for uint16_t).
Definition lorenzo.h:87
float precomputed_value_base
Definition lorenzo.h:96
std::array< size_t, 3 > dims
Definition lorenzo.h:92
float outlier_capacity
Definition lorenzo.h:88
bool zigzag_codes
Definition lorenzo.h:99