llama.cpp 프로젝트가 2026년 10월 29일 SYCL 백엔드를 손본 빌드 b11979와 b11980을 공개했다. b11980은 양자화한 KV 캐시를 변환 없이 바로 읽는 플래시 어텐션 커널을 넣었고, b11979는 재배열 레이아웃 텐서의 역양자화 저장 방식을 바꿔 프리필 속도를 높였다.1,2
새 디코딩 커널은 Q·K 계산에만 Intel XMX 유닛의 DPAS 명령을 쓰고, V·P 계산은 f16을 유지한다. 개발자가 Arc B580에서 Llama 3.1 8B Q4_K_M 모델에 q4_0 KV 캐시를 적용해 16K 문맥으로 측정한 결과, 토큰 생성(tg128) 속도가 초당 31.3개에서 54.2개로 올랐다. 프리필 개선은 Arc Pro B70에서 측정했다.1,2
b11980: 양자화 KV 캐시 디코딩 커널
디코딩과 쿼리 토큰 1~31개의 작은 배치는 이제 q4_0, q8_0 KV 블록에서 플래시 어텐션을 곧바로 실행한다. 이전에는 스칼라 방식으로 역양자화하거나 호출마다 캐시 전체를 f16으로 바꿔야 했다. Q·K 계산은 XMX에서 s8×s4, s8×s8 DPAS로 처리하고 V·P는 f16을 유지한다. joint_matrix가 s4를 지원하지 않아 dpas.s4.s8은 인라인 vISA로 구현했다.
헤드 크기는 64~512를 지원했으나 후속 커밋에서 192는 뺐다. 최대 32까지의 그룹 쿼리 어텐션과 어텐션 싱크도 지원한다. 프롬프트 처리는 기존 커널이 맡는다. B580에서 수행한 FLASH_ATTN_EXT 테스트는 4584건 중 4582건을 통과했고, 실패 2건은 master 브랜치와 같다.1
b11979: 프리필 역양자화 저장 최적화
b11979는 재배열(reordered) 레이아웃 텐서의 역양자화 커널이 값을 스칼라로 하나씩 쓰던 것을 vec 단위 저장으로 바꿨다. 연산과 반올림은 같고 출력은 비트 단위로 동일하다. 대상은 Q4_0, Q4_K, Q5_K, Q6_K, Q3_K, IQ3_XXS, IQ3_S, Q2_K, MXFP4다. 개발자는 Arc Pro B70에서 디코딩 이후 프리필(primed prefill)을 pp512와 pp2048로 측정했다. MXFP4를 뺀 나머지 형식은 새로 설치한 레이아웃(fresh layout)의 프리필과 디코딩이 변하지 않았고, Perplexity는 실행 간 오차 범위였다. MXFP4는 fresh 레이아웃에서도 프리필이 늘었고 디코딩은 변하지 않았다.2
| 양자화 형식 | 증가율 | 측정 모델 |
|---|---|---|
| Q4_0 | +6.4~7.3% | Q4_0 모델(최대 27B 밀집) |
| Q4_K | +14.7~15.3% | Q4_K 위주 모델(최대 27B 밀집) |
| Q5_K | +3.6% | Q5_K 위주 27B |
| Q6_K | +28.7% | Q6_K 27B |
| Q3_K | +16.8% | Q3_K 위주 27B |
| IQ3_XXS·IQ3_S | +20.3~21.1% | 각 형식 위주 27B |
| Q2_K | +13.1% | Q2_K 위주 27B |
| MXFP4 | pp2048 +57%, pp512 +61% | MXFP4 MoE 20B |
Q5_K는 저장 폭만 넓혀서는 효과가 없었다. 혼합 양자화 모델에서는 오차 범위, Q5_K 위주 모델에서는 +0.5%였다. 병목이 저장이 아니라 스칼라 ql·qh 바이트 로드와 로컬 메모리 스케일 브로드캐스트에 있었기 때문이다. 그래서 블록당 32스레드가 ql·qh 바이트 4개씩 읽어 vec4 저장 2개를 내도록 작업 분해를 다시 짜서 +3.6%를 얻었고, GET_ROWS 재배열 경로도 같은 방식으로 옮겼다. MXFP4는 MoE 전문가 경로(reorder_qw_mxfp4_moe)에만 재배열 레이아웃이 설치되며, 밀집 MXFP4 텐서는 기존 레이아웃을 쓴다.2
출처
- ggml-org/llama.cpp b11980 github.com
- ggml-org/llama.cpp b11979 github.com