본문으로 건너뛰기

[triton] AMD ReorderInstructions에서 no-op sinkDotConversion 최적화 제거

PR 링크: triton-lang/triton#9139 상태: Merged | 변경: +0 / -22

들어가며

컴파일러 코드베이스에서 더 이상 효과가 없는 최적화 패스를 유지하는 것은 코드 복잡성만 높이고, 미래의 변경에서 혼란을 줄 수 있습니다. 이 PR은 AMD ReorderInstructions 패스에서 sinkDotConversion 최적화를 제거합니다.

핵심 코드 분석

Before (제거된 코드):

static void sinkDotConversion(triton::FuncOp funcOp) {
  DenseMap<Operation *, Operation *> opToMove;
  funcOp.walk([&](ttg::ConvertLayoutOp op) {
    Attribute encoding = op.getType().getEncoding();
    if (!isa_and_nonnull<ttg::DotOperandEncodingAttr>(encoding))
      return;
    if (!op->hasOneUse())
      return;
    Operation *user = *op->getUsers().begin();
    if (user->getParentOfType<scf::ForOp>() ==
        op->getParentOfType<scf::ForOp>())
      return;
    opToMove[op] = user;
  });
  for (auto &kv : opToMove)
    kv.first->moveBefore(kv.second);
}

이 코드는 DotOperandEncoding을 가진 ConvertLayoutOp을 사용자(dot 연산) 바로 앞으로 이동시켜 레지스터 압력을 줄이려는 최적화였습니다. 그러나 ReduceDataDuplication 패스가 이미 ConvertLayoutOplocal_load로 변환하므로, ReorderInstructions 실행 시점에는 대상 연산이 존재하지 않아 사실상 no-op이었습니다.

After:

void runOnOperation() override {
  ModuleOp m = getOperation();
  for (auto funcOp : m.getOps<triton::FuncOp>()) {
    // sinkDotConversion 호출 제거됨
    moveDownCoversion(funcOp);
    moveUpTranspose(funcOp);
    moveUpGlobalLoadInPrologue(funcOp);
  }
}

왜 이게 좋은가

Dead code 제거는 유지보수 비용을 절감합니다. 22줄의 코드와 관련 테스트가 제거되어, 향후 ReorderInstructions 패스를 수정할 때 불필요한 코드를 분석할 필요가 없어집니다. 파이프라인 순서 변경으로 인해 효과를 잃은 최적화를 적극적으로 정리하는 것은 건강한 코드베이스 관리의 좋은 사례입니다.

정리

  • sinkDotConversionReduceDataDuplication 후 no-op이 됨을 확인
  • 22줄의 dead code 및 관련 테스트 제거
  • ReorderInstructions 패스 간결화

참고 자료

이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글