[Triton] ds_read_tr + padded layout에서 vec size를 min interval로 제한
PR 링크: triton-lang/triton#8377 상태: Merged | 변경: +27 / -0
들어가며
AMD GPU의 ds_read_tr 명령어는 shared memory에서 transpose read를 수행한다. padded shared memory 레이아웃을 사용할 때, 벡터 크기가 padding 간격(min interval)보다 크면 padding 영역을 넘어서 잘못된 데이터를 읽게 된다. 이 PR은 벡터 크기를 padding 간격으로 제한한다.
핵심 코드 분석
After (MemoryOpToLLVM.cpp)
auto [elemsPerVec, permutation] =
largestVectorisation(ctx, cvt, bitwidth, needContigReg);
if (paddedEnc)
elemsPerVec = std::min<int>(elemsPerVec, paddedEnc.getMinInterval());
if (elemsPerVec != needContigReg)
return failure();
padded 인코딩이 존재하면 elemsPerVec를 minInterval과 비교하여 더 작은 값을 사용한다. 간격이 필요한 벡터 크기보다 작으면 ds_read_tr를 사용할 수 없으므로 fallback한다.
테스트 추가
// ds_transpose_with_padding - padding interval이 충분
// CHECK-COUNT-16: rocdl.ds.read.tr16.b64
// ds_transpose_padding_interval_too_small - interval이 너무 작음
// CHECK-NOT: rocdl.ds.read.tr16.b64
왜 이게 좋은가
- 정확성: padding 경계를 넘지 않는 안전한 벡터 로드 보장
- 자동 fallback: vec size가 불충분하면 자동으로 다른 전략 사용
- 테스트 커버리지: 성공/실패 양쪽 케이스를 모두 검증
정리
GPU의 shared memory 레이아웃은 bank conflict 방지를 위해 padding을 사용하는 경우가 많다. 벡터 로드의 크기가 이 padding과 조화를 이루어야 올바른 결과를 얻을 수 있다. 작은 std::min 한 줄이지만, 이런 경계 조건을 정확히 처리하는 것이 GPU 컴파일러의 핵심이다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석 내용은 실제 PR diff를 기반으로 합니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [SGLang] DeepSeek V3.2 지원 추가
- 현재글 : [Triton] ds_read_tr + padded layout에서 vec size를 min interval로 제한
- 다음글 [Triton] swizzling=0 matrix descriptor 지원과 WGMMA lowering 일반화
댓글