30#include <unordered_map>
56 "TiledLorenzoConfig must fit in FZM_STAGE_CONFIG_SIZE");
72 static_assert(std::is_same_v<T, int16_t> || std::is_same_v<T, int32_t>,
73 "TiledLorenzoStage: T must be int16_t or int32_t.");
78 void setInverse(
bool inv)
override { is_inverse_ = inv; }
79 bool isInverse()
const override {
return is_inverse_; }
83 void setDims(
const std::array<size_t, 3>& dims)
override {
84 if (!dims_pinned_) dims_ = dims;
86 void setDims(
size_t x,
size_t y = 1,
size_t z = 1) {
87 if (!dims_pinned_) dims_ = {x, y, z};
89 std::array<size_t, 3> getDims()
const {
return dims_; }
90 bool hasDimsOverride()
const {
return dims_pinned_; }
117 auto chk = [](uint32_t v,
const char* nm) {
119 throw std::invalid_argument(
120 std::string(
"TiledLorenzoStage::setTileShape: ") + nm
121 +
" must be in [0, 255], got " + std::to_string(v));
123 chk(tx,
"tx"); chk(ty,
"ty"); chk(tz,
"tz");
124 const uint32_t prod = (tx ? tx : 1) * (ty ? ty : 1) * (tz ? tz : 1);
126 throw std::invalid_argument(
127 "TiledLorenzoStage::setTileShape: tx*ty*tz must be in [1, 1024], got "
128 + std::to_string(prod));
129 tile_ = {tx, ty, tz};
132 std::array<uint32_t, 3> getTileShape()
const {
return effectiveTile(); }
136 auto t = effectiveTile();
137 return t[0] * t[1] * t[2];
141 if (dims_[2] > 1)
return 3;
142 if (dims_[1] > 1)
return 2;
149 const std::vector<void*>& inputs,
150 const std::vector<void*>& outputs,
151 const std::vector<size_t>& sizes
154 std::string
getName()
const override {
return "TiledLorenzo"; }
155 size_t getNumInputs()
const override {
return 1; }
156 size_t getNumOutputs()
const override {
return 1; }
162 auto t = effectiveTile();
163 if (is_inverse_)
return {};
166 return FusionSpec{FusionAccess::BlockLocal, t[0] * t[1] * t[2]};
175 const auto t = effectiveTile();
176 if (is_inverse_ || t[0] * t[1] * t[2] != 64u)
return {};
177 const uint32_t dx =
static_cast<uint32_t
>(dims_[0]);
178 const uint32_t dy =
static_cast<uint32_t
>(dims_[1]);
179 const uint32_t dz =
static_cast<uint32_t
>(dims_[2]);
180 const uint32_t tx = t[0], ty = t[1], tz = t[2];
181 const uint32_t ntx = (dx + tx - 1u) / tx;
182 const uint32_t nty = (dy + ty - 1u) / ty;
183 const uint32_t ntz = (dz + tz - 1u) / tz;
185 d.strategy = FusionStrategy::WarpRegister;
189 d.
op_name =
"TiledLorenzo2DPredictor";
190 d.n_ab =
static_cast<size_t>(ntx) * nty * tx * ty;
192 d.
params.resize(
sizeof(p)); std::memcpy(d.
params.data(), &p,
sizeof(p));
194 d.
op_name =
"TiledLorenzo3DPredictor";
195 d.n_ab =
static_cast<size_t>(ntx) * nty * ntz * tx * ty * tz;
197 d.
params.resize(
sizeof(p)); std::memcpy(d.
params.data(), &p,
sizeof(p));
203 const std::vector<size_t>& input_sizes
207 const size_t n = naturalElems(input_sizes);
208 const size_t out_elems = is_inverse_ ? n : paddedElems(n);
209 return {out_elems *
sizeof(T)};
212 std::unordered_map<std::string, size_t>
214 return {{
"output", actual_output_size_}};
217 return (index == 0) ? actual_output_size_ : 0;
225 return static_cast<uint8_t
>(getElementDataType());
228 return static_cast<uint8_t
>(getElementDataType());
233 throw std::runtime_error(
"TiledLorenzoStage: header buffer too small");
234 auto t = effectiveTile();
237 cfg.
ndim =
static_cast<uint8_t
>(ndim());
238 cfg.
tile_x =
static_cast<uint8_t
>(t[0]);
239 cfg.
tile_y =
static_cast<uint8_t
>(t[1]);
240 cfg.
tile_z =
static_cast<uint8_t
>(t[2]);
241 cfg.
dim_x =
static_cast<uint32_t
>(dims_[0]);
242 cfg.
dim_y =
static_cast<uint32_t
>(dims_[1]);
243 cfg.
dim_z =
static_cast<uint32_t
>(dims_[2]);
244 std::memcpy(buf, &cfg,
sizeof(cfg));
250 throw std::runtime_error(
"TiledLorenzoStage: header too small");
252 std::memcpy(&cfg, buf,
sizeof(cfg));
253 int eff_ndim = (cfg.
ndim == 0) ? 1 :
static_cast<int>(cfg.
ndim);
254 dims_[0] = cfg.
dim_x;
255 dims_[1] = (eff_ndim >= 2) ? cfg.
dim_y : 1;
256 dims_[2] = (eff_ndim >= 3) ? cfg.
dim_z : 1;
258 tile_set_ = (cfg.
tile_x != 0);
266 bool is_inverse_ =
false;
267 bool dims_pinned_ =
false;
268 size_t actual_output_size_ = 0;
269 std::array<size_t, 3> dims_ = {0, 1, 1};
270 std::array<uint32_t, 3> tile_ = {8, 8, 1};
271 bool tile_set_ =
false;
274 std::array<uint32_t, 3> effectiveTile()
const {
276 return {tile_[0] ? tile_[0] : 1u,
277 tile_[1] ? tile_[1] : 1u,
278 tile_[2] ? tile_[2] : 1u};
281 case 3:
return {4, 4, 4};
282 case 2:
return {8, 8, 1};
283 default:
return {64, 1, 1};
288 size_t naturalElems(
const std::vector<size_t>& input_sizes)
const {
289 if (dims_[0] > 0)
return dims_[0] * dims_[1] * dims_[2];
290 return input_sizes.empty() ? 0 : input_sizes[0] /
sizeof(T);
298 size_t paddedElems(
size_t natural_n)
const {
299 auto t = effectiveTile();
300 const size_t dx = (dims_[0] > 0) ? dims_[0] : natural_n;
301 const size_t dy = (dims_[0] > 0) ? dims_[1] : 1;
302 const size_t dz = (dims_[0] > 0) ? dims_[2] : 1;
303 if (dx == 0)
return 0;
304 const size_t ntx = (dx + t[0] - 1) / t[0];
305 const size_t nty = (dy + t[1] - 1) / t[1];
306 const size_t ntz = (dz + t[2] - 1) / t[2];
307 return ntx * nty * ntz * (size_t)t[0] * t[1] * t[2];
310 static DataType getElementDataType() {
311 if (std::is_same<T, int16_t>::value)
return DataType::INT16;
312 return DataType::INT32;
316extern template class TiledLorenzoStage<int16_t>;
317extern template class TiledLorenzoStage<int32_t>;
Definition tiled_lorenzo_stage.h:71
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition tiled_lorenzo_stage.h:248
FusedOpDecl getFusedOp() const override
Definition tiled_lorenzo_stage.h:174
std::string getName() const override
Definition tiled_lorenzo_stage.h:154
uint16_t getStageTypeId() const override
Definition tiled_lorenzo_stage.h:220
uint32_t getTileElems() const
Elements per tile = the AdaptiveBitpack block_size that aligns blocks to tiles.
Definition tiled_lorenzo_stage.h:135
size_t getActualOutputSize(int index) const override
Definition tiled_lorenzo_stage.h:216
FusionSpec getFusionSpec() const override
Definition tiled_lorenzo_stage.h:161
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
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
Definition tiled_lorenzo_stage.h:202
void setDims(const std::array< size_t, 3 > &dims) override
Definition tiled_lorenzo_stage.h:83
uint8_t getInputDataType(size_t) const override
Definition tiled_lorenzo_stage.h:227
void setDimsOverride(size_t x, size_t y, size_t z)
Definition tiled_lorenzo_stage.h:105
uint8_t getOutputDataType(size_t) const override
Definition tiled_lorenzo_stage.h:224
void setTileShape(uint32_t tx, uint32_t ty=1, uint32_t tz=1)
Definition tiled_lorenzo_stage.h:116
void setInverse(bool inv) override
Definition tiled_lorenzo_stage.h:78
size_t getMaxHeaderSize(size_t) const override
Definition tiled_lorenzo_stage.h:261
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition tiled_lorenzo_stage.h:213
size_t serializeHeader(size_t, uint8_t *buf, size_t max_size) const override
Definition tiled_lorenzo_stage.h:231
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
@ TILED_LORENZO
Dimension-aware (tiled separable) Lorenzo predictor (cuSZp3 delta)
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:139
Base class interface for all compression stages.
A stage's contribution to a generated fused kernel — the device-op it maps to, where its source lives...
Definition fusion.h:161
std::vector< uint8_t > params
POD Params bytes; empty for stateless ops.
Definition fusion.h:165
uint32_t elems_per_lane
Definition fusion.h:172
std::string op_name
device-op type name, e.g. "DiffNegabinary"
Definition fusion.h:163
std::string include_header
header used by the generated source
Definition fusion.h:164
A stage's fusion contract. Stages that can participate in a fused kernel override Stage::getFusionSpe...
Definition fusion.h:52
Definition tiled_lorenzo_stage.h:39
uint32_t dim_z
Z dimension (1 for 1-D/2-D).
Definition tiled_lorenzo_stage.h:48
uint8_t reserved[3]
Must be zero.
Definition tiled_lorenzo_stage.h:45
uint8_t tile_z
Tile extent in z (1 for 1-D/2-D).
Definition tiled_lorenzo_stage.h:44
DataType data_type
Signed integer element type (1B): INT16 / INT32.
Definition tiled_lorenzo_stage.h:40
uint8_t tile_y
Tile extent in y (1 for 1-D).
Definition tiled_lorenzo_stage.h:43
uint8_t tile_x
Tile extent in x (fast dim).
Definition tiled_lorenzo_stage.h:42
uint32_t dim_y
Y dimension (1 for 1-D).
Definition tiled_lorenzo_stage.h:47
uint8_t ndim
Spatial dimensionality 1/2/3.
Definition tiled_lorenzo_stage.h:41
uint32_t dim_x
X (fast) dimension.
Definition tiled_lorenzo_stage.h:46
cuSZp3: linear-ABS quant + 2-D separable tiled Lorenzo (tz == 1).
Definition warp_op_params.h:29
cuSZp3: linear-ABS quant + 3-D separable tiled Lorenzo (tz > 1). PROTOTYPE.
Definition warp_op_params.h:37
Backend-neutral GPU type aliases.
POD parameter blocks for the warp-register predictor policies.