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) |
|---|---|---|
| scalar | 880.7 | 1.00x |
| simd | 257.8 | 3.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:
- macOS Apple Silicon (arm64)
- macOS Apple Silicon (arm64, KleidiAI 활성화) 비활성화됨 (DISABLED)
- macOS Intel (x64)
- iOS XCFramework
Linux:
<strong>Linux:</strong>
- Ubuntu x64 (CPU)
- Ubuntu arm64 (CPU)
- Ubuntu s390x (CPU)
- Ubuntu x64 (Vulkan)
- Ubuntu arm64 (Vulkan)
- Ubuntu x64 (ROCm 7.2)
- Ubuntu x64 (OpenVINO)
- Ubuntu x64 (SYCL FP32) DISABLED
<strong>Android:</strong>
<strong>Windows:</strong>
<strong>Windows:</strong>
- Windows x64 (CPU)
- Windows arm64 (CPU)
- Windows x64 (CUDA 12) - CUDA 12.4 DLLs
- Windows x64 (CUDA 13) - CUDA 13.3 DLLs
- Windows x64 (Vulkan)
- Windows x64 (SYCL) DISABLED
- Windows x64 (HIP)
openEuler:
- DISABLED
- openEuler x86 (310p)
- openEuler x86 (910b, ACL Graph)
- openEuler aarch64 (310p)
- openEuler aarch64 (910b, ACL Graph)
UI:
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기