본문으로 건너뛰기

[Triton] AMD RDNA에서 matmul_ogs 설정 최적화 — 최대 46% 성능 향상

PR 링크: triton-lang/triton#8052 상태: Merged | 변경: +32 / -4

들어가며

Triton의 matmul_ogs(matmul with output group sizes) 커널은 기본 설정이 CDNA 아키텍처에 맞춰져 있었다. RDNA(Navi) GPU에서 batch size가 512를 초과하면 block_m이 너무 커서 심각한 레지스터 스필링이 발생했고, 이는 성능 저하로 이어졌다. 이 PR은 RDNA3/RDNA4 전용 블록 크기 설정을 추가하여 최대 46%의 throughput 향상을 달성한다.

핵심 코드 분석

Before (opt_flags.py)

if is_cdna4 and m >= 512:
    block_m = 128
else:
    block_m = max(32, min(triton.next_power_of_2(slice_size), 64))

RDNA에는 별도 분기가 없어 일반 경로를 따라 큰 block_m 값이 선택된다.

After (opt_flags.py)

if is_cdna4 and m >= 512:
    block_m = 128
elif get_rdna_version() in (3, 4) and m >= 512:
    block_m = 64
else:
    block_m = max(32, min(triton.next_power_of_2(slice_size), 64))

After (opt_flags_amd.py)

if get_rdna_version() in (3, 4) and block_m == 64:
    block_n = 256

if get_rdna_version() in (3, 4) and block_m == 64:
    block_k = 64

RDNA3/4에서 block_m=64, block_n=256, block_k=64의 조합으로 레지스터 사용량을 줄인다.

왜 이게 좋은가

  • 실측 성능: GPT-OSS 20B 모델 기준, Navi31에서 3.06 → 4.47 req/s(+46%), Navi48에서 5.63 → 6.66 req/s(+18%)
  • 아키텍처 감지: get_rdna_version() 함수를 신규 추가하여 gfx11*(RDNA3), gfx12*(RDNA4)를 자동 감지한다.
  • 최소 변경: 기존 CDNA 경로에 영향 없이, RDNA 전용 분기만 추가한다.

정리

GPU 컴파일러에서 블록 크기 튜닝은 단순해 보이지만 실제 워크로드에 큰 영향을 미친다. RDNA의 레지스터 파일 특성에 맞는 block_m=64 선택만으로 E2E 성능이 크게 개선되었다.

참고 자료


이 글은 AI 도구의 도움을 받아 작성되었습니다.

댓글

관련 포스트

PR Analysis 의 다른글