llama.cpp发布b12102:ggml视图内存边界检查改为按步长实际触及的字节计算
该版本合并PR #31584,使视图函数在构造张量时传入stride,并按实际触及的字节校验上界;同时要求带步长的视图起点在dim 0上必须是连续元素。发布页列出的各平台预编译包包含macOS、Linux、Windows、Android等。
AI解读:llama.cpp发布b12102版本,核心变更来自PR #31584,修改的是ggml中视图(view)的内存边界检查方式。
按发布说明,此前视图是用同形状连续张量的大小、在stride尚未设置前与源张量比对:行重叠但仍在源内的视图会被拒绝,stride更宽、实际越界的视图反而通过。现在视图函数把stride传给张量构造函数,由后者像ggml_nbytes一样校验实际触及的字节。
同一提交还调整了delta_net的卷积窗口创建方式,改为一次性创建全部行,而不是在校验之后再拓宽。
另一项改动是断言带步长的视图从连续元素开始:视图函数把nb[0] 设为类型大小,因此源张量在dim 0上必须连续。
发布页同时列出各平台预编译包,涵盖macOS(arm64、x64)、iOS XCFramework、Linux(CPU、Vulkan、CUDA 12/13、ROCm、OpenVINO、SYCL等)、Android、Windows与UI包;openEuler与macOS KleidiAI版本标注为DISABLED。
llama.cpp发布b12102版本。发布说明显示,本次合并PR #31584,改动ggml中视图(view)与源张量之间的边界校验逻辑,并附带一项关于带步长视图起点的断言。
边界校验改为按stride实际触及的字节
发布说明描述原实现的问题:视图此前是用同形状连续张量的大小、在stride设置之前与源张量比对。这使得行之间存在重叠、但实际仍落在源张量范围内的视图无法通过检查;而stride更宽、实际读到源张量末尾之外的视图却能通过。
改动后,视图函数把stride传给张量构造函数,由构造函数像ggml_nbytes那样校验这些stride实际触及的字节数。
- 受影响对象:ggml中创建视图的函数及其边界检查。
- 变化要点:校验依据从“同形状连续张量大小”改为“stride实际触及的字节”。
- PR编号:#31584。
delta_net卷积窗口与连续性断言
同一提交把delta_net的卷积窗口改为一次性创建全部行,替代此前在校验之后再加宽的做法。
提交还新增断言:带步长的视图必须从连续元素开始。说明给出的原因是视图函数把nb[0] 设为类型大小,因此源张量在dim 0上必须是连续元素,视图才能正确读取。
- delta_net卷积窗口:一次性创建全部行。
- 新增断言:步长视图的起点在dim 0上须为连续元素。
预编译包范围
发布页同时列出该版本的预编译产物,覆盖macOS、iOS、Linux、Android、Windows与UI。其中macOS Apple Silicon的KleidiAI版本与openEuler相关构建标注为DISABLED。
- macOS:Apple Silicon(arm64)、Intel(x64)、iOS XCFramework;KleidiAI版本标注DISABLED。
- Linux:Ubuntu x64/arm64/s390x的CPU包,以及Vulkan、CUDA 12.8/13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16等构建;含Snapdragon(CPU、Adreno GPU、Hexagon NPU)包。
- Windows:CPU(x64、arm64)、OpenCL Adreno、CUDA 12.4/13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0。
- Android:arm64 CPU与Snapdragon(CPU、Adreno GPU、Hexagon NPU)包。