fp4/fp4_codec.hpp¶
FP4 v3 4-bit floating-point quantization codec (PTDS §4.1) More...
Namespaces¶
| Name |
|---|
| sgns |
| sgns::neoswarm |
| sgns::neoswarm::fp4 |
Classes¶
| Name | |
|---|---|
| struct | sgns::neoswarm::fp4::FP4Tensor Packed FP4 tensor: each byte holds two nibbles (high = even index). |
| class | sgns::neoswarm::fp4::FP4Codec Encodes and decodes FP32 weight matrices to/from FP4. |
Attributes¶
| Name | |
|---|---|
| constexpr size_t | kMacroblockRows |
| constexpr size_t | kMacroblockCols |
| constexpr size_t | kMacroblockSize |
| constexpr int | kScaleSearchSteps |
| constexpr float[16] | kFP4LUT NF4-style symmetric lookup table: 16 representable values in [-1, 1]. |
Detailed Description¶
FP4 v3 4-bit floating-point quantization codec (PTDS §4.1)
Date: 2026-05-06
Attributes Documentation¶
variable kMacroblockRows¶
variable kMacroblockCols¶
variable kMacroblockSize¶
variable kScaleSearchSteps¶
variable kFP4LUT¶
static constexpr float[16] kFP4LUT = { -1.0f, -0.6962f, -0.5251f, -0.3949f, -0.2844f, -0.1848f, -0.0911f, 0.0f,
0.0796f, 0.1609f, 0.2461f, 0.3379f, 0.4407f, 0.5626f, 0.7230f, 1.0f };
NF4-style symmetric lookup table: 16 representable values in [-1, 1].
Source code¶
#ifndef NEOSWARM_CORE_FP4_FP4CODEC_HPP
#define NEOSWARM_CORE_FP4_FP4CODEC_HPP
#include "common/error.hpp"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <vector>
namespace sgns::neoswarm::fp4
{
static constexpr size_t kMacroblockRows = 64;
static constexpr size_t kMacroblockCols = 64;
static constexpr size_t kMacroblockSize = kMacroblockRows * kMacroblockCols;
static constexpr int kScaleSearchSteps = 32;
static constexpr float kFP4LUT[16] = { -1.0f, -0.6962f, -0.5251f, -0.3949f, -0.2844f, -0.1848f, -0.0911f, 0.0f,
0.0796f, 0.1609f, 0.2461f, 0.3379f, 0.4407f, 0.5626f, 0.7230f, 1.0f };
struct FP4Tensor
{
std::vector<uint8_t> data_;
std::vector<float> scales_;
size_t rows_ = 0;
size_t cols_ = 0;
size_t NumMacroblocks() const
{
size_t mb_rows = ( rows_ + kMacroblockRows - 1 ) / kMacroblockRows;
size_t mb_cols = ( cols_ + kMacroblockCols - 1 ) / kMacroblockCols;
return mb_rows * mb_cols;
}
};
class FP4Codec
{
public:
FP4Codec() = default;
outcome::result<FP4Tensor> Encode( const float* weights,
size_t rows,
size_t cols,
const float* activation_stats = nullptr ) const;
outcome::result<void> Decode( const FP4Tensor& tensor, float* output ) const;
float ComputeError( const float* original, const FP4Tensor& encoded ) const;
private:
float FindBestScale( const float* block, size_t n, const float* act_stats = nullptr ) const;
static uint8_t QuantizeValue( float v, float scale );
static float DequantizeValue( uint8_t idx, float scale );
};
} // namespace sgns::neoswarm::fp4
#endif // NEOSWARM_CORE_FP4_FP4CODEC_HPP
Updated on 2026-07-25 at 22:56:57 +0000