llama.cpp
12ab5979 - ggml : switch to F32 src1 in the CPU backend (#31854)

Commit
3 days ago
ggml : switch to F32 src1 in the CPU backend (#31854) * ggml : switch to F32 src1 in the CPU backend Change the default computation for GGML_TYPE_F16 to use F32 for src1 data in matrix multiplications: vec_dot_type(F16) is now F32 and the dot product goes through the new ggml_vec_dot_f16_f32 (x = F16 src0, y = F32 src1), so src1 is no longer quantized to F16 and worst-case inputs that only fit in the F32 FP range are handled correctly. - conv_2d/conv_3d: store im2col patches (the inner mul_mat src1) as F32 and pass separate src0/src1 types to the inner mul_mat; the previous F16 patches made the inner mul_mat widen src1 into the conv work buffer, corrupting the patches and crashing on large inputs - conv_transpose_1d/2d (F16 kernel): keep src1 in F32 in the work buffer and use ggml_vec_dot_f16_f32; update work buffer planning accordingly - supports_op: restore MUL_MAT support for F16 src1, which is now widened to F32 - ggml_vec_dot_f16_f32: add GGML_SIMD support by converting chunks of x to F32 and reusing the F32 SIMD dot - mul_mat/mul_mat_id: add TODOs for a more efficient F16 x F16 path that can be used if ggml_prec_get_src(dst, 1) allows converting src1 to F16 MUL_MAT f16 x f32 perf on M5 Ultra (GFLOPS): - m=2048, n=512, k=16 : 120.9 -> 101.7 - m=2048, n=512, k=64 : 150.5 -> 344.2 - m=4096, k=14336 GEMV: 63 -> 343-415 - m=4096, n=512, k=14336: 65.6 -> 770.2 Assisted-by: dsh:llama.cpp/ggml-org/GLM-5.3-Flash-GGUF (Mac Studio, M5 Ultra, 256GB) * cont : add some F16 x F32 vectorized paths * cont : enable the fused F16 x F32 dot on AVX without FMA The 256-bit fused path of ggml_vec_dot_f16_f32 required AVX2 and FMA, so CPUs with AVX and F16C only fell back to the chunked conversion and F16 decode was 4x slower than before. Enable it on __AVX__ && __F16C__ and accumulate with GGML_F32x8_FMA, which does mul + add without FMA. --------- Co-authored-by: Pascal <admin@serveurperso.com>
Author
Parents
Loading