
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 后端参数。
解决步骤
- 重建纯 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 - 设置 SYCL 设备选择器:启动 llama-server 前,通过环境变量显式指定要使用的 GPU。例如使用第一张 GPU(B70):
export ONEAPI_DEVICE_SELECTOR="level_zero:0"注意:
--main-gpu参数在ONEAPI_DEVICE_SELECTOR设置后可能失效,优先使用环境变量控制。 - 回退 commit:如果上述步骤仍不工作,考虑回退到 commit ac79caa7ce61dbd800451ce43adb3dd9bf2f633b 之前的版本,以绕过可能的代码变更不兼容。
- 运行验证命令:使用简化命令验证问题是否消失,例如仅加载模型并执行空推理。在 Issue 讨论中,开发者建议使用
--verbose参数获取更多日志。
验证方法
启动 llama-server 后,观察日志中是否不再出现 error: undefined reference to _Z22__spirv_GroupBroadcastifDv3_ 或 backend compiler failed build 报错。如果成功,程序应能正常进入模型加载和 warm-up 阶段。若仍有问题,可切换至 Vulkan 后端作为备选(用户报告 A770 上 Vulkan 性能优于 SYCL),或使用 RPC 后端跨不同 GPU 后端运行。



