- ggml : CPU 백엔드에서 src1을 F32로 전환
행렬 곱셈(matrix multiplications) 시 GGML_TYPE_F16의 기본 계산 방식을 변경하여, 데이터가 포함된 vec_dot_type(F16)이 이제 F32를 사용하게 되었습니다. 따라서 내적(dot product)은 새로운 ggml_vec_dot_f16_f32를 통해 처리됩니다 (x = F16 src0, y = F32 src1). 이로 인해 src1이 더 이상 F16으로 양자화되지 않으며, F32 부동소수점(FP) 범위에만 맞는 최악의 경우 입력 값들이 올바르게 처리됩니다.
- conv_2d/conv_3d: im2col 패치(내부 mul_mat src1)를 F32로 저장하고, 내부 mul_mat에 별도의 src0/src1 타입을 전달합니다. 이전의 F16 패치는 내부 mul_mat이 src1을 conv 작업 버퍼로 확장하면서 패치를 손상시키고 대규모 입력에서 충돌을 일으켰습니다.
- conv_transpose_1d/2d (F16 커널): 작업 버퍼(work buffer) 내에서 src1을 F32로 유지하고 ggml_vec_dot_f16_f32를 사용합니다. 이에 맞춰 작업 버퍼 계획도 업데이트되었습니다.
- supports_op: F16 src1에 대한 MUL_MAT 지원이 복원되었으며, 이는 이제 F32로 확장됩니다.
- ggml_vec_dot_f16_f32: x의 청크를 F32로 변환하고 F32 SIMD 내적을 재사용하여 GGML_SIMD 지원을 추가했습니다.
- mul_mat/mul_mat_id: ggml_prec_get_src(dst, 1)이 src1을 F16으로 변환할 수 있도록 사용 가능한 효율적인 F16 x F16 경로에 대한 TODO를 추가했습니다.
MUL_MAT f16 x f32 성능 (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
지원 기여: dsh:llama.cpp/ggml-org/GLM-5.3-Flash-GGUF (Mac Studio, M5 Ultra, 256GB)
ggml_vec_dot_f16_f32의 256비트 결합 경로는 AVX2와 FMA를 필요로 했기 때문에, AVX 및 F16C만 가진 CPU는 청크 변환(chunked conversion)으로 폴백했으며, 이로 인해 F16 디코딩 속도가 이전보다 4배 느렸습니다. 이를 AVX && F16C 에서 활성화하고, mul + add를 FMA 없이 수행하는 GGML_F32x8_FMA와 누적했습니다.
공동 작성자: Pascal [email protected]