llama.cpp fails to compile in ../ggml/src/ggml-cpu/simd-mappings.h with: 45:9: error: unknown type name ‘__fp16’

该报错发生在 32 位 ARM(armv7a)环境下使用 GCC 编译 llama.cpp 且启用 NEON 优化时,编译器无法识别 __fp16 类型。优先排查编译时是否添加了 -mfp16-format=ieee 编译选项,否则代码会因缺少 IEEE 半精度格式声明而回退到非 NEON 路径。

快速结论:该报错发生在 32 位 ARM(armv7a)环境下使用 GCC 编译 llama.cpp 且启用 NEON 优化时,编译器无法识别 __fp16 类型。优先排查编译时是否添加了 -mfp16-format=ieee 编译选项,否则代码会因缺少 IEEE 半精度格式声明而回退到非 NEON 路径。

适用环境:Linux 操作系统、llama.cpp(commit 74ade52741203e5c8f81eaf06a96cb1cfe15f2a3)、CPU 后端(GGML backends: CPU)、armv7a 架构、GCC 编译器。

最快修复方案:暂无确认的一步修复方案。Issue 中提供的补丁(将 __ARM_NEON 条件改为 __ARM_NEON && __ARM_FP16_FORMAT_IEEE)已被社区成员验证有效,但尚未合并到主线,需要手动应用。

注意事项:该补丁在测试中通过了 GCC/Clang 以及启用/禁用 NEON 优化的 ARM 编译,但作者本人表示尚未进行原生编译验证。在 64 位 ARM(AArch64)环境下通常不会触发此问题,因为 __fp16 默认支持。

问题场景

用户在 Linux 上编译 Firefox Nightly(版本 155.0),构建过程中在 third_party/llama.cpp 的 NEON 编译阶段触发该错误。这是 Firefox 将 llama.cpp 作为第三方组件集成编译的场景,针对 32 位 ARM(armv7a)架构使用 GCC 编译器,启用了 NEON 优化路径。

报错原文

.deps/gmp-fake-openh264.o.pp  -fdiagnostics-color  /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/dom/media/gmp-plugin-openh264/gmp-fake-openh264.cpp
 0:52.09 E /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/third_party/llama.cpp/ggml/src/ggml-cpu/simd-mappings.h:45:9: error: unknown type name '__fp16'; did you mean '__bf16'?
 0:52.09 E    45 |         __fp16 tmp;
 0:52.10 E       |         ^~~~~~
 0:52.10 E       |         __bf16
 0:52.10 E /home/tmp/portage/portage/www-client/firefox-155.0/work/firefox-155.0/third_party/llama.cpp/ggml/src/ggml-cpu/simd-mappings.h:52:9: error: unknown type name '__fp16'; did you mean '__bf16'?
 0:52.10 E    52 |         __fp16 tmp = f;
 0:52.11 E       |         ^~~~~~
 0:52.11 E       |         __bf16

原因分析

可能原因:simd-mappings.h 中用于启用 FP16 到 FP32 转换的预编译宏条件仅为 __ARM_NEON,但在 32 位 ARM 架构上,NEON 扩展的可用性并不等同于 __fp16 类型的可用性。GCC 在 32 位 ARM 上要求通过 -mfp16-format=ieee 显式指定 IEEE 半精度格式,否则编译器不会预定义 __fp16 类型。AArch64(64 位 ARM)默认支持该类型,而 armv7a 需要额外的编译选项,这就导致了条件宏误判、代码进入 NEON 路径但编译器无法识别 __fp16 类型的编译失败。

环境排查

  • 确认目标架构是否为 32 位 ARM(armv7a)——AArch64 环境通常不会触发此问题。
  • 确认编译器类型为 GCC(Clang 对 __fp16 的处理可能有差异,需单独验证)。
  • 检查编译命令中是否带有 -mfp16-format=ieee 选项;缺失时可能导致该错误。
  • 确认 llama.cpp 版本(Issue 报告时的 commit: 74ade52741203e5c8f81eaf06a96cb1cfe15f2a3)。
  • 检查是否启用了 NEON 优化(-mfpu=neon 或类似选项)——非 NEON 构建可正常工作。

解决步骤

  1. 备份原始文件:cp ggml/src/ggml-cpu/simd-mappings.h ggml/src/ggml-cpu/simd-mappings.h.bak
  2. 编辑 ggml/src/ggml-cpu/simd-mappings.h,找到条件宏定义行(约第 30 行附近)。
  3. #if defined(__ARM_NEON) 修改为 #if defined(__ARM_NEON) && defined(__ARM_FP16_FORMAT_IEEE),同时修改对应的注释说明,使其反映 32 位 ARM 需要 -mfp16-format=ieee 才能启用 __fp16 的事实。
  4. 重新编译项目。Issue 中测试结果表明此补丁在 GCC/Clang、启用或禁用 NEON 的 ARM 编译中均通过验证。

验证方法

重新运行编译命令(如 gmake 或 Firefox 的构建命令),确认 simd-mappings.h 不再产生 unknown type name '__fp16' 错误。若编译完成后能正常生成二进制文件,且相关测试用例(如 FP16 转换测试)通过,说明修复有效。可先行使用交叉编译工具链进行快速验证,再执行完整的原生编译测试。

参考来源

ggml-org/llama.cpp #26677

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19187

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注