[Triton] AMD GFX9에서 AsyncCopy shared layout order 수정
PR 링크: triton-lang/triton#9373 상태: Merged | 변경: +59 / -5
들어가며
AMD GFX9 아키텍처에서 async copy는 Global Memory에서 LDS(Local Data Share)로 데이터를 비동기적으로 복사한다. 이때 shared memory의 layout order가 잘못 설정되면 coalesced direct-to-LDS 쓰기가 불가능해져 성능이 크게 저하된다. 이 PR은 layout order 결정 시 사용하는 contiguity 계산 방식과 vector size clamping을 수정한다.
핵심 코드 분석
Before: 잘못된 contiguity 계산
auto contig = llEnc.getElemsPerThread(srcTy.getShape());
SetVector<unsigned> orderSet;
if (contig[regOrder[0]] > 1)
orderSet.insert(regOrder[0]);
orderSet.insert(threadOrder.begin(), threadOrder.end());
order = orderSet.takeVector();
getElemsPerThread는 스레드당 전체 요소 수를 반환하므로, 실제 메모리 연속성(contiguity)과 다를 수 있다.
After: 올바른 contiguity + 하드웨어 벡터 크기 clamp
auto regContig = llEnc.getContigPerThread()[regOrder[0]];
unsigned elemBitWidth = srcTy.getElementType().getIntOrFloatBitWidth();
unsigned finalRegContig =
fitToValidDirectToLdsVecSize(regContig, elemBitWidth, targetInfo);
// 하드웨어가 지원하는 벡터 크기인 경우에만 order 변경
if (finalRegContig > 0) {
if (finalRegContig > 1)
orderSet.insert(regOrder[0]);
orderSet.insert(threadOrder.begin(), threadOrder.end());
order = orderSet.takeVector();
}
변경 포인트:
getElemsPerThread->getContigPerThread: 실제 연속 접근 가능한 요소 수를 사용fitToValidDirectToLdsVecSize로 하드웨어가 지원하는 벡터 크기로 clamp- 유효한 벡터 크기가 없으면 order 변경을 하지 않음
왜 이게 좋은가
- 정확한 contiguity 정보 사용:
getContigPerThread는 메모리에서 실제로 연속인 요소 수를 반환하므로, 올바른 vectorization 판단이 가능하다. - 하드웨어 호환성 보장:
fitToValidDirectToLdsVecSize를 통해 GFX9가 지원하는 direct-to-LDS 벡터 크기만 허용한다. - 안전한 fallback: 유효한 벡터 크기가 없으면 order를 변경하지 않아, 최소한 기존 동작을 보장한다.
정리
이 PR은 AMD GFX9에서 async copy의 shared layout order 결정 로직을 수정했다. getContigPerThread로 정확한 연속성 정보를 사용하고, 하드웨어가 지원하는 벡터 크기로 clamp하여 coalesced direct-to-LDS 쓰기를 보장한다. 관련 lit 테스트도 추가되었다.
참고 자료
이 글은 AI를 활용하여 PR의 핵심 변경사항을 분석하고 정리한 것입니다. 실제 코드의 맥락은 원본 PR을 참고해 주세요.
관련 포스트
PR Analysis 의 다른글
- 이전글 [pydantic-ai] Bedrock CachePoint가 여러 trailing 문서 사이에 잘못 배치되는 버그 수정
- 현재글 : [Triton] AMD GFX9에서 AsyncCopy shared layout order 수정
- 다음글 [Loki] 대소문자 무시 정규식을 바이너리 연산자로 최적화
댓글