FZGPUModules 2.0
GPU-accelerated modular compression pipelines
Loading...
Searching...
No Matches
diff.h
Go to the documentation of this file.
1#pragma once
2
8#include "stage/stage.h"
9#include "fzm_format.h"
10#include <cuda_runtime.h>
11#include <cstdint>
12#include <cstring>
13#include <type_traits>
14
15namespace fz {
16
50template<typename T = float, typename TOut = T>
51class DifferenceStage : public Stage {
52 static_assert(
53 std::is_same_v<T, TOut> ||
54 (std::is_integral_v<T> && std::is_signed_v<T> &&
55 std::is_integral_v<TOut> && std::is_unsigned_v<TOut> &&
56 sizeof(T) == sizeof(TOut)),
57 "DifferenceStage: TOut must equal T, or T must be a signed integer "
58 "and TOut its unsigned counterpart of the same width (negabinary fusion).");
59public:
60 DifferenceStage() : actual_output_size_(0), is_inverse_(false), chunk_size_(0) {}
61
62 void setInverse(bool inverse) override { is_inverse_ = inverse; }
63 bool isInverse() const override { return is_inverse_; }
64
72 void setChunkSize(size_t bytes) { chunk_size_ = bytes; }
73 size_t getChunkSize() const { return chunk_size_; }
74 size_t getRequiredInputAlignment() const override {
75 return chunk_size_ > 0 ? chunk_size_ : 1;
76 }
77
78 void execute(
79 cudaStream_t stream,
80 MemoryPool* pool,
81 const std::vector<void*>& inputs,
82 const std::vector<void*>& outputs,
83 const std::vector<size_t>& sizes
84 ) override;
85
86
87 std::string getName() const override { return "Difference"; }
88 size_t getNumInputs() const override { return 1; }
89 size_t getNumOutputs() const override { return 1; }
90
91 std::vector<size_t> estimateOutputSizes(
92 const std::vector<size_t>& input_sizes
93 ) const override {
94 return {input_sizes[0]}; // size-preserving (sizeof(T)==sizeof(TOut))
95 }
96
97 std::unordered_map<std::string, size_t> getActualOutputSizesByName() const override {
98 return {{"output", actual_output_size_}};
99 }
100 size_t getActualOutputSize(int index) const override {
101 return (index == 0) ? actual_output_size_ : 0;
102 }
103
104 uint16_t getStageTypeId() const override {
105 return static_cast<uint16_t>(StageType::DIFFERENCE);
106 }
107
108 uint8_t getOutputDataType(size_t output_index) const override {
109 (void)output_index;
110 return static_cast<uint8_t>(getOutDataTypeEnum());
111 }
112
113 uint8_t getInputDataType(size_t /*input_index*/) const override {
114 return static_cast<uint8_t>(getInDataTypeEnum());
115 }
116
117 size_t serializeHeader(size_t output_index, uint8_t* buf, size_t max_size) const override {
118 (void)output_index;
119 if (max_size < 6) return 0;
120 buf[0] = static_cast<uint8_t>(getInDataTypeEnum());
121 buf[1] = static_cast<uint8_t>(getOutDataTypeEnum());
122 uint32_t cs = static_cast<uint32_t>(chunk_size_);
123 std::memcpy(buf + 2, &cs, sizeof(uint32_t));
124 return 6;
125 }
126
127 void deserializeHeader(const uint8_t* buf, size_t size) override {
128 // DataTypes are baked into the template; factory picks the right instantiation.
129 // Only chunk_size needs to be restored at runtime.
130 if (size >= 6) {
131 uint32_t cs = 0;
132 std::memcpy(&cs, buf + 2, sizeof(uint32_t));
133 chunk_size_ = cs;
134 }
135 }
136
137 size_t getMaxHeaderSize(size_t output_index) const override {
138 (void)output_index;
139 return 6;
140 }
141
142 void saveState() override {
143 saved_chunk_size_ = chunk_size_;
144 saved_actual_output_size_ = actual_output_size_;
145 }
146
147 void restoreState() override {
148 chunk_size_ = saved_chunk_size_;
149 actual_output_size_ = saved_actual_output_size_;
150 }
151
152private:
153 size_t actual_output_size_;
154 size_t saved_actual_output_size_ = 0;
155 bool is_inverse_;
156 size_t chunk_size_;
157 size_t saved_chunk_size_ = 0;
158
159
160 DataType getInDataTypeEnum() const {
161 if (std::is_same_v<T, uint8_t>) return DataType::UINT8;
162 if (std::is_same_v<T, uint16_t>) return DataType::UINT16;
163 if (std::is_same_v<T, uint32_t>) return DataType::UINT32;
164 if (std::is_same_v<T, uint64_t>) return DataType::UINT64;
165 if (std::is_same_v<T, int8_t>) return DataType::INT8;
166 if (std::is_same_v<T, int16_t>) return DataType::INT16;
167 if (std::is_same_v<T, int32_t>) return DataType::INT32;
168 if (std::is_same_v<T, int64_t>) return DataType::INT64;
169 if (std::is_same_v<T, float>) return DataType::FLOAT32;
170 if (std::is_same_v<T, double>) return DataType::FLOAT64;
171 return DataType::UINT8;
172 }
173
174 DataType getOutDataTypeEnum() const {
175 if (std::is_same_v<TOut, uint8_t>) return DataType::UINT8;
176 if (std::is_same_v<TOut, uint16_t>) return DataType::UINT16;
177 if (std::is_same_v<TOut, uint32_t>) return DataType::UINT32;
178 if (std::is_same_v<TOut, uint64_t>) return DataType::UINT64;
179 if (std::is_same_v<TOut, int8_t>) return DataType::INT8;
180 if (std::is_same_v<TOut, int16_t>) return DataType::INT16;
181 if (std::is_same_v<TOut, int32_t>) return DataType::INT32;
182 if (std::is_same_v<TOut, int64_t>) return DataType::INT64;
183 if (std::is_same_v<TOut, float>) return DataType::FLOAT32;
184 if (std::is_same_v<TOut, double>) return DataType::FLOAT64;
185 return DataType::UINT8;
186 }
187};
188
189// ─── Same-type instantiations (original API, TOut = T) ───────────────────────
190extern template class DifferenceStage<float>;
191extern template class DifferenceStage<double>;
192extern template class DifferenceStage<int32_t>;
193extern template class DifferenceStage<int64_t>;
194extern template class DifferenceStage<uint16_t>;
195extern template class DifferenceStage<uint8_t>;
196extern template class DifferenceStage<uint32_t>;
197
198// ─── Negabinary-fused instantiations (TOut = unsigned counterpart of T) ───────
199extern template class DifferenceStage<int8_t, uint8_t>;
200extern template class DifferenceStage<int16_t, uint16_t>;
201extern template class DifferenceStage<int32_t, uint32_t>;
202extern template class DifferenceStage<int64_t, uint64_t>;
203
204} // namespace fz
Definition diff.h:51
void deserializeHeader(const uint8_t *buf, size_t size) override
Definition diff.h:127
void setChunkSize(size_t bytes)
Definition diff.h:72
void setInverse(bool inverse) override
Definition diff.h:62
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
Definition diff.h:91
size_t serializeHeader(size_t output_index, uint8_t *buf, size_t max_size) const override
Definition diff.h:117
void saveState() override
Definition diff.h:142
std::string getName() const override
Definition diff.h:87
uint16_t getStageTypeId() const override
Definition diff.h:104
size_t getRequiredInputAlignment() const override
Definition diff.h:74
uint8_t getOutputDataType(size_t output_index) const override
Definition diff.h:108
size_t getActualOutputSize(int index) const override
Definition diff.h:100
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::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition diff.h:97
uint8_t getInputDataType(size_t) const override
Definition diff.h:113
size_t getMaxHeaderSize(size_t output_index) const override
Definition diff.h:137
Definition mempool.h:82
Definition stage.h:30
FZM binary file format definitions — structs, enums, and helpers.
Definition fzm_format.h:25
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:104
Base class interface for all compression stages.