본문으로 건너뛰기

[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 인코딩이 존재하면 elemsPerVecminInterval과 비교하여 더 작은 값을 사용한다. 간격이 필요한 벡터 크기보다 작으면 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

왜 이게 좋은가

  1. 정확성: padding 경계를 넘지 않는 안전한 벡터 로드 보장
  2. 자동 fallback: vec size가 불충분하면 자동으로 다른 전략 사용
  3. 테스트 커버리지: 성공/실패 양쪽 케이스를 모두 검증

정리

GPU의 shared memory 레이아웃은 bank conflict 방지를 위해 padding을 사용하는 경우가 많다. 벡터 로드의 크기가 이 padding과 조화를 이루어야 올바른 결과를 얻을 수 있다. 작은 std::min 한 줄이지만, 이런 경계 조건을 정확히 처리하는 것이 GPU 컴파일러의 핵심이다.

참고 자료


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

댓글

관련 포스트

PR Analysis 의 다른글