Compile bug: SIGILL running `llama-cli` on RISCV SiFive P550

用户在 SiFive Premier P550 机器(RISCV64 架构)上编译 llama.cpp (提交 6b80c74f2853 ),编译成功后执行 llama-cli --version 立即崩溃,表现为 SIGILL 。编译时使用了 -DGGML_VULKAN=1 -DGGML_ZFH=

Compile bug: SIGILL running `llama-cli` on RISCV SiFive P550

Compile bug: SIGILL running `llama-cli` on RISCV SiFive P550

快速结论:该报错通常发生在 RISCV 平台(如 SiFive P550)上编译并运行 llama-cli 时,由于 CPU 缺少某些扩展(如 ZfhZvbb 等)但编译时未正确禁用对应 GGML 选项,导致执行到半精度浮点转换函数时触发非法指令 (SIGILL)。优先排查方式是检查编译命令中的 -DGGML_RV_* 系列选项是否与目标 CPU 的 ISA 扩展完全匹配。

问题场景

用户在 SiFive Premier P550 机器(RISCV64 架构)上编译 llama.cpp(提交 6b80c74f2853),编译成功后执行 llama-cli --version 立即崩溃,表现为 SIGILL。编译时使用了 -DGGML_VULKAN=1 -DGGML_ZFH=0 -DGGML_ZFHMIN=0 -DCMAKE_BUILD_TYPE=Debug

报错原文

Thread 1 "llama-cli" received signal SIGILL, Illegal instruction.
0x00007ffff26231bc in riscv_compute_fp32_to_fp16 (f=0) at /home/ubuntu/dev/llama.cpp/ggml/src/ggml-cpu/simd-mappings.h:104
104	        _Float16 hf = (_Float16)f;

原因分析

根本原因是编译时缺少对 RISCV 扩展宏的正确禁用。用户 CPU SiFive P550 的 ISA 为 rv64imafdch_zicsr_zifencei_zba_zbb_sscofpmf不包含 Zfh(半精度浮点)扩展。但 Issue 作者最初只设置了 -DGGML_ZFH=0 -DGGML_ZFHMIN=0,却没有设置 -DGGML_RV_ZFH=0-DGGML_RV_ZFHMIN=0(注意前缀 _RV_),导致编译时仍生成了使用 _Float16 指令的代码,运行时触发 SIGILL。

环境排查

  • 确认操作系统:Linux (Ubuntu)
  • 确认内核版本:6.6.77-2-premier
  • 确认编译器:gcc 14.2.0
  • 确认 CPU / ISA 扩展:检查 /proc/cpuinfoisa 行,尤其关注是否含有 ZfhZvbbZihintpauseZicbop 等扩展
  • 确认编译命令中是否同时设置了 -DGGML_RV_* 系列选项(而非仅 -DGGML_Z*

解决步骤

  1. 根据目标 CPU 的 ISA 扩展清单,在 CMake 中显式禁用所有该 CPU 不支持的 GGML_RV_* 选项。以 SiFive P550(ISA 不含 Zfh、Zvbb、Zihintpause、Zicbop)为例,可优先尝试以下编译命令(已验证有效):
    cmake -B build -DGGML_VULKAN=1 \
          -DGGML_RVV=0 \
          -DGGML_RV_ZIHINTPAUSE=0 \
          -DGGML_RV_ZICBOP=0 \
          -DGGML_RV_ZVFH=0 \
          -DGGML_RV_ZFH=0 \
          -DGGML_RV_ZFHMIN=0 \
          -DCMAKE_BUILD_TYPE=Release
    cmake --build build --config Release
  2. 如果仍有其他 SIGILL,进一步检查 /proc/cpuinfoisa 字段,排查是否缺少 V(向量扩展)或 Zvbb 等,并对应增加 -DGGML_RV_* 禁用选项。
  3. 建议设置 -DCMAKE_BUILD_TYPE=Release(原 Issue 作者在 Debug 下触发,Release 下效果可能更稳定)。

验证方法

重新编译后运行 ./build/bin/llama-cli --version(或 llama-cli -h),若不报 SIGILL 并能正常输出版本/帮助信息,则问题解决。也可以运行一个极简模型推理测试(如 llama-cli -m tiny_model.gguf -p "hello")进一步验证。

参考来源

ggml-org/llama.cpp #24250

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 7585

发表回复

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