43#include <unordered_map>
58 "Speck2DConfig must fit in FZM_STAGE_CONFIG_SIZE");
60class Speck2DStage :
public Stage {
62 Speck2DStage() =
default;
63 ~Speck2DStage()
override;
66 void setInverse(
bool inv)
override { is_inverse_ = inv; }
67 bool isInverse()
const override {
return is_inverse_; }
69 void setDims(
const std::array<size_t, 3>& dims)
override { dims_ = dims; }
70 void setDims(
size_t x,
size_t y) { dims_ = {x, y, 1}; }
73 void execute(cudaStream_t stream, MemoryPool* pool,
74 const std::vector<void*>& inputs,
75 const std::vector<void*>& outputs,
76 const std::vector<size_t>& sizes)
override;
81 void postStreamSync(cudaStream_t stream)
override;
85 bool isGraphCompatible()
const override {
return false; }
88 std::string getName()
const override {
return "SPECK2D"; }
89 size_t getNumInputs()
const override {
return 1; }
90 size_t getNumOutputs()
const override {
return 1; }
92 std::vector<size_t> estimateOutputSizes(
93 const std::vector<size_t>& input_sizes)
const override {
94 if (input_sizes.empty())
return {0};
106 size_t n = (dims_[0] && dims_[1]) ? dims_[0] * dims_[1]
107 : input_sizes[0] / sizeof(int32_t);
108 return { n *
sizeof(int32_t) };
116 size_t n = input_sizes[0] /
sizeof(int32_t);
117 size_t words_ub = 3 * n + 8;
118 return { words_ub *
sizeof(uint32_t) };
121 std::unordered_map<std::string, size_t>
122 getActualOutputSizesByName()
const override {
123 return {{
"output", actual_output_size_}};
125 size_t getActualOutputSize(
int index)
const override {
126 return index == 0 ? actual_output_size_ : 0;
130 uint16_t getStageTypeId()
const override {
133 uint8_t getOutputDataType(
size_t )
const override {
135 return is_inverse_ ?
static_cast<uint8_t
>(DataType::INT32)
136 : static_cast<uint8_t>(
DataType::UNKNOWN);
138 uint8_t getInputDataType(
size_t )
const override {
140 : static_cast<uint8_t>(
DataType::INT32);
144 size_t serializeHeader(
size_t , uint8_t* buf,
size_t max_size)
const override {
145 if (max_size <
sizeof(Speck2DConfig))
146 throw std::runtime_error(
"Speck2DStage: header buffer too small");
148 cfg.dim_x =
static_cast<uint32_t
>(dims_[0]);
149 cfg.dim_y =
static_cast<uint32_t
>(dims_[1]);
151 cfg.nbits_a = last_nbitsA_;
152 std::memcpy(buf, &cfg,
sizeof(cfg));
155 void deserializeHeader(
const uint8_t* buf,
size_t size)
override {
156 if (size <
sizeof(Speck2DConfig))
157 throw std::runtime_error(
"Speck2DStage: header too small");
159 std::memcpy(&cfg, buf,
sizeof(cfg));
160 dims_[0] = cfg.dim_x; dims_[1] = cfg.dim_y; dims_[2] = 1;
162 last_nbitsA_ = cfg.nbits_a;
164 size_t getMaxHeaderSize(
size_t )
const override {
165 return sizeof(Speck2DConfig);
168 void saveState()
override { saved_dims_ = dims_; }
169 void restoreState()
override { dims_ = saved_dims_; }
172 bool is_inverse_ =
false;
173 size_t actual_output_size_ = 0;
174 std::array<size_t, 3> dims_ = {0, 0, 1};
175 std::array<size_t, 3> saved_dims_ = {0, 0, 1};
176 int32_t last_B_ = -1;
177 uint64_t last_nbitsA_ = 0;
178 uint64_t last_nbitsB_ = 0;
183 Impl* impl_ =
nullptr;
187 bool pending_ =
false;
constexpr size_t FZM_STAGE_CONFIG_SIZE
Per-stage serialized config slot (bytes)
Definition fzm_format.h:65
@ SPECK2D
GPU-parallel "wavefront" SPECK-like coder (2-D), decode-parallel format.
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:139
@ UNKNOWN
Byte-transparent stages: skip type checking at finalize()
Base class interface for all compression stages.
Serialized Speck2DStage config (FZMBufferEntry.stage_config). 24 bytes.
Definition speck2d_stage.h:49
uint32_t dim_y
Y dimension.
Definition speck2d_stage.h:51
uint32_t dim_x
X (fast) dimension.
Definition speck2d_stage.h:50
int32_t B
Root onset (max msb over the whole field); -1 = all-zero.
Definition speck2d_stage.h:52
uint64_t nbits_a
Section A bit length (locates Section B in the payload).
Definition speck2d_stage.h:53
Backend-neutral GPU type aliases.