ember.cpp 0.1.0
C++ inference engine for Llama-family and paperkiln models (CPU, CUDA, WebAssembly)
Loading...
Searching...
No Matches
safetensors_loader.cpp File Reference
#include "safetensors_loader.h"
#include "model.h"
#include "logger.h"
#include "model_macros.h"
#include <fstream>
#include <stdexcept>
#include <nlohmann/json.hpp>
#include <algorithm>
#include <cctype>
#include <vector>
#include <string>
#include <map>
#include <memory>
#include <filesystem>
#include <sys/stat.h>
#include <cerrno>
Include dependency graph for safetensors_loader.cpp:

Go to the source code of this file.

Functions

float cpu_bf16_to_float32 (uint16_t bf16_raw)
 
float cpu_f16_to_float32 (uint16_t f16_raw)
 

Function Documentation

◆ cpu_bf16_to_float32()

float cpu_bf16_to_float32 ( uint16_t  bf16_raw)
inline

Definition at line 31 of file safetensors_loader.cpp.

31 {
32 unsigned int bits = ((unsigned int)bf16_raw) << 16;
33 float result;
34 memcpy(&result, &bits, sizeof(float));
35 return result;
36}
size_t j

References j.

Referenced by SafeTensorsLoader::convert_tensor_data().

◆ cpu_f16_to_float32()

float cpu_f16_to_float32 ( uint16_t  f16_raw)
inline

Definition at line 37 of file safetensors_loader.cpp.

37 {
38 const uint32_t sign_mask_f16 = 0x8000;
39 const uint32_t exp_mask_f16 = 0x7C00;
40 const uint32_t mant_mask_f16 = 0x03FF;
41 const int32_t exp_bias_f16 = 15;
42 const int32_t exp_bias_f32 = 127;
43
44 uint32_t sign_f32 = (static_cast<uint32_t>(f16_raw & sign_mask_f16)) << 16;
47
49
50 if (exp_f16 == 0x1F) { // F16 NaN or Inf
51 f32_bits = sign_f32 | 0x7F800000U | (mant_f16 << 13); // Propagate mantissa for NaN
52 } else if (exp_f16 == 0) { // F16 zero or subnormal
53 if (mant_f16 == 0) { // Zero
55 } else { // Subnormal F16 to normal or subnormal F32
56 int32_t s = -1;
57 mant_f16 <<= 1;
58 while ((mant_f16 & 0x0400) == 0) {
59 mant_f16 <<= 1;
60 s--;
61 }
62 mant_f16 &= 0x03FF; // Clear leading 1
64 if (f32_exp_val <= 0) { // Result is subnormal F32 or zero
66 if (shift > 23) { // Underflow to zero
68 } else {
70 }
71 } else { // Result is normal F32
72 f32_bits = sign_f32 | (static_cast<uint32_t>(f32_exp_val) << 23) | (mant_f16 << 13);
73 }
74 }
75 } else { // Normal F16
77 f32_bits = sign_f32 | (static_cast<uint32_t>(f32_exp) << 23) | (mant_f16 << 13);
78 }
79
80 float result;
81 memcpy(&result, &f32_bits, sizeof(float));
82 return result;
83}

References j.

Referenced by SafeTensorsLoader::convert_tensor_data().