본문으로 건너뛰기

© 2026 Molayo

llama.cpp헤드라인2026. 06. 04. 23:52

ggml: WASM SIMD128을 사용하여 ggml_vec_dot_q4_1_q8_1 벡터화 ([#22209](https://github.com

요약

ggml 라이브러리에서 WASM SIMD128 인트린직을 사용하여 q4_1_q8_1 벡터 연산을 최적화했습니다. 이를 통해 WebAssembly 환경에서의 연산 속도를 기존 스칼라 구현 대비 약 3.42배 향상시켰습니다.

핵심 포인트

  • WASM SIMD128을 활용한 벡터화로 연산 성능 3.42배 향상
  • nibbles 언패킹 및 i16 확장을 통한 효율적인 SIMD 구현
  • WASM 백엔드 아키텍처 레이아웃에 따른 코드 재배치 수행
  • 스칼라 참조 구현과의 비교를 통해 연산 정확성 검증 완료

ggml: WASM SIMD128을 사용하여 ggml_vec_dot_q4_1_q8_1 벡터화 (#22209)

  • ggml: WASM SIMD128을 사용하여 ggml_vec_dot_q4_1_q8_1 벡터화

WASM SIMD128 인트린직 (intrinsics)을 사용하여 ggml_vec_dot_q4_1_q8_1_generic의 내부 루프를 최적화합니다. 이 기능은 #ifdef wasm_simd128 뒤에 배치되어 non-wasm 빌드에는 전혀 영향을 미치지 않습니다.

접근 방식:

  • 단일 wasm_v128_load가 패킹된 32개의 4비트 가중치(weights)를 모두 커버합니다.
  • nibbles를 AND/SHR을 통해 두 개의 u8x16 레지스터로 언패킹(unpacked)합니다.
  • 곱셈 전 i16으로 확장합니다 (WASM SIMD에는 i8*i8 명령어가 없습니다).
  • 4x wasm_i32x4_dot_i16x8 호출이 32개의 요소 쌍(element pairs)을 모두 누적합니다.
  • 4x wasm_i32x4_extract_lane을 통해 수평 축소(horizontal reduce)를 수행합니다.

벤치마크 (node v25, emcc -O3 -msimd128, 64 blocks x QK8_1=32, 200k iterations):

구현체 (impl)ns/call속도 향상 (speedup)
scalar880.71.00x
simd257.83.42x

10개의 무작위 시드(random seeds)에 대해 스칼라 참조(scalar reference)와 비교하여 출력이 정확히 일치함을 확인하여 정확성을 검증했습니다.

  • ggml: q4_1_q8_1 WASM SIMD 구현을 wasm 백엔드로 이동

아키텍처별 레이아웃을 따르기 위해 ggml_vec_dot_q4_1_q8_1의 SIMD128 구현을 ggml/src/ggml-cpu/arch/wasm/quants.c로 재배치합니다. ggml/src/ggml-cpu/quants.c에 제네릭(generic) 구현을 복구합니다. else 블록의 for 루프를 이동합니다.

  • ggml: wasm 백엔드에서 제네릭 q4_1_q8_1 폴백(fallback) 사용

macOS/iOS:

Linux:

<strong>Linux:</strong>

<strong>Android:</strong>

<strong>Windows:</strong>

<strong>Windows:</strong>

openEuler:

  • DISABLED
  • openEuler x86 (310p)
  • openEuler x86 (910b, ACL Graph)
  • openEuler aarch64 (310p)
  • openEuler aarch64 (910b, ACL Graph)

UI:

AI 자동 생성 콘텐츠

본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0