llama.cpp b12073修复Vulkan后端NVFP4 UE4M3缩放查表越界
补丁把非OCP路径的ue4m3_fp32_lut从 128 项扩到 256 项,并同步调整两个初始化循环和两处主机端共享内存预算;每个NVFP4管线因此多占用 512 字节共享内存。
AI解读:问题出现在非OCP路径:ue4m3_fp32_lut只有 128 项,却被用原始缩放字节直接索引。ggml_validate_row_data接受任意字节,ggml_ue4m3_to_fp32忽略第 7 位,因此字节值大于等于 0x80时会读到共享内存数组之外。提交说明指出,Vulkan的robustness机制不覆盖共享内存。
修复方式是把查表、两个初始化循环和两处主机端共享内存预算都扩到 256 项。提交说明称ue4m3_to_fp32_build() 本身会屏蔽指数位、只把 0 和 0x7F视为特殊值,因此 128–255 项与CPU行为一致;256 项表还能让 0xFF与 0x7F保持区别——CPU把 0xFF解码为非零值,把 0x7F解码为零。
代价是每个NVFP4管线多用 512 字节共享内存。提交说明称ggml_fp32_to_ue4m3从不设置第 7 位,所以由llama.cpp量化的模型不受影响。该PR由Dongsheng Luo共同署名,提交信息标注Assisted-by: Claude与Codex。
llama.cpp发布构建b12073,其中一项改动为修复Vulkan后端NVFP4 UE4M3缩放查表的越界读取,对应PR #31079。
越界发生在非OCP路径的共享内存查表
按提交说明,非OCP路径上的ue4m3_fp32_lut有 128 项,直接用原始缩放字节索引。ggml_validate_row_data接受每一个字节,ggml_ue4m3_to_fp32又忽略第 7 位,因此当字节值大于等于 0x80时,查表会读到共享内存中的数组之外。提交说明还指出,Vulkan的robustness保护不覆盖共享内存。
修复将表扩至 256 项,并调整初始化与共享内存预算
补丁把该表、两个初始化循环和两处主机端共享内存预算都改成 256 项。提交说明称ue4m3_to_fp32_build() 已屏蔽指数位、只把 0 和 0x7F作为特殊值处理,所以新增的 128–255 项与CPU结果一致;256 项表还保留了 0xFF与 0x7F的差异——CPU将 0xFF解码为非零值,将 0x7F解码为零。
- 每个NVFP4管线因此多使用 512 字节共享内存。
- 提交说明称ggml_fp32_to_ue4m3从不设置第 7 位,因此由llama.cpp量化的模型不受影响。
- 该PR由Dongsheng Luo共同署名,提交信息标注Assisted-by: Claude与Assisted-by: Codex。