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`이 모든 비트가 켜진 값을 돌려주는지 SSE2와 NEON 경로에서 확인하고, `test/test_cpp.cpp`에는 conglobal 모델에서 경로 버킷이 64개까지 차는 입력으로 결과가 12개 형태소이고 "데우"가 동사(vv)로 판정되는지 검증하는 케이스가 추가됐다. 빌드 설정 파일 두 곳에도 새 테스트가 등록됐다. 다만 이 변경이 다루는 것은 찾아낸 경로의 비트마스크 계산뿐이고, 실행 시간이나 정확도 차이를 숫자로 제시한 자료는 없다. 성능 개선 여부는 이 자료만으로 판단하기 이르며, 경계 조건 버그 하나를 막은 작은 변경에 가깝다.