[triton] AMD: gfx1250에서 ttg.async_wait lowering 및 asynccnt 기반 동기화 구현
PR 링크: triton-lang/triton#8510 상태: Merged | 변경: +97 / -29
들어가며
AMD의 gfx1250 아키텍처에서 비동기 로드는 기존 CDNA의 vmcnt가 아닌 별도의 asynccnt 카운터를 사용합니다. 이는 레지스터 로드, TDM 로드와 독립적으로 완료될 수 있다는 뜻입니다. 이번 PR은 이 하드웨어 차이를 반영하여 async_wait의 lowering과 wait count 계산을 구현합니다.
핵심 코드 분석
Before: CDNA 전용 vmcnt 기반
// LoadStoreOpToLLVM.cpp
case ISAFamily::CDNA4: {
// vmcnt 사용 - 모든 비동기 연산이 같은 카운터
unsigned vmCnt = std::min(63u, op.getNum());
unsigned lowBits = vmCnt & 0xF;
unsigned highBits = vmCnt >> 4 << 14;
unsigned otherCnts = ~0xC00F;
unsigned waitValue = lowBits | highBits | otherCnts;
rewriter.create<ROCDL::SWaitcntOp>(loc, waitValue);
break;
}
After: gfx1250용 asynccnt 추가
// LoadStoreOpToLLVM.cpp
case ISAFamily::GFX1250: {
// gfx1250은 별도의 asynccnt 카운터 사용
unsigned asyncCnt = std::min(63u, op.getNum());
LLVM::createLLVMIntrinsicCallOp(rewriter, loc,
"llvm.amdgcn.s.wait.asynccnt", {},
{b.i16_val(asyncCnt)});
break;
}
UpdateAsyncWaitCount도 gfx1250 지원을 추가하고, TDM 로드를 무시하도록 수정:
// UpdateAsyncWaitCount.cpp
if (!isCDNA(targetInfo.getISAFamily()) &&
targetInfo.getISAFamily() != tt::AMD::ISAFamily::GFX1250) {
return; // gfx1250도 async wait count 업데이트 필요
}
왜 이게 좋은가
- 아키텍처 정확성: gfx1250의 독립적인 async 카운터를 정확히 반영하여 TDM/레지스터 로드와의 불필요한 동기화를 제거합니다.
- 성능 최적화: 불필요한 wait을 제거하여 compute-memory 오버랩이 개선됩니다.
- 확장성: ISAFamily별 switch 구조로 향후 새 아키텍처 추가가 용이합니다.
정리
GPU 아키텍처마다 동기화 메커니즘이 다르며, 이를 정확히 반영하는 것이 성능의 핵심입니다. gfx1250의 독립 asynccnt는 더 세밀한 비동기 제어를 가능하게 합니다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었으며, PR의 실제 diff를 기반으로 분석한 내용입니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [Grafana Loki] 쿼리 옵티마이저를 bottom-up에서 top-down 방식으로 리팩터링하여 중복 작업 제거
- 현재글 : [triton] AMD: gfx1250에서 ttg.async_wait lowering 및 asynccnt 기반 동기화 구현
- 다음글 [pydantic-ai] FastMCPToolset 추가 — FastMCP 기반 MCP 클라이언트 통합
댓글