MLIR Transformation

Dongho Park·2023년 7월 18일
0

Compiler

목록 보기
1/4

Reference Manual

최상위 변환작업

^bb0(%arg0: !transform.any_op, // 최상위 변환 연산에 필수
     %arg1: !transform.op<"linalg.matmul">,
     %arg2: !transform.op<"linalg.elemwise_binary">):
  • %arg: !transform.any_op : 핸들이 임의의 페이로드 연산과 연관
  • %arg1: !transform.op<"X"> : 핸들이 X 종류의 페이로드 연산과만 연관
  • %arg2: !transform.op<"linalg.elemwise_binary"> : 핸들이 "linalg.elemwise_binary" 연산과만 연관

Casting

syntax

:::= transform.cast %target : !transform.op<"target-op"> to !transform.op<"transformed-op">
  • target-op -> transformed-op

  • 연산이 두 유형 모두와 호환될시 한 유형을 다른 유형으로 캐스팅할 수 있음

example

%arg1 : %matmul -> %casted : any_op

%casted = transform.cast %arg1 : !transform.op<"linalg.matmul"> to !transform.any_op

%arg1 : %matmul -> %casted : %affine

Loop Tiling

transform.structured.tile_to_forall_op

reference

// 실제 타일링 변환은 타일 크기를 속성으로 사용
%loop, %tiled = transform.structured.tile_to_forall_op %arg1 tile_sizes [4, 32]
  : (!transform.op<"linalg.matmul">) -> (!transform.any_op, !transform.any_op)

matmul 연산을 타일링

  • %arg1 : "linalg.matmul"과 연관되어 있음

Split Handle

transform.split_handle

%add, %max = transform.split_handle %arg2
      : (!transform.op<"linalg.elemwise_binary">) -> (!transform.any_op, !transform.any_op)

linalg.elemwise_binary 를 두개의 핸들로 분할 (any_op, any_op)

Loop Fusion

transform.structured.fuse_into_containing_op

reference

  %loop_0, %tiled_add =
      transform.structured.fuse_into_containing_op %add into %loop
        : (!transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op)
profile
컴파일러에 관심이 많은 하드웨어 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 감사합니다!

답글 달기