Devotd Github
新发现韩国科技

bab2min/kiwi — 修复 SIMD 搜索位掩码中的未定义移位行为

bab2min/kiwi 更改了 SIMD 搜索(findAll)的位掩码计算,消除了当大小为 size_t 完整宽度时出现的未定义移位行为。

仓库信息bab2min/kiwi ↗

bab2min/kiwi 更改了 SIMD 搜索(findAll)的位掩码计算,消除了当大小为 size_t 完整宽度时出现的未定义移位行为。

GitHub 项目说明: Kiwi(지능형 한국어 형태소 분석기)

星标
★ 796
复刻
81
语言
C++
许可证
Apache-2.0
最新版本
v0.24.0
查看原始来源 ↗在 GitHub 查看 ↗

bab2min/kiwi 的最新提交是一项修复 SIMD 搜索位掩码计算代码的变更。2026 年 10 月 24 日合并的 PR #295(由 ollipa 提交)将 `findAll` 在构造只保留结果低位(低阶位)的掩码时按 `size_t` 全宽移位的代码,替换为 `lowBitsMask` 辅助函数。

kiwi(智能韩语形态分析器)是一个将韩语句子切分为形态素单位并标注词性的库。搜索代码 `findAll` 是一个函数,它在候选路径字节数组中返回与给定字符匹配的位置,并以位掩码形式呈现,其实现按 SSE2、AVX2、AVX512、NEON 等架构分别编写。各实现都附加了 `((size_t)1 << size) - 1` 形式的掩码,以便只保留与比较字节数相对应的低位;但当 `size` 等于 `size_t` 的完整位宽(例如 64)时,移位宽度就等于类型宽度,按照 C++ 标准成为未定义行为。新的辅助函数在 `size` 大于或等于 `sizeof(size_t) * 8` 时返回所有位均为 1 的值,小于时则返回与原来相同的值。

提交统计为新增 50 行、删除 11 行,代码在单一文件 `src/search.cpp` 内统一应用于 SSE、AVX2、AVX512、NEON 全部路径。回归测试也一并加入。新文件 `test/test_search.cpp` 在 SSE2 和 NEON 路径上确认 64 字节全部匹配时 `findAll` 返回所有位均为 1 的值,`test/test_cpp.cpp` 中还新增了一个用例,使用 conglobal 模型、以路径桶填满至 64 个的输入,验证结果为 12 个形态素且 "데우" 被判定为动词(vv)。两处构建配置文件中也登记了新测试。不过,这次变更处理的只是所找到路径的位掩码计算,并没有给出以数字呈现的运行时间或准确度差异资料。仅凭这些资料难以判断是否带来性能提升,它更接近于一个阻止边界条件缺陷的小改动。