본문으로 건너뛰기

[Triton] LLVM Debug Information에서 커널 인자 누락 수정

PR 링크: triton-lang/triton#9002 상태: Merged | 변경: +381 / -166

들어가며

GPU 커널 디버깅에서 LLVM debug information은 변수 이름, 타입, 소스 위치를 추적하는 데 필수적이다. Triton에서 triton::PointerTypeLLVM::LLVMPointerType으로 변환될 때 pointee 타입 정보가 유실되어, 디버그 정보에서 커널 인자가 올바르게 표현되지 않는 버그가 있었다.

핵심 코드 분석

Pointee 타입 보존 (FuncOpToLLVM.cpp)

After:

static void handleArgPtrDatatype(triton::FuncOp funcOp,
                                  LLVM::LLVMFuncOp &llvmFuncOp) {
    FunctionType fty = funcOp.getFunctionType();
    for (unsigned i = 0; i < fty.getNumInputs(); ++i) {
        auto argType = fty.getInput(i);
        if (auto argPtrType = dyn_cast<triton::PointerType>(argType)) {
            auto argDType = argPtrType.getPointeeType();
            llvmFuncOp.setArgAttr(i, "tt.pointee_type",
                                  mlir::TypeAttr::get(argDType));
        }
    }
}

변환 시 포인터 인자의 pointee 타입을 tt.pointee_type attribute로 보존한다.

서브루틴 타입 생성 개선

기존에는 빈 DISubroutineTypeAttr만 생성했지만, 이제 함수의 반환 타입과 인자 타입 정보를 포함하여 디버거가 함수 시그니처를 올바르게 표시할 수 있다.

왜 이게 좋은가

  1. 디버거 지원: cuda-gdbrocgdb에서 커널 인자의 타입과 이름을 정확하게 확인 가능
  2. 타입 정보 보존: PointerType → LLVMPointerType 변환 시 유실되던 정보 복구
  3. 코드 정리: 중복된 타입 변환 로직을 LLVMDIUtils로 분리하여 재사용

정리

디버그 정보는 프로덕션 성능에 영향을 주지 않으면서 개발자의 생산성을 크게 높인다. 특히 GPU 커널처럼 디버깅이 어려운 환경에서는 정확한 변수 추적이 필수적이다. 이 PR은 381줄을 추가하지만, 그 대부분은 정확한 타입 매핑과 유틸리티 분리에 투자된다.

참고 자료


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

댓글

관련 포스트

PR Analysis 의 다른글