FZGPUModules 1.0
GPU-accelerated modular compression pipeline
Loading...
Searching...
No Matches
negabinary_stage.h
Go to the documentation of this file.
1#pragma once
2
16#include "stage/stage.h"
17#include "fzm_format.h"
18#include "transforms/negabinary/negabinary.h"
19#include <cuda_runtime.h>
20#include <cstdint>
21#include <cstring>
22#include <stdexcept>
23#include <type_traits>
24
25namespace fz {
26
33template<typename TIn, typename TOut = typename std::make_unsigned<TIn>::type>
34class NegabinaryStage : public Stage {
35 static_assert(std::is_integral<TIn>::value && std::is_signed<TIn>::value,
36 "NegabinaryStage: TIn must be a signed integer type "
37 "(int8_t, int16_t, int32_t, or int64_t).");
38 static_assert(std::is_integral<TOut>::value && std::is_unsigned<TOut>::value,
39 "NegabinaryStage: TOut must be an unsigned integer type.");
40 static_assert(sizeof(TIn) == sizeof(TOut),
41 "NegabinaryStage: TIn and TOut must have the same byte width.");
42
43public:
44 NegabinaryStage() : is_inverse_(false), actual_output_size_(0) {}
45
46 // ── Stage control ──────────────────────────────────────────────────────
47 void setInverse(bool inv) override { is_inverse_ = inv; }
48 bool isInverse() const override { return is_inverse_; }
49
50 // ── Stage metadata ─────────────────────────────────────────────────────
51 std::string getName() const override { return "Negabinary"; }
52 size_t getNumInputs() const override { return 1; }
53 size_t getNumOutputs() const override { return 1; }
54
55 std::vector<size_t> estimateOutputSizes(
56 const std::vector<size_t>& input_sizes
57 ) const override {
58 return {input_sizes[0]}; // size-preserving
59 }
60
61 std::unordered_map<std::string, size_t> getActualOutputSizesByName() const override {
62 return {{"output", actual_output_size_}};
63 }
64 size_t getActualOutputSize(int index) const override {
65 return (index == 0) ? actual_output_size_ : 0;
66 }
67
68 uint16_t getStageTypeId() const override {
69 return static_cast<uint16_t>(StageType::NEGABINARY);
70 }
71
72 uint8_t getOutputDataType(size_t) const override {
73 return static_cast<uint8_t>(getTOutDataTypeEnum());
74 }
75
76 uint8_t getInputDataType(size_t /*input_index*/) const override {
77 // Forward input is TIn (signed); inverse input is TOut (unsigned).
78 return is_inverse_
79 ? static_cast<uint8_t>(getTOutDataTypeEnum())
80 : static_cast<uint8_t>(getTInDataTypeEnum());
81 }
82
83 // ── Serialization ──────────────────────────────────────────────────────
84 // Header: 2 bytes — [0] TIn DataType, [1] TOut DataType
85 size_t serializeHeader(size_t, uint8_t* buf, size_t max_size) const override {
86 if (max_size < 2) return 0;
87 buf[0] = static_cast<uint8_t>(getTInDataTypeEnum());
88 buf[1] = static_cast<uint8_t>(getTOutDataTypeEnum());
89 return 2;
90 }
91
92 void deserializeHeader(const uint8_t*, size_t) override {
93 // Types are baked into the template; factory picks the right instantiation.
94 }
95
96 size_t getMaxHeaderSize(size_t) const override { return 2; }
97
98 // ── Execution ──────────────────────────────────────────────────────────
99 void execute(
100 cudaStream_t stream,
101 MemoryPool* pool,
102 const std::vector<void*>& inputs,
103 const std::vector<void*>& outputs,
104 const std::vector<size_t>& sizes
105 ) override;
106
107private:
108 bool is_inverse_;
109 size_t actual_output_size_;
110
111 DataType getTInDataTypeEnum() const {
112 if (std::is_same_v<TIn, int8_t>) return DataType::INT8;
113 if (std::is_same_v<TIn, int16_t>) return DataType::INT16;
114 if (std::is_same_v<TIn, int32_t>) return DataType::INT32;
115 if (std::is_same_v<TIn, int64_t>) return DataType::INT64;
116 return DataType::INT32;
117 }
118
119 DataType getTOutDataTypeEnum() const {
120 if (std::is_same_v<TOut, uint8_t>) return DataType::UINT8;
121 if (std::is_same_v<TOut, uint16_t>) return DataType::UINT16;
122 if (std::is_same_v<TOut, uint32_t>) return DataType::UINT32;
123 if (std::is_same_v<TOut, uint64_t>) return DataType::UINT64;
124 return DataType::UINT32;
125 }
126};
127
128extern template class NegabinaryStage<int8_t, uint8_t>;
129extern template class NegabinaryStage<int16_t, uint16_t>;
130extern template class NegabinaryStage<int32_t, uint32_t>;
131extern template class NegabinaryStage<int64_t, uint64_t>;
132
133} // namespace fz
Definition mempool.h:62
Definition negabinary_stage.h:34
uint8_t getInputDataType(size_t) const override
Definition negabinary_stage.h:76
size_t getActualOutputSize(int index) const override
Definition negabinary_stage.h:64
void execute(cudaStream_t stream, MemoryPool *pool, const std::vector< void * > &inputs, const std::vector< void * > &outputs, const std::vector< size_t > &sizes) override
uint16_t getStageTypeId() const override
Definition negabinary_stage.h:68
size_t getMaxHeaderSize(size_t) const override
Definition negabinary_stage.h:96
void deserializeHeader(const uint8_t *, size_t) override
Definition negabinary_stage.h:92
std::unordered_map< std::string, size_t > getActualOutputSizesByName() const override
Definition negabinary_stage.h:61
uint8_t getOutputDataType(size_t) const override
Definition negabinary_stage.h:72
std::string getName() const override
Definition negabinary_stage.h:51
size_t serializeHeader(size_t, uint8_t *buf, size_t max_size) const override
Definition negabinary_stage.h:85
std::vector< size_t > estimateOutputSizes(const std::vector< size_t > &input_sizes) const override
Definition negabinary_stage.h:55
void setInverse(bool inv) override
Definition negabinary_stage.h:47
Definition stage.h:28
FZM binary file format definitions — structs, enums, and helpers.
Definition fzm_format.h:25
@ NEGABINARY
NegabinaryStage — negabinary encode/decode.
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:103