^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" 연산과만 연관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
transform.structured.tile_to_forall_op
// 실제 타일링 변환은 타일 크기를 속성으로 사용
%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"
과 연관되어 있음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
)
transform.structured.fuse_into_containing_op
%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)
좋은 글 감사합니다!