본문으로 건너뛰기

[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 업데이트 필요
}

왜 이게 좋은가

  1. 아키텍처 정확성: gfx1250의 독립적인 async 카운터를 정확히 반영하여 TDM/레지스터 로드와의 불필요한 동기화를 제거합니다.
  2. 성능 최적화: 불필요한 wait을 제거하여 compute-memory 오버랩이 개선됩니다.
  3. 확장성: ISAFamily별 switch 구조로 향후 새 아키텍처 추가가 용이합니다.

정리

GPU 아키텍처마다 동기화 메커니즘이 다르며, 이를 정확히 반영하는 것이 성능의 핵심입니다. gfx1250의 독립 asynccnt는 더 세밀한 비동기 제어를 가능하게 합니다.

참고 자료


이 글은 AI(Claude)의 도움을 받아 작성되었으며, PR의 실제 diff를 기반으로 분석한 내용입니다.

댓글

관련 포스트

PR Analysis 의 다른글