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` が 64 のように `size_t` の全ビット幅と等しくなると、シフト幅が型幅と等しくなり、C++ 標準上未定義の動作となる。新しいヘルパーは、`size` が `sizeof(size_t) * 8` 以上ならば全ビットが 1 の値を返し、それより小さければ従来と同じ値を返す。

コミット統計は 50 行の追加、11 行の削除で、コードは単一ファイル `src/search.cpp` の中で SSE・AVX2・AVX512・NEON の全パスに共通して適用された。回帰テストも同時に追加された。新規ファイル `test/test_search.cpp` は、64 バイトがすべて一致した場合に `findAll` が全ビットが 1 の値を返すかを SSE2 と NEON のパスで確認し、`test/test_cpp.cpp` には conglobal モデルにおいてパスバケットが 64 個まで埋まる入力を用い、結果が 12 個の形態素となり "데우" が動詞(vv)と判定されるかを検証するケースが追加された。ビルド設定ファイル 2 箇所にも新しいテストが登録された。ただし、この変更が扱うのは検出されたパスのビットマスク計算のみで、実行時間や精度の差を数値で提示した資料はない。性能改善の有無をこの資料だけで判断するには早計であり、境界条件のバグ 1 つを塞いだ小さな変更に近い。