Misc. bug: SYCL undefined reference to _Z22__spirv_GroupBroadcastifDv3_

用户在 Linux 系统上使用 IntelLLVM 2026.0.0 编译的 llama.cpp (version 9763, commit dec5ca557) 启动 llama-server,指定 --device SYCL0 并加载 Qwen 3.6-27B 模型。程序启动后在 GPU ker

Misc. bug: SYCL undefined reference to _Z22__spirv_GroupBroadcastifDv3_

Misc. bug: SYCL undefined reference to _Z22__spirv_GroupBroadcastifDv3_

快速结论:该报错发生在使用 Intel SYCL 后端运行 llama.cpp(如 llama-server)时,SYCL GPU kernel 编译失败,错误指向 SPIR-V 内建函数 __spirv_GroupBroadcast 未定义引用。优先排查是否为同时启用 SYCL 和 Vulkan 后端导致符号冲突,或尝试纯 SYCL 构建。

问题场景

用户在 Linux 系统上使用 IntelLLVM 2026.0.0 编译的 llama.cpp (version 9763, commit dec5ca557) 启动 llama-server,指定 --device SYCL0 并加载 Qwen 3.6-27B 模型。程序启动后在 GPU kernel 编译阶段报错。用户确认之前同系统环境正常工作,仅通过更新 llama.cpp 版本后出现此问题。

报错原文

error: undefined reference to `_Z22__spirv_GroupBroadcastifDv3_m'
in function: '__spirv_GroupBroadcast(int, float, unsigned long vector[3])' called by kernel: 'typeinfo name for ggml_sycl_op_rms_norm_back(ggml_backend_sycl_context&, ggml_tensor*)::'lambda'(sycl::_V1::handler&)::operator()(sycl::_V1::handler&) const::'lambda'(sycl::_V1::nd_item)'

error: backend compiler failed build.
Exception caught at file:/tmp/llama.cpp/ggml/src/ggml-sycl/ggml-sycl.cpp, line:4996
Error OP RMS_NORM

原因分析

可能原因:

  • 构建时同时启用了 SYCL 和 Vulkan 后端(-DGGML_SYCL=ON -DGGML_VULKAN=ON),即使运行时只使用一个后端,两个后端的符号或编译环境可能发生冲突,导致 SPIR-V 内建函数链接失败。
  • 特定 commit (ac79caa7ce61dbd800451ce43adb3dd9bf2f633b) 引入的代码变更与 IntelLLVM 2026.0.0 编译器的 SYCL 实现存在不兼容,影响了 __spirv_GroupBroadcast 函数的符号生成。
  • 用户环境中未设置 ONEAPI_DEVICE_SELECTOR 环境变量来正确选择 SYCL 设备(默认行为可能尝试访问不兼容的 GPU 导致 kernel 构建失败)。

环境排查

  • 确认 Intel oneAPI 工具包版本(用户使用 IntelLLVM 2026.0.0, MKL 2026.0.0, DNNL 2026.0.0)。
  • 确认物理 GPU 类型和数量(用户拥有 B70 和 A770 两张 Intel GPU)。
  • 检查构建配置中是否同时包含 -DGGML_VULKAN=ON-DGGML_SYCL=ON
  • 确认运行时环境变量 ONEAPI_DEVICE_SELECTOR 是否设置,例如 export ONEAPI_DEVICE_SELECTOR="level_zero:0" 以绑定到特定 Level Zero GPU。
  • 确认是否使用 --device SYCL0 且未误调 Vulkan 后端参数。

解决步骤

  1. 重建纯 SYCL 后端:在构建命令中移除 -DGGML_VULKAN=ON,仅保留 SYCL 后端。执行 rm -rf build 删除旧构建目录后重新 cmake 和 make。
    cmake -B build-sycl \
      -DGGML_SYCL=ON -DGGML_SYCL_TARGET=INTEL -DGGML_SYCL_F16=ON \
      -DBUILD_SHARED_LIBS=OFF \
      -DCMAKE_C_COMPILER=/opt/intel/oneapi/compiler/latest/bin/icx \
      -DCMAKE_CXX_COMPILER=/opt/intel/oneapi/compiler/latest/bin/icpx \
      -DMKL_DIR=/opt/intel/oneapi/mkl/latest/lib/cmake/mkl \
      -DTBB_DIR=/opt/intel/oneapi/tbb/latest/lib/cmake/tbb \
      -DCMAKE_PREFIX_PATH="/opt/intel/oneapi/mkl/latest;/opt/intel/oneapi/tbb/latest" \
      -DCMAKE_BUILD_TYPE=Release
  2. 设置 SYCL 设备选择器:启动 llama-server 前,通过环境变量显式指定要使用的 GPU。例如使用第一张 GPU(B70):
    export ONEAPI_DEVICE_SELECTOR="level_zero:0"

    注意: --main-gpu 参数在 ONEAPI_DEVICE_SELECTOR 设置后可能失效,优先使用环境变量控制。

  3. 回退 commit:如果上述步骤仍不工作,考虑回退到 commit ac79caa7ce61dbd800451ce43adb3dd9bf2f633b 之前的版本,以绕过可能的代码变更不兼容。
  4. 运行验证命令:使用简化命令验证问题是否消失,例如仅加载模型并执行空推理。在 Issue 讨论中,开发者建议使用 --verbose 参数获取更多日志。

验证方法

启动 llama-server 后,观察日志中是否不再出现 error: undefined reference to _Z22__spirv_GroupBroadcastifDv3_backend compiler failed build 报错。如果成功,程序应能正常进入模型加载和 warm-up 阶段。若仍有问题,可切换至 Vulkan 后端作为备选(用户报告 A770 上 Vulkan 性能优于 SYCL),或使用 RPC 后端跨不同 GPU 后端运行。

参考来源

ggml-org/llama.cpp #24928

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 10134

发表回复

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