본문으로 건너뛰기

© 2026 Molayo

llama.cpp헤드라인2026. 05. 02. 18:09

hexagon: hmx flash attention (#22347) hmx: 공유 인터리브 헤더 추출 및 matmul 배치 통합 hmx: pre

요약

이 기술 기사는 Hexagon 프로세서 아키텍처에서 대규모 언어 모델(LLM)의 핵심 연산인 플래시 어텐션(Flash Attention) 및 행렬 곱셈(Matmul) 성능을 극대화하기 위한 최적화 작업들을 다룹니다. 주요 개선 사항으로는 Q6_ 인트린식으로의 아셈블리 코드 전환, 여러 HMX 워커에 대한 상류 최적화 적용, 그리고 Q 로드/O 스토어 작업을 멀티 스레딩 및 병렬 처리로 분산하는 것이 포함됩니다. 또한, 다양한 시나리오(예: prefill, GQA)에서 어텐션 계산의 정확도를 높이고 파이프라인 효율성을 개선하기 위한 세부적인 수정들이 이루어졌습니다.

핵심 포인트

  • Q6_ 인트린식으로 아셈블리 코드 전환을 통해 컴파일러 가시성 및 최적화 수준 향상
  • Flash Attention 연산에 대한 상류(upstream) 최적화를 적용하여 성능과 효율성을 개선함
  • Q 로드/O 스토어 작업을 멀티스레딩 워커 풀로 분산시켜 병렬 처리 능력을 극대화함
  • 다양한 어텐션 모드(prefill, GQA 등)에서 정확도를 보장하고 파이프라인 게이트를 완화하여 호환성을 높임
  • softmax 마스크 및 계산 과정에 대한 세부적인 최적화를 통해 연산 속도와 메모리 효율성 개선

hexagon: hmx flash attention (#22347)
hmx: 공유 인터리브 헤더 추출 및 matmul 배치 통합
hmx: prefill 를 위한 HMX 가속화 플래시 어텐션 추가
hmx: hmx-utils.h 에서 asm 래퍼를 Q6_ 인트린식 으로 교체
세 개의 단일 명령어 헬퍼를 인라인 어셈블리에서 일치하는 Q6_ 인트린식으로 전환하여, aizip f873760 에 의해 확립된 스타일과 상류 PR #21554 에서 사용된 스타일을 따릅니다.
hmx-matmul-ops.c 리팩토링:

  • hmx_set_output_scales: asm "bias=mxmem2" -> Q6_bias_mxmem2_A
  • hmx_load_tile_pair_fp16: asm packet -> Q6_activation_hf_mxmem_RR + Q6_weight_hf_mxmem_RR
  • hmx_consume_accumulator_fp16: asm "mxmem=acc" -> Q6_mxmem_AR_after_hf
  • hmx_load_tiles_fp16 은 인라인 어셈블리를 유지합니다. 이는 ":deep" 활성화 스트리밍을 사용하며, 혼합된 Q6_activation_hf_mxmem_RR_deep + 비-deep Q6_weight_hf_mxmem_RR 쌍이 HMX 백엔드 제약 조건 검사("activate weight pair (1) exceeds limit (1)")를 통과하지 못하기 때문입니다. 어셈블리 번들은 두 부분을 하나의 VLIW 패킷에 유지하여 진단을 피합니다. 기능적으로 동등하며 동일한 명령어가 방출되지만, Q6_ 인트린식은 컴파일러가 스케줄링을 위해 더 많은 가시성을 제공합니다.
    hmx: 중복된 interleave_fp16_weight_chunk_to_tiles 제거
    hmx: 상류 최적화를 hmx-flash-attn-ops.c 에 적용
    restrict, __builtin_assume, 및 포인터 누적 세 HMX 워커 (qk_dot, o_update, o_norm) 와 op_hmx_flash_attn_ext 의 일치하는 인라인 HMX 루프에 적용
    hmx: 인터리브 헬퍼 통합
    hmx: Q 로드/O 스토어를 멀티 스레드화 및 prefill FA 디스패치 활성화
    인라인 Q 로드 및 O 스토어 루프를 worker_pool-parallel 헬퍼 (fa_phase_q_load, fa_phase_o_store) 로 추출하여 HVX 스레드가 행 범위를 나누어 F32↔F16 변환 작업을 분담하도록 합니다. 또한 n_row_vec_cnt >= n_threads 에서 n_rows_g < 512 일 때에도 단일 스레드 폴백을 강제로 유발했던 softmax 스레딩 게이트를 >= 2 로 완화합니다.
    디스패치 측면에서, HTP 백엔드로의 다중 헤드 (prefill) FA 도달을 차단하던 ne[2] != 1 가드를 제거합니다. GQA 는 이미 HMX 와 HVX 플래시 어텐션 경로 모두 내부적으로 처리됩니다.
    hmx: matmul 파이프라인 게이트를 k > n 형태 (예: FFN_down) 를 포함하도록 완화
    hmx: FA softmax 마스크 단계 최적화 (no-ALiBi 빠른 경로 + GQA 중복 제거)
    hmx: 단계 경계에서 asm 메모리 클로버 추가하여 재순서 버그 방지 [실험적]: fp16 softmax (EXP2_HF) 로 fa 가속
    log2(e) 를 qk_scale 에 배수화하고 P 와 m_diff 에 대해 hvx_exp2_hf 를 직접 사용하여 base-2 일관성을 유지합니다 (htp-ops-lib 와 일치). 64 레인당 약 22 개 ALU 연산 vs F32 원복 경로 약 44 개.
    hmx flash-attn: 프로파일링 데이터에 기반한 비용 모델 계수 정제
    hmx flash-attn: vtcm_d_tiles 의 asm 클로버를 대상 volatile 읽기로 교체
    hmx flash-attn: prefill 정확도 수정 (dst 인덱싱, softmax reduce, V stride)
    hmx flash-attn: p_tiles 듀얼 타일 OOB 레이스 수정; MT + 파이프라인 활성화
    hmx flash-attn: no-ALiBi 빠른 경로에서 가산 마스크 바이어스 유지
    no-ALiBi 빠른 경로 (max_bias==0) 는 마스크 값이 {0, -inf} 일 뿐이라고 가정하여 마스크 추가를 완전히 건너뛰었습니다. 이는 마스크가 가산 위치 정보를 담고 있을 때 틀린 것입니다.

AI 자동 생성 콘텐츠

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

원문 바로가기
3

댓글

0